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

3d 使用透视摄影机矩阵将三维点投影到二维屏幕空间,3d,matrix,camera,projection,perspective,3d,Matrix,Camera,Projection,Perspective,我正在尝试使用透视相机矩阵将一系列3D点投影到屏幕上。我没有世界空间(或者认为它是一个身份矩阵),我的相机没有相机空间(或者考虑它是一个身份矩阵),我的对象空间确实有一个4x4矩阵。 我获取对象矩阵并将其乘以摄影机透视矩阵,使用以下方法生成: Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far ) { Float fov2 = (fov/2) * (Math.PI/180);

我正在尝试使用透视相机矩阵将一系列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乘以这些值,然后将相同的值加到相应的点上

任何一步一步告诉我如何实现这一目标,或者我在这方面可能会出什么问题,我都将不胜感激!!:D

向大家问好

注意:在身份/翻译矩阵示例中,我的模型中的矩阵格式为:

[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]

您的问题是您忘记执行透视分割

透视分割意味着将点的x、y和z分量除以其w分量。 这是将点从同质4D空间转换为标准化设备坐标系(NDCS)所必需的,其中每个组件x、y或z位于-1和1之间,或0和1之间

完成此转换后,可以进行视口转换(将点乘以屏幕宽度、高度等)

Foley的书(计算机图形学:C语言的原理和实践)中很好地展示了这种转换管道,您可以在这里看到:


对于像这样的问题,我建议提供一个非常好的参考资料:
它实际上涉及到了投影矩阵的细节。它们是关于相机、构造相机光线等主题的更多课程。你需要做一些挖掘。

很抱歉让死者和所有人复活。。。但是在您的
createPerspectiveMatrix
代码中,不应该
matrix.m32=1.0
matrix.m33=0.0
?如果这本来是一个“填充”的身份矩阵,那么这些值在代码中似乎是交换的。谢谢,因为我问了这个问题,所以我写了Zest3D,所以我想出来了。:)