Project 3D指向2D屏幕坐标

时间:2015-12-23 21:23:54

标签: java math 3d 2d projection

我试图将一个点从3D世界空间投射到2D屏幕坐标。我几乎所有的事情都解决了,但我很难实际预测这一点。

设置如下:

  

音高= 90(一路向上,往下看)

     

偏航= 0(朝北)

     

Roll = 0(正常)

我目前正在从摄影机位置穿过视口中心一直到视锥体的末端投射光线, 调试光线时,值为0,-1,0,这意味着它面朝下,所以这似乎是正确的。现在我想要实现的是将固定的摄像机点(光线中间的点)从3D投影到2D。

旋转相机时,投影点应位于视口的中心,不幸的是,这不是。

当前输出:

Viewport 800 x 600

projectTo2D: vector: Vector4f: 0.0 0.0 500.0 1.0
World matrix:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0

View matrix:
0.99999994 0.0 0.0 0.0
0.0 -4.371139E-8 -1.0 2.1855694E-5
0.0 1.0 -4.371139E-8 -500.0
0.0 0.0 0.0 1.0

Projection matrix:
-0.75 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0000999 -0.10000999
0.0 0.0 1.0 0.0

Projection world view:
-0.74999994 0.0 0.0 0.0
0.0 -4.371139E-8 -1.0 2.1855694E-5
0.0 1.0000999 -4.3715755E-8 -500.14996
0.0 1.0 -4.371139E-8 -500.0

HDC: Vector4f: 0.0 -499.99997 -500.15 -500.00003
NDC: Vector4f: -0.0 0.9999999 1.0002999 1.0
Viewport coordinates: 400.0, 599.99994

1 个答案:

答案 0 :(得分:1)

首先,您正在投影一个普通的3d矢量。这样做,您将忽略矩阵的平移和透视部分。使用1作为w - 组件的4d向量。

其次,你错过了W-clip:

transform(matrix, vector);

vector.x /= vector.w;
vector.y /= vector.w;
vector.z /= vector.w;
vector.w /= vector.w;