小编Ale*_*lex的帖子

透视投影 - 如何投影"相机"背后的点?

我正在用Java编写我自己的软件光栅化器,我遇到了一些问题...请看一下示例图片,请:

图片

此示例仅在平面上绘制简单的方形网格.一切正常,直到我移动相机足够接近某些点移动它.之后,正如您所看到的那样,它们不再正确投影(垂直线 - 应该在摄像机后面的点投影在屏幕顶部).

我的转换矩阵和向量与DirectX使用的相同(PerspectiveFovLH用于投影,LookAtLH用于相机).

我正在使用以下转换方法来投射3D点:

  1. 创建要转换的3D矢量.
  2. 矢量乘以ViewProjection矩阵.
  3. 之后,使用以下方法将点转换为屏幕:

    // 'vector' is input vector in projection space
    // projection to screen
    double vX = vector.x / vector.z;        
    double vY = vector.y / vector.z;
    
    //translate
    //surfaceW is width and surfaceH is height of the rendering window.
    vX = (( vX + 1.0f) / 2.0f) * surfaceW;
    vY = ((-vY + 1.0f) / 2.0f) * surfaceH;
    
    return new Vector3(vX, vY, vector.z);
    
    Run Code Online (Sandbox Code Playgroud)

正如我之前所说,它可以正常工作,直到点移动到相机后面.事实上,我可以弄清楚当点位于相机后面时(通过在最终变换后测试它的Z值),但由于我正在绘制线条和其他基于线的对象,我不能只是跳过这一点.

然后我尝试根据MSDN上的Direct3D Transformation Pipeline文章设置我的转换管道.

不幸的是,我也没有任何运气(相同的结果),所以任何帮助都会受到高度赞赏,因为我有点卡在这一点上.

谢谢.

最诚挚的问候,Alex

3d geometry camera projection perspective

9
推荐指数
1
解决办法
3607
查看次数

为什么编译器推断var是动态的而不是具体的类型?

鉴于这个简短的示例程序:

    static void Main(string[] args)
    {
        Console.WriteLine(Test("hello world"));
    }

    private static int Test(dynamic value)
    {
        var chars = Chars(value.ToString());
        return chars.Count();
    }

    private static IEnumerable<char> Chars(string str)
    {
        return str.Distinct();
    }
Run Code Online (Sandbox Code Playgroud)

运行时,它会产生类似于的异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''object' does not contain a definition for 'Count''

含义编译器选择dynamic作为首选类型的chars变量.

有没有理由不选择IEnumerable<char>具体类型,考虑动态不是从Chars方法返回的?只是手动更改类型以IEnumerable<char>解决问题,但我想知道为什么dynamic在这种情况下是默认值?

编辑

我可能使用了比必要更复杂的例子.似乎这里提出的问题是:

使用'var'和'dynamic'时的异常

提供更简洁的示例和一些有关其工作方式的见解.

https://blogs.msdn.microsoft.com/ericlippert/2012/11/05/dynamic-contagion-part-one/

描述编译器如何处理动态.

c#

7
推荐指数
1
解决办法
171
查看次数

标签 统计

3d ×1

c# ×1

camera ×1

geometry ×1

perspective ×1

projection ×1