0

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

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。

4

2 回答 2

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)

于 2013-11-12T15:47:39.647 回答
0

要计算矩阵,明智的做法是选择已经实现的数学库。矩阵通常由 a 组成projection_matrix * vies_matrix * world_transform_matrix。所有三个矩阵都可以使用GLM等库创建,用法如下:

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

在您的情况下,您可以忽略lookAtobject_transformation仅使用投影来查看立方体。

于 2013-11-12T14:47:05.367 回答