使用给定的投影矩阵

时间:2015-07-26 08:12:23

标签: matrix depth

我用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左右。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

感谢您的帮助,以下是我的目的:

数据设置

  • R 旋转矩阵4x4
  • T 翻译矩阵4x4
  • v [x,y,z,1] 4x1
  • 中的任何顶点

结果

  • vec4 vector 4x1(x,y,z,w)
  

vec4 = R * T * v

vec4.z 值是我要找的结果。谢谢!

答案 1 :(得分:0)

通常在翻译之前应用旋转矩阵。所以

transform = R * T 
  • R是旋转矩阵(通常为4行和4列)
  • T是翻译矩阵(4行和4列)
  • *是矩阵乘法,首先应用T,然后应用R

当然我假设你已经知道如何执行矩阵乘法,我没有提供任何代码,因为不清楚你是否需要python片段或者你正在使用导出的模型。

之后,您应用最终投影矩阵(假设您的投影矩阵已经乘以视图矩阵,我就是这样)

final = P * transform
  • P是投影矩阵(4行和4列)
  • transform是您之前获得的(4行和4列)矩阵

final矩阵将转换3D模型的每个向量,再次在这里进行矩阵乘法(但在这种情况下,第二个操作数是第4个元素为{{1}的列向量})

1
  • transformedVertex = final * Vec4(originalVertex,1) 是列向量(4x1矩阵)
  • transformedVertex是最终矩阵(4x4)
  • 一个顶点是on3坐标,所以我们添加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)