【发布时间】:2014-03-05 02:06:41
【问题描述】:
一般的Ray拾取过程如下(实验结果证明是正确的):
-
将屏幕点转换为标准化的设备空间方向向量:
float x = (2.0f * mouse_x) / width - 1.0f; float y = 1.0f - (2.0f * mouse_y) / height; float z = 1.0f; vec3 ray_nds = vec3 (x, y, z); -
将方向向量转换为齐次剪辑坐标
vec4 ray_clip = vec4 (ray_nds.xy, -1.0, 1.0); -
将方向向量转换为眼睛空间方向向量
vec4 ray_eye = inverse (projection_matrix) * ray_clip; 将方向向量转换到世界空间,得到一个带有世界空间相机位置和方向向量的拾取射线
我的问题是,在标准化设备空间中,为什么方向向量的 z 分量是 1.0? 我的意思是,在OpenGL规范化的设备空间中,xyz分量应该都在-1~1的范围内,所以相机应该在平面z=-1的中心。所以方向向量应该是:view target position - camera position,z分量应该是1-(-1)=2.0f。 (在 DirectX 归一化设备空间中,xy 分量在 -1~1 范围内,z 分量在 0~1 范围内,相机位置应该在平面 z=0 的中心,例如,(0, 0,0),方向向量的z分量应该是1-0=1)
【问题讨论】: