【发布时间】:2010-07-25 13:16:42
【问题描述】:
我正在用 Java 编写自己的软件光栅化器,但遇到了一些麻烦...请看一下示例图像:
这个示例只是在平面上绘制简单的方形网格。一切正常,直到我将相机移动得足够近以使某些点移动到它后面。之后,它们不再正确投影,如您所见(垂直线 - 应该在相机后面的点被投影在屏幕顶部)。
我的变换矩阵和向量与 DirectX 使用的相同(PerspectiveFovLH 用于投影,LookAtLH 用于相机)。
我正在使用以下变换方法来投影 3D 点:
- 要转换的 3D 矢量已创建。
- 向量乘以 ViewProjection 矩阵。
-
之后,使用以下方法将点转换为屏幕:
// '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);
正如我之前所说,它可以正常工作,直到点移动到相机后面。事实是,我可以确定该点何时位于相机后面(通过在最终变换后测试它的 Z 值),但由于我正在绘制线条和其他基于线条的对象,所以我不能跳过那个点。
然后我尝试根据 MSDN 上的Direct3D 转换管道文章设置我的转换管道。
不幸的是,我也没有任何运气(相同的结果),所以任何帮助将不胜感激,因为我有点卡在这个问题上。
谢谢。
最好的问候, 亚历克斯
【问题讨论】:
-
您是否正确设置了相机的前剪裁平面?然后在渲染的时候考虑进去?
-
我的 zNear 平面设置为 1,zFar 平面设置为 1000 个单位。我尝试更改值,但问题仍然存在。有什么建议吗?
-
我已经有一段时间没有做这种事情了,但是您需要在投影线之前执行与前剪切平面的相交。
标签: 3d geometry camera projection perspective