将 Sprite 矩形旋转 90 度不符合 iOS 中的纵横比

Rotating a Spirte Rectangle 90 degrees doesn't repect aspect ratio in iOS

我在 OpenGL ES 2.0 游戏中工作,在 iOS 平台上基本上使用 C++。我想同时实现纵向和横向旋转 90 度。

我遇到的问题很简单。我有一个精灵在一个矩形中,如果我旋转 90 度并希望看到相同的图形旋转。

我遇到的问题是图中的纵横比和大小都有明显差异。

在一个方向上: 8.4 厘米 x 5.0 厘米

其他: 7.6 厘米 x 5.4 厘米

请问是不是浮点数机器表示错误导致的?有人也遇到过这个问题吗?

我做的第一个测试:

glm::mat4 ProjModelViewMatrix = glm::ortho<float>(-1.0, +1.0, -1.5f, 1.5f);

/// DRAW CODE

在第二个测试中我只添加了一个旋转矩阵:

glm::mat4 rotation = glm::rotate(glm::mat4(1.0), -PI_F / 2.0f, glm::vec3(0.0f,0.0f,1.0f));

glm::mat4 ProjModelViewMatrix = glm::ortho<float>(-1.0, +1.0, -1.5f, 1.5f) * rotation;

/// DRAW CODE

以防万一: 所有顶点都在平面 z=0 中。 精灵被映射到一个矩形中。

I wonder if it that is possible be caused by errors caused by float machine representation?

如果您 运行 在 CPU 上使用 fp32 计算,那是非常非常不可能的 - 您需要一个大的绝对误差才能在屏幕上获得如此大的尺寸变化,以及浮点误差不会在几次乘法中积累那么快。

几个想法:

  • 4x4 旋转矩阵中的值是多少?
  • 矩阵乘法对顺序敏感 - 您是否以正确的顺序将它们相乘?我不确定 glm 如何在内存中布置它的矩阵,所以你在这里可能是正确的。

我能找到原因。我在想 iOS 设备有 2:3 宽高比,实际上它是 3:4 !