OpenGL ES - 相机看触摸位置

时间:2015-03-20 05:14:03

标签: ios opengl-es

我有一台相机(主视图,投影)。我在这里创建它:

-(void)setupProjection
{
    // Generate a perspective matrix with a 60 degree FOV
    float aspect = self.frame.size.width / self.frame.size.height;
    ksMatrixLoadIdentity(&_projectionMatrix);
    ksPerspective(&_projectionMatrix, 60.0, aspect, 0.01f, 50.0f);
    ksTranslate(&_projectionMatrix, 0.0, -0.295, 0.0);

    // Defaul value
    mFloatScale = 0.5;

    // Load projection matrix
    glUniformMatrix4fv(_projectionSlot, 1, GL_FALSE, (GLfloat*)&_projectionMatrix.m[0][0]);
}

我也有手势识别器。所以我想当我的用户移动手指时他会像第一人称射击游戏一样旋转相机。如何更新投影矩阵?我想我必须创建类似lookAt函数的东西。

1 个答案:

答案 0 :(得分:1)

使用方法生成lookAt矩阵或创建自己的矩阵。这是一个在网上找到的简单公式。

一旦你有了我的建议,你可以将代表你的相机的3个向量存储为positionforwardup。这些将插入lookAt方法(center = position+forward)。

现在,您可以实现相机移动的多种变体。全方位的情况是创建一个额外的向量right,它是forwardup的叉积。然后:

  • 向左/向右转:forward += right*someRotationSpeedFactor
  • 上/下:forward += up*someRotationSpeedFactor
  • 左/右倾斜:up += right*someRotationSpeedFactor
  • 前进/后退:position += forward*someSpeedFactor
  • 向上/向下移动:position += up*someSpeedFactor
  • 侧身移动:position += right*someSpeedFactor

改变方向意味着消极因素。通常从用户输入(两个触摸事件的距离)或当前速度接收因子。使用这些方程式中的任何一个后,您需要重新归一化forwardup的变化矢量(将它们除以它们的距离)。此外,您还需要使用交叉产品重新计算受影响的向量forwardup(如果有)。例如,如果你出现,你将改变forward向量,但up向量也会受到影响。这意味着您需要将up向量设置为forwardright向量的叉积。这在理论上听起来令人困惑,但在实践中它看起来像这样:

- (void)turnUp:(CGFloat)scale {
    vector forward = self.forward;
    vector up = self.up;
    vector right = cross(self.forward, self.up);

    self.forward = normalized(forward + up*scale);
    self.up = cross(self.forward, right);
}

现在这个程序非常适合驾驶太空船或喷气式飞机等。但是第一人称射击游戏通常会受到更多限制,因为up向量必须始终面向你的显示器。然后没有实现倾斜,在某些游戏中,您对最大向上角度有限制。这是由于这种情况下的数学问题。无论如何,如果你只是保持up向量不变,你应该做得很好,但是你可能需要在计算后对right向量进行标准化,因为它不再有1的长度。