使用给定的投影矩阵计算顶点的 z-Value(到相机的距离)

Compute z-Value (Distance to Camera) of Vertex with given Projection Matrix

我用 Blender 创建了一个 3D 场景并计算了投影矩阵 P(还有关于翻译的信息 T-和 Rotation-Matrix R)。 就像我在标题中提到的那样,我尝试使用这些矩阵从给定的相机 C 计算 z-Value 或到顶点 (x,y,z) 的深度。

示例: 顶点 v = [1.4,1,2.3] 和相机位置 c = [0,-0.7,10]。结果应该是 10-2.3 = 7.7 左右。感谢您的帮助!

通常在平移之前应用旋转矩阵。所以

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)

transformedVertex = final * Vec4(originalVertex,1)
  • transformedVertex是列向量(4x1矩阵)
  • final 是最终矩阵 (4x4)
  • 一个顶点只有 3 个坐标,所以我们添加 1 使其成为 (4x1)
  • *还是矩阵乘法

一旦变换顶点 Z 值就是直接映射到 Z 缓冲区并转换为深度值的值。

此时有一个操作已完成 "by convention" 并且将 Z 除以 W 以对其进行归一化,然后丢弃范围 [0..1] 之外的值(最近的比近的裁剪平面或最远的比远裁剪平面)。

另见这个问题: Why do I divide Z by W?

编辑:

我可能误解了你的问题,如果你需要相机和一个点之间的距离,它很简单

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)

产出

8

感谢您的帮助,这是我要找的:

数据设置

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

结果

  • vec4 向量 4x1 (x,y,z,w)

vec4 = R * T * v

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