使用透视相机矩阵将三维点投影到二维屏幕空间

7
我试图使用透视相机矩阵将一系列3D点投影到屏幕上。我没有世界空间(或者将其视为单位矩阵),我的相机也没有相机空间(或者将其视为单位矩阵),但我有一个4x4的物体空间矩阵。
我正在将物体矩阵乘以相机透视矩阵,该矩阵是通过以下方法生成的:
Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far )
{
    Float fov2 = (fov/2) * (Math.PI/180);
    Float tan = Math.tan(fov2);
    Float f = 1 / tan;

    return new Matrix4 ( 
        f/aspect, 0, 0, 0,
        0, f, 0, 0,
        0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far),
        0, 0, 1, 0 
    );
}

我将使用透视矩阵和物体矩阵的乘积,将我的点[x,y,z,1]相乘。
接下来,我有些困惑,我认为需要将这些点限制在-1和1之间或0和1之间。如果是第一组值,则分别将屏幕宽度和高度乘以点的x和y坐标值,否则将值乘以屏幕高度/2和宽度/2,并将相同的值添加到相应的点上。
如果您能提供详细步骤或指出我可能出错的地方,我将不胜感激!
最好的问候!
附:在一个恒等/平移矩阵的例子中,我的模型矩阵格式如下:
[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]

抱歉再次提及过去的问题…但是在你的 createPerspectiveMatrix 代码中,matrix.m32 = 1.0matrix.m33 = 0.0 不应该交换吗?如果最初意图是创建一个 "填充" 身份矩阵,那么这些值在你的代码中似乎是被交换了。 - RectangleEquals
谢谢,自从我问了这个问题后,我写了Zest3D http://www.zest3d.com,所以我解决了它。 :) - Gary Paluk
2个回答

6
你的问题在于你忘记进行透视除法。
透视除法意味着你需要将点的x、y和z分量除以它的w分量。这是将你的点从齐次4D空间转换到标准化设备坐标系(NDCS)所必需的,其中每个分量x、y或z都落在-1和1之间,或者0和1之间。
在进行这种转换后,你可以进行视口变换(通过屏幕宽度、高度等来乘以点数)。
在Foley的书(计算机图形学:C语言基础与技术)中,有一个很好的转换流水线视图,你可以在这里看到:http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接