将 3D 转换转换为 2D

Posted

技术标签:

【中文标题】将 3D 转换转换为 2D【英文标题】:Converting 3D transformation to 2D 【发布时间】:2017-08-23 20:43:37 【问题描述】:

我正在尝试找出一种在 OpenGL 中将 3D 转换矩阵转换为 2D 的方法。我的 z 坐标被忽略(我正在处理地面投影)。

这是我想要实现的一个示例:

// Given a transformation matrix
// | r00 r01 r01 t0 |
// | r10 r11 r11 t1 |
// | r20 r21 r21 t2 |
// | 0.  0.  0.  1. |
//
// Ignore the z-coordinate, and convert it to
// | r00 r01 t0 |
// | r10 r11 t1 |
// | 0.  0.  1. |
glm::dmat4 t_matrix_3D = GetTransformation();
glm::dmat3 t_matrix_2D = glm::dmat3(t_matrix_3D);
t_matrix_2D[2] = dvec3(dvec2(t_matrix_3D[3]), 1.);
t_matrix_2D[0][2] = 0.;
t_matrix_2D[1][2] = 0.;

问题是有没有更漂亮的方法呢?也许使用矩阵切片,或子矩阵提取?

【问题讨论】:

最容易理解的应该是:glm::mat4 m4;glm::mat3 m3( m4[0][0], m4[0][1], 0.0f, m4[1][0], m4[1][1], 0.0f, m4[3][0], m4[3][1], 1.0f ); 【参考方案1】:

最容易理解也可能是性能最好的方法是写一个内联方法或函数,直接使用glm::mat3的构造函数:

glm::mat3 Mat3Dto2D( const glm::mat4 & m )

    return glm::mat3(
        m[0][0], m[0][1], 0.0f,
        m[1][0], m[1][1], 0.0f,
        m[3][0], m[3][1], 1.0f
    );

【讨论】:

这就是我现在正在做的事情——有没有一种方法可以使用子矩阵/行/列组合来构建矩阵。一般来说,我正在寻找一个可读的单行:) @RafazZ 通常可读的单行是一个命名良好的函数

以上是关于将 3D 转换转换为 2D的主要内容,如果未能解决你的问题,请参考以下文章

将 3D 位置转换为 2d 屏幕位置 [r69!]

将 2d 矩阵转换为 3d 单热矩阵 numpy

将3D平面转换为2D坐标系

使用正交矩阵将 3D 坐标转换为 2D 屏幕坐标

尝试使用 Equirectangular Projection 将 2D 坐标转换为 3D 坐标。但失败了。我究竟做错了啥?

将 2D 图像坐标转换为 z = 0 的 3D 世界坐标