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

时间:2010-09-08 17:26:25

标签: 3d matrix camera projection perspective

我试图使用透视相机矩阵将一系列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,并将相同的值添加到相应的点。 / p>

任何一步一步地告诉我如何实现这一目标或者我可能会遇到任何问题的地方都会受到大力赞赏! :d

祝大家好评!

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

对于像这样的问题,我建议一个很好的资源: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ 它真正涉及投影矩阵的细节。他们是关于相机,构建相机光线等课程的更多课程。你需要做一些挖掘。