我用Blender创建了一个3D场景并计算了投影矩阵 P (还有关于翻译 T 的信息 - 和旋转矩阵 - [R )。 就像我在标题中提到的那样,我尝试使用这些矩阵计算我给定相机 C 的顶点(x,y,z)的z值或深度。
实施例: 顶点 v = [1.4,1,2.3]并且摄像机的位置 c = [0,-0.7,10]。结果应该是10-2.3 = 7.7左右。谢谢你的帮助!
答案 0 :(得分:1)
感谢您的帮助,以下是我的目的:
vec4 = R * T * v
vec4.z 值是我要找的结果。谢谢!
答案 1 :(得分:0)
通常在翻译之前应用旋转矩阵。所以
transform = R * T
*
是矩阵乘法,首先应用T,然后应用R 当然我假设你已经知道如何执行矩阵乘法,我没有提供任何代码,因为不清楚你是否需要python片段或者你正在使用导出的模型。
之后,您应用最终投影矩阵(假设您的投影矩阵已经乘以视图矩阵,我就是这样)
final = P * transform
transform
是您之前获得的(4行和4列)矩阵 final
矩阵将转换3D模型的每个向量,再次在这里进行矩阵乘法(但在这种情况下,第二个操作数是第4个元素为{{1}的列向量})
1
transformedVertex = final * Vec4(originalVertex,1)
是列向量(4x1矩阵)transformedVertex
是最终矩阵(4x4)final
来制作它(4x1)1
仍然是矩阵乘法一旦转换了顶点*
值,就会直接映射到Z缓冲区并进入深度值。
此时有一项操作按照惯例完成"并且将Z除以W以对其进行归一化,然后丢弃范围[0..1]之外的值(最接近剪裁平面或距离远剪裁平面最近)。
另见这个问题: Why do I divide Z by W?
修改强>
我可能误解了你的问题,如果你需要相机和点之间的距离,那就是
Z
例如
function computeDistance( cam, pos)
dx = cam.x-pos.x
dy = cam.y-pos.y
dz = cam.z-pos.z
distance = sqrt( dx*dx + dy*dy + dz*dz)
end function
以上代码
cameraposition = 10,0,0
vertexposition = 2,0,0
输出
computeDistance ( cameraposition, vertexposition)