【问题标题】:Compute z-Value (Distance to Camera) of Vertex with given Projection Matrix使用给定的投影矩阵计算顶点的 z 值(到相机的距离)
【发布时间】: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 左右。感谢您的帮助!

【问题讨论】:

    标签: matrix depth


    【解决方案1】:

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

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

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

    然后你应用最终的投影矩阵(我假设你的投影矩阵已经乘以视图矩阵)

    final = P * transform
    
    • P 为投影矩阵(4 行 4 列)
    • transform是你之前得到的(4行4列)矩阵

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

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

    【讨论】:

      【解决方案2】:

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

      数据设置

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

      结果

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

      vec4 = R * T * v

      vec4.z 值是我正在寻找的结果。谢谢!

      【讨论】:

      • 没问题 ;)。感谢您接受我的回答并欢迎使用 stackoverflow :)
      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2015-04-11
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多