将单位立方体转换为平截头体

时间:2013-11-12 14:31:45

标签: opengl matrix transformation

我发现这个example关于如何通过非仿射变换将单位立方体变换为平截头体(截头金字塔)。我需要一个矩阵,可以推送到我的矩阵堆栈,为我做转换。怎么可以这个计算

x' = (M11•x + M21•y + M31•z + OffsetX) ÷ (M14•x + M24•y + M34•z + M44)
y' = (M12•x + M22•y + M32•z + OffsetY) ÷ (M14•x + M24•y + M34•z + M44)
z' = (M13•x + M23•y + M33•z + OffsetZ) ÷ (M14•x + M24•y + M34•z + M44)

用单个矩阵表示?有可能吗?

现在我使用逆投影矩阵将单位立方体转换为平截头体,但每当我想要选择某些东西时,我必须将每个3d点除以w。

2 个答案:

答案 0 :(得分:2)

表示这些方程的均匀矩阵就是

       [ M11 M12 M13 M14 ]          [ 1 0 0 0 ]
  M =  [ M21 M22 M23 M24 ]  ,  M0 = [ 0 1 0 0 ]
       [ M31 M32 M33 M34 ]          [ 0 0 1 0 ]
       [ M41 M42 M43 M44 ]          [ 0 0 1 0 ]

您可以简单地将多维数据集的模型数据D与其相乘以获得截断的金字塔,以及继续与其他矩阵堆叠,例如相机+投影:

 ((M * D) * V ) * P;

没有必要担心'w'的划分 - 使用4x4矩阵推迟到光栅化器的最后阶段。

这里的M0是最简单的投影矩阵:但是要利用它,你必须首先沿着z轴转动你的立方体,使其远离相机,乘以M0并将其转换回它的原点。定义转换矩阵T.

       [ 1 0 0 0 ]
  T =  [ 0 1 0 0 ]
       [ 0 0 1 4 ]
       [ 0 0 0 0 ]

然后(D * T * M0 *( - T))是一个截断的金字塔,刚刚经过透视变换,好像它的中心距离原点4个单位。

(免责声明:在opengl m43中很可能是-1)

答案 1 :(得分:0)

要计算矩阵,最好选择已经实现的数学库。矩阵通常由projection_matrix * vies_matrix * world_transform_matrix组成。可以使用GLM等库创建所有三个矩阵,其用法为:

glm::perspective(..args...) * glm::lookAt(..args..) * object_transformation

在您的情况下,您可以忽略lookAtobject_transformation,并仅使用投影来查看多维数据集。