使用透视相机矩阵将3D点投影到2D屏幕空间

Projecting a 3D point to 2D screen space using a perspective camera matrix

我正在尝试使用透视相机矩阵将一系列三维点投射到屏幕上。我没有世界空间(或认为它是一个身份矩阵),我的相机没有相机空间(或认为它是一个身份矩阵),我的对象空间有一个4x4矩阵。

我将获取对象矩阵,并将其与相机透视矩阵相乘,生成方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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值的屏幕宽度和高度,或者用屏幕坐标x和y值分别乘以这些值。n高度/2和宽度/2,并向各自的点添加相同的值。

任何一步一步地告诉我这是如何实现的,或者我在哪里可能会出错,这将是非常感谢!!D

向大家致以最诚挚的问候!

P.S.在标识/翻译矩阵的示例中,我的模型中的矩阵格式为:

1
2
3
4
[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]


你的问题是你忘了执行透视划分。

透视划分意味着您将点的X、Y和Z分量除以其W分量。这是将点从均匀4d空间转换为标准化设备坐标系统(NDC)所必需的,其中每个分量x、y或z都在-1和1之间,或0和1之间。

在转换之后,您可以进行视区转换(将点乘以屏幕宽度、高度等)。

Foley的书(计算机图形学:C语言中的原理和实践)中有一个很好的视角,你可以在这里看到:

网址:http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html


对于像这样的问题,我建议您提供一个优秀的资源:http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-正交投影矩阵/它实际上涉及到投影矩阵的细节。它们是关于照相机、构造照相机光线等主题的更多课程。您需要进行一些挖掘。