我试图使用透视相机矩阵将一系列3D点投影到屏幕上。我没有世界空间(或者将其视为单位矩阵),我的相机也没有相机空间(或者将其视为单位矩阵),但我有一个4x4的物体空间矩阵。
我正在将物体矩阵乘以相机透视矩阵,该矩阵是通过以下方法生成的:
我将使用透视矩阵和物体矩阵的乘积,将我的点[x,y,z,1]相乘。
接下来,我有些困惑,我认为需要将这些点限制在-1和1之间或0和1之间。如果是第一组值,则分别将屏幕宽度和高度乘以点的x和y坐标值,否则将值乘以屏幕高度/2和宽度/2,并将相同的值添加到相应的点上。
如果您能提供详细步骤或指出我可能出错的地方,我将不胜感激!
最好的问候!
附:在一个恒等/平移矩阵的例子中,我的模型矩阵格式如下:
我正在将物体矩阵乘以相机透视矩阵,该矩阵是通过以下方法生成的:
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.0
和matrix.m33 = 0.0
不应该交换吗?如果最初意图是创建一个 "填充" 身份矩阵,那么这些值在你的代码中似乎是被交换了。 - RectangleEquals