我正在用Java编写我自己的软件光栅化器,我遇到了一些问题...请看一下示例图片,请:
此示例仅在平面上绘制简单的方形网格.一切正常,直到我移动相机足够接近某些点移动它.之后,正如您所看到的那样,它们不再正确投影(垂直线 - 应该在摄像机后面的点投影在屏幕顶部).
我的转换矩阵和向量与DirectX使用的相同(PerspectiveFovLH用于投影,LookAtLH用于相机).
我正在使用以下转换方法来投射3D点:
之后,使用以下方法将点转换为屏幕:
// '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
鉴于这个简短的示例程序:
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在这种情况下是默认值?
编辑
我可能使用了比必要更复杂的例子.似乎这里提出的问题是:
提供更简洁的示例和一些有关其工作方式的见解.
https://blogs.msdn.microsoft.com/ericlippert/2012/11/05/dynamic-contagion-part-one/
描述编译器如何处理动态.