从水晶球界面转换为FPS式相机?

时间:2012-10-16 07:41:36

标签: opengl graphics camera frame-rate

我目前有一个水晶球界面摄像机设置,摄像机总是在看原点,按左,右,上,下只需在物体周围移动。

我想更改此设置,以便相机可以在3D环境中自由移动。

我目前有两个功能,LEFT和UP,已经实现为我提到的CB接口。

我希望左右键可左/右,而上/下可上升并下沉相机。我究竟该如何改变呢?

另外......向前和向后移动相机的正确方法是什么?我想也许拖动鼠标等于移动foward / back?

void Transform::left(float degrees, vec3& eye, vec3& up) {
eye = eye*rotate(degrees, up);
}


void Transform::up(float degrees, vec3& eye, vec3& up) {
vec3 ortho_axis = glm::cross(eye, up);
ortho_axis = glm::normalize(ortho_axis);

eye = eye*rotate(degrees, ortho_axis);
up = up*rotate(degrees, ortho_axis);
}

2 个答案:

答案 0 :(得分:1)

基本上扔掉整个代码并重新开始。场景中的摄像头与任何其他对象一样,因此具有位置和方向。 (或者一个变换矩阵。)您需要做的就是应用相机变换的相反方向。

glTransformf(-camera.x, -camera.y, -camera.z);
glRotatef(-camera.angle, camera.axis.x, camera.axis.y, camera.axis.z);

你明白了。

我在代码中所做的是,因为我有旋转的四元数并将其转换为矩阵或轴&角度很贵,我计算摄像机的向前和向上矢量并将其输入gluLookAt。

Vector3f f = transform(camera.orientation, Vector3f(1, 0, 0));
Vector3f u = transform(camera.orientation, Vector3f(0, 0, 1));
Vector3f p = camera.position;
Vector3f c = p + f;
gluLookAt(p.x, p.y, p.z, c.x, c.y, c.z, u.x, u.y. u.z);

答案 1 :(得分:0)

FPS控制的一个常见设置是将动作绑定到键(Strafe左/右,前进/后退)和环顾鼠标左右(x轴:左/右旋转,y轴:俯仰/向下)。

HTH