【发布时间】:2015-07-26 08:12:23
【问题描述】:
我用 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 左右。感谢您的帮助!
【问题讨论】:
我用 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 左右。感谢您的帮助!
【问题讨论】:
通常在平移之前应用旋转矩阵。所以
transform = R * T
* 是矩阵乘法,先应用 T,然后应用 R当然我假设你已经知道如何执行矩阵乘法,我没有提供任何代码,因为不清楚你是否需要 python sn-p 或者你正在使用其他导出模型。
然后你应用最终的投影矩阵(我假设你的投影矩阵已经乘以视图矩阵)
final = P * transform
transform是你之前得到的(4行4列)矩阵final 矩阵将转换 3D 模型的每个向量,在这里您再次进行矩阵乘法(但在这种情况下,第二个操作数是列向量,第四个元素是 1)
transformedVertex = final * Vec4(originalVertex,1)
transformedVertex 是一个列向量(4x1 矩阵)final 是最终矩阵 (4x4)1 使其成为 (4x1)* 仍然是矩阵乘法一旦将顶点Z 值转换为直接映射到Z 缓冲区并转换为深度值的值。
此时有一个“按惯例”完成的操作,将 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
【讨论】:
感谢您的帮助,这就是我要找的东西:
vec4 = R * T * v
vec4.z 值是我正在寻找的结果。谢谢!
【讨论】: