使用给定的投影矩阵计算顶点的 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值就是我要找的结果。谢谢!
我用 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值就是我要找的结果。谢谢!