私は、単純な動きや Arcball インターフェイスなどのアイデアを実装する OpenGL シーンの作成を任されています。私が抱えている問題は、NeHe の Arcball クラス ( http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48 ) が計算する回転行列を処理することです。
私がこれまでに持っているのは、見栄えの良い非常に単純な太陽系 (地球、月、太陽のみ) です。私が望むのは、カメラがユーザーが選択した惑星を追跡し (希望する惑星をクリックして)、マウスドラッグ (アークボール) を使用して固定距離で惑星の周りを回転できるようにすることです。冒頭で述べたように、NeHe のクラスは、マウスのクリックとドラッグに基づいて回転行列を生成しています。マトリックスを適用したいのは、カメラの位置です。しかし、そうすると、カメラは地球の周りを回転することなくぐらつくだけです。だから、私は何かステップを逃しているか、自分がやろうとしていることをひどく理解していると推測しています.
これは、私のカメラクラスからのいくつかのコードです。
// transform is the matrix from NeHe's arcball interface
void camera::update(Matrix4fT transform) {
glm::mat4 transform_m = glm::mat4(0.0f);
// convert nehe's matrices to GLM matrix
for(int i=0; i < 4; i++)
for(int j=0; j < 4; j++)
transform_m[i][j] = transform.M[i*4+j];
// apply matrix to the position
glm::vec4 pos4 = glm::vec4(this->pos, 1.0f);
pos4 = transform_m * pos4;
this->pos = glm::vec3(pos4);
}
void camera::apply(planet *target) {
// called at the beginning of GLPaint
gluLookAt(this->pos.x,this->pos.y,this->pos.z, // cam->position
target->pos.x,target->pos.y,target->pos.z, // moving
this->up.x,this->up.y,this->up.z); // (0,1,0)
}
それ以外では、NeHe の関数は適切な場所 (クリック アンド ドラッグ中) で呼び出されます。誰かがこれについて私を助けてくれることを願っています。コードベース全体 (C++ でプログラムされ、QTPanel にプッシュされたもの) を見たい場合は、メールを送ってください。
ありがとう、
Carl Sverre (carl at carlsverre dot com)