3d 透视投影-如何投影位于';照相机';?
我正在用Java编写我自己的软件光栅化程序,我遇到了一些麻烦。。。请看一张示例图像: 此示例仅在平面上绘制简单的方形网格。一切正常,直到我把相机移得足够近,让一些点移到后面。之后,它们不再正确投影,如您所见(垂直线-应该在相机后面的点投影在屏幕顶部) 我的变换矩阵和向量与DirectX使用的变换矩阵和向量相同(透视用于投影,透视用于相机) 我使用以下变换方法投影三维点:3d 透视投影-如何投影位于';照相机';?,3d,geometry,camera,projection,perspective,3d,Geometry,Camera,Projection,Perspective,我正在用Java编写我自己的软件光栅化程序,我遇到了一些麻烦。。。请看一张示例图像: 此示例仅在平面上绘制简单的方形网格。一切正常,直到我把相机移得足够近,让一些点移到后面。之后,它们不再正确投影,如您所见(垂直线-应该在相机后面的点投影在屏幕顶部) 我的变换矩阵和向量与DirectX使用的变换矩阵和向量相同(透视用于投影,透视用于相机) 我使用以下变换方法投影三维点: 将创建要变换的三维矢量 向量乘以视图投影矩阵 然后,使用以下方法将点转换为屏幕: // 'vector' is input
// '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);
Alex您需要在三维空间中将直线与前剪裁平面相交并截断直线,以便只绘制可见的线段:
|
|
|
x------------+-----------o
|
|
| * - camera
|
|
|
clipping plane
在剪裁平面前面有一行xo
,其中x
,后面有一行o
。将此线与剪裁平面相交以生成点+
。你知道哪个x
和o
是可见的,所以从x
到+
划一条线
这样,您就不会投影相机后面的点。您是否正确设置了相机的前剪裁平面?然后在渲染时将其考虑在内?My zNear plane设置为1,zFar plane设置为1000个单位。我已尝试更改值,但问题仍然存在。有什么建议吗?我做这类事情已经有一段时间了,但是在投影直线之前,你需要与前面的剪裁平面相交。谢谢。在剪辑空间中,透视变换之后,透视分割之前(使用齐次坐标和w),这样做可以吗?