1

私は現在、カメラが常に原点を見て、左、右、上、下を押すだけでオブジェクトの周りを移動するクリスタルボールインターフェースカメラをセットアップしています。

これを変更して、カメラが 3D 環境を自由に動き回れるようにします。

現在、前述の CB インターフェイスとして実装されている LEFT と UP の 2 つの関数があります。

左右のキーで左右に機銃掃射し、上下でカメラを上げ下げします。変更するには具体的にどのようにすればよいですか?

また、カメラを前後に動かす適切な方法は何でしょうか? マウスをドラッグすることは、前後に移動することと同じになるのではないかと考えていましたか?

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

基本的に、コード全体を破棄して最初からやり直してください。シーン内のカメラは他のオブジェクトと同じように動作するため、位置と向きがあります。(または 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 コントロールの一般的なセットアップは、移動をキーにバインドし (Strafe Left/Right、Move Forward/Back)、マウスに結び付けて見回す (x 軸: 左/右に回転、y 軸: ピッチを上下に動かす) ことです。 .

HTH

于 2012-10-17T22:30:44.420 に答える