1

我目前有一个水晶球接口相机设置,相机总是看着原点,然后按左、右、上、下键简单地围绕对象移动。

我想改变这一点,以便相机可以在 3D 环境中自由移动。

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

我希望左右键向左/向右扫射,而向上/向下则用于升降相机。我将如何改变它?

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

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);
}
4

2 回答 2

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);
于 2012-10-17T14:33:57.957 回答
0

FPS 控件的常见设置是将移动绑定到键(向左/向右移动、向前/向后移动)并与鼠标绑定环视(x 轴:向左/向右旋转,y 轴:向上/向下倾斜) .

高温高压

于 2012-10-17T22:30:44.420 回答