webgl 裁剪空间 投影矩阵 透视除法 Z值反转的讲解
右手坐标系Z值转换为深度值的过程理解
透视投影的输出结果一屏幕方向理解,朝向屏幕里为1,屏幕朝外为-1,投影矩阵的裁剪是剔除Z值不在-1到1区间的坐标,
此时的-1 和深度缓冲的0对应,1和深度缓冲的1对应。
此时鼠标点击的位置求一条世界坐标的射线,因为法线在转换中的为题,我们不使用法线,定义两个点,
//也就是说此时,最靠近屏幕外侧的点是裁剪空间下的-1, 同理被遮挡的点是因为深度缓冲大,最大值为1,z=1是最靠近屏幕里的值;
let rayStart = new vector.VFVector3(mouseDown.x, mouseDown.y, -1);
let rayEnd = new vector.VFVector3(mouseDown.x, mouseDown.y, 1);
//求相机的逆矩阵 这里使用了两个矩阵
let inverseCamera = cameraProj.leftMulMat4(cameraProj).inverse();
rayStart = inverseMat.leftMulVec3(rayStart);
rayEnd = inverseMat.leftMulVec3(rayEnd);
//鼠标点击的位置射线为
let hitRay = new ray.VFRay(rayOrigin, rayEnd.min(rayStart ).direction());