我发现这个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。
答案 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
在您的情况下,您可以忽略lookAt
和object_transformation
,并仅使用投影来查看多维数据集。