2010-09-08 200 views
6

我正在尝试使用透视相机矩阵将一系列3D点投影到屏幕上。我没有世界空间(或者认为它是一个单位矩阵),我的相机没有相机空间(或者认为它是一个单位矩阵),我的物体空间确实有4x4矩阵。使用透视相机矩阵将3D点投影到2D屏幕空间

我拍摄所述物体矩阵和由照相机透视矩阵,用以下的方法生成的相乘:

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

祝大家好!

P.S.在身份/翻译矩阵的例子,在我的模型我的矩阵格式是:

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

那么,这是否有效? :) – Stringer 2010-09-26 01:13:04

+0

不好意思把死人和所有......但在你的'createPerspectiveMatrix'代码中,不应该'matrix.m32 = 1.0'和'matrix.m33 = 0.0'?如果这原本是为了“填充”身份矩阵,那么这些值似乎在您的代码中被交换。 – RectangleEquals 2014-06-06 20:05:23

+0

谢谢,因为我问了这个问题,我写了Zest3D http://www.zest3d.com,所以我想通了。 :) – 2014-06-08 03:23:48

回答

5

你的问题是,你忘了执行透视除法。

透视分区意味着你可以用你的w分量来划分你的点的x,y和z分量。 这是必需的从均相4D改变你的点空间归一化设备坐标系统(NDCS),其中每个分量x,Y或Z -1和1,或0和1

后介于这个转换,你可以做你的视口转换(通过屏幕宽度乘以点,heigth等)。

有这个转换管道的Foley的书一个很好的观点(计算机图形学:原理和用C练习),你可以在这里看到:

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