我正在使用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视图应用任意数量的转换?这些转换是由手势(平移,捏合,旋转)引起的。对于捏合和旋转,我知道屏幕坐标中的数量和中心点。
答案 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。