在OpenGL / GLKit中使用透视原点进行透视变换

时间:2013-11-23 13:33:41

标签: ios opengl-es matrix

我正在使用OpenGL创建一个简单的正方形网格,我希望这样当用户点击一个正方形时,它会在Y轴上翻转(我有这个代码工作)。但是因为透视原点/消失点位于屏幕的中心,所以旋转看起来并不像应该的那样相对于正方形的中心。

下面是旋转0.5弧度(约30度)的所有正方形的图像。中心方块正确旋转,但是我希望所有其他方块都有相对于它们中心点的视角,而不是屏幕的中心点(目前它们看起来像是我不想要的):

enter image description here

以下是我如何创建投影&查看矩阵(适用于所有方块):

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
_projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
_viewMatrix = GLKMatrix4MakeTranslation(0, 0, -5);

以下是我为每个方块创建模型矩阵的方法:

GLKMatrix4 modelMatrix = GLKMatrix4MakeTranslation(tile.x, tile.y, 0);
modelMatrix = GLKMatrix4RotateY(modelMatrix, 0.5f);

1 个答案:

答案 0 :(得分:0)

在玩完这个之后,我最终看到了CSS3变换是如何实现的,W3C provides the following explanation of how perspective-origin should be computed

  
      
  1. 从身份矩阵开始。
  2.   
  3. 通过计算出的透视原点的X和Y值进行翻译
  4.   
  5. 乘以可从perspective()转换函数获得的矩阵,其中长度由透视属性的值提供
  6.   
  7. 通过perspective-origin
  8. 的否定计算的X和Y值进行翻译   

这很容易应用于OpenGL和GLKit。而不是乘以投影*视图*模型(在这种情况下,我的模型变换是平移和旋转),我发现乘法翻译*投影*视图*旋转代替完成工作,并允许我正确地翻转中心周围的方块。