应用多个转换以进行查看

时间:2016-10-01 08:41:41

标签: c++ ios matrix opengl-es transformation

我正在使用C ++开发OpenGL ES应用程序。我在iOS上运行代码,带有一些包装器Obj-c类,使我能够使用手势(如pan,pinch,rotation)。

我使用正交投影。代码现在只绘制一个简单的四边形,我希望能够使用用户手势对其应用任何变换。这意味着移动它,放大和缩小,旋转(一些其他派生手势,如使用双击等缩放)。

我认为如果我只是存储原点,比例和角度浮点数并使用其中每一个构造矩阵,然后相乘,我会认为没问题。这适用于简单的翻译和缩放,但是,我无法绕任何点旋转。现在我无法弄清楚我需要能够围绕某个点旋转,翻译,在不同点周围旋转一些。

以下是我如何初始化矩阵的示例

Mat4 Mat4::translation(float tx, float ty)
{
    float a[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1 };
    return Mat4(a);
}

Mat4 Mat4::rotation(float angle)
{
    float a[16] = { cosf(angle), sinf(angle), 0, 0, -sinf(angle), cosf(angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
    return Mat4(a);
}

如何使用矩阵在OpenGL(ES)中对2D视图应用任意数量的转换?这些转换是由手势(平移,捏合,旋转)引起的。对于捏合和旋转,我知道屏幕坐标中的数量和中心点。

2 个答案:

答案 0 :(得分:0)

围绕任意点旋转是通过将点转换为原点,围绕原点旋转然后平移回来来完成的。

答案 1 :(得分:0)

我相信你的问题可归结为找出你定义转换的参考框架。

在实践中,您可以将任何转换(即3D中的平移和旋转)指定为4x4矩阵,就像您在示例中所做的那样。如果它们是根据对象的当前姿势定义的,那么您可以通过将右侧的新矩阵相乘来应用新的姿势。如果它们是针对固定参考帧(例如,您的屏幕原点不移动)指定的,那么您将它们预乘。

假设您应用两个旋转,由T_rot_1和T_rot_2

定义

如果定义了转换到附加到对象的参考框架:

T_final_wrt_fixed = T_rot_1_wrt_obj * T_rot_2_wrt_obj

如果定义了转换,则引用固定帧:

T_final_wrt_fixed = T_rot_2_wrt_fixed * T_rot_1_wrt_fixed

有关详细信息,请查看these slides