我有一台相机(主视图,投影)。我在这里创建它:
-(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函数的东西。
答案 0 :(得分:1)
使用方法生成lookAt
矩阵或创建自己的矩阵。这是一个在网上找到的简单公式。
一旦你有了我的建议,你可以将代表你的相机的3个向量存储为position
,forward
,up
。这些将插入lookAt
方法(center = position+forward
)。
现在,您可以实现相机移动的多种变体。全方位的情况是创建一个额外的向量right
,它是forward
和up
的叉积。然后:
forward += right*someRotationSpeedFactor
forward += up*someRotationSpeedFactor
up += right*someRotationSpeedFactor
position += forward*someSpeedFactor
position += up*someSpeedFactor
position += right*someSpeedFactor
改变方向意味着消极因素。通常从用户输入(两个触摸事件的距离)或当前速度接收因子。使用这些方程式中的任何一个后,您需要重新归一化forward
和up
的变化矢量(将它们除以它们的距离)。此外,您还需要使用交叉产品重新计算受影响的向量forward
或up
(如果有)。例如,如果你出现,你将改变forward
向量,但up
向量也会受到影响。这意味着您需要将up
向量设置为forward
和right
向量的叉积。这在理论上听起来令人困惑,但在实践中它看起来像这样:
- (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的长度。