1

サードパーソンカメラで小さなゲームを書こうとしていますが、gluLookAt関数について疑問に思っています。Opengl 1.1で動作しますが、3.2を使用しているので、Matrix4fを返すことができるものが必要ですが、C ++のコードを除いてインターネット上で何も見つかりませんでした。また、それをに変換するのは非常に困難でした。 LWJGL(それらのAPIは同じではありません、サーはありません)。たとえば、私はこのコードを作り直そうとしました(このリンク):

// ----------------------------------------------------
// View Matrix
//
// note: it assumes the camera is not tilted,
// i.e. a vertical up vector (remmeber gluLookAt?)
//

void setCamera(float posX, float posY, float posZ,
           float lookAtX, float lookAtY, float lookAtZ) {

float dir[3], right[3], up[3];

up[0] = 0.0f;   up[1] = 1.0f;   up[2] = 0.0f;

dir[0] =  (lookAtX - posX);
dir[1] =  (lookAtY - posY);
dir[2] =  (lookAtZ - posZ);
normalize(dir);

crossProduct(dir,up,right);
normalize(right);

crossProduct(right,dir,up);
normalize(up);

float aux[16];

viewMatrix[0]  = right[0];
viewMatrix[4]  = right[1];
viewMatrix[8]  = right[2];
viewMatrix[12] = 0.0f;

viewMatrix[1]  = up[0];
viewMatrix[5]  = up[1];
viewMatrix[9]  = up[2];
viewMatrix[13] = 0.0f;

viewMatrix[2]  = -dir[0];
viewMatrix[6]  = -dir[1];
viewMatrix[10] = -dir[2];
viewMatrix[14] =  0.0f;

viewMatrix[3]  = 0.0f;
viewMatrix[7]  = 0.0f;
viewMatrix[11] = 0.0f;
viewMatrix[15] = 1.0f;

setTranslationMatrix(aux, -posX, -posY, -posZ);

multMatrix(viewMatrix, aux);
}

「floataux[16]」まではすべて理解できますが、その後は特に頭がおかしくなります。誰かが私にそれを明確にすることができますか?たぶん誰かがすでに「gluLookAt-clone」か何かを作ったのでしょうか?

編集:

ありがとう、ブレット、今私はそれをコードで表現する方法を理解しなければなりません)。「aux」は行列だとおっしゃっていますが、フロートは3つしかないので、ベクトルの方が良いですが、ベクトルの場合は、4x4のViewMatrixを掛けるにはどうすればよいですか。そして、Matrix4fを数字で埋める方法を見つけることができません。それを行うためのメソッドは、libにありません(おそらく、私は初心者で、見つけることができないためですが、実際には見つけることができません)

最終編集:

ついに私はそれを機能させました。必要な完全なマトリックスのものを理解していませんでした。誰かが興味を持っている場合は、これが最終的な作業コードです(私は推測しますが、何でもありません))。これに対処するには、最初に射影行列を設定することを忘れないでください。

void setCamera(float posX, float posY, float posZ,
            float lookAtX, float lookAtY, float lookAtZ) {
 Vector3f dir = new Vector3f(lookAtX - posX, lookAtY - posY, lookAtZ - posZ);
 Vector3f up = new Vector3f(0, 1f, 0);
 Vector3f right = new Vector3f();
dir.normalise();

 Vector3f.cross(dir,up,right);
 right.normalise();

 Vector3f.cross(right,dir,up);
 up.normalise();

 Matrix4f aux = new Matrix4f();

 viewMatrix = new Matrix4f();
 viewMatrix.m00 = right.getX();
 viewMatrix.m01  = right.getY();
 viewMatrix.m02 = right.getZ();
 viewMatrix.m03 = 0.0f;

 viewMatrix.m10  = up.getX();
 viewMatrix.m11  = up.getY();
 viewMatrix.m12 = up.getZ();
 viewMatrix.m13 = 0.0f;

 viewMatrix.m20 = -dir.getX();
 viewMatrix.m21  = -dir.getY();
 viewMatrix.m22 = -dir.getZ();
 viewMatrix.m23 =  0.0f;

 viewMatrix.m30  = 0.0f;
 viewMatrix.m31  = 0.0f;
 viewMatrix.m32 = 0.0f;
 viewMatrix.m33 = 1.0f;

//setup aux as a translation matrix by placing positions in the last column
aux.m30 = -posX;
aux.m31 = -posY;
aux.m32 = -posZ;

//multiplication(in fact translation) viewMatrix with aux
 Matrix4f.mul(viewMatrix, aux, viewMatrix);
}
4

3 に答える 3

1

gluLookAt()ドキュメントで説明されているように、コードはマトリックスにデータを入力しているだけです。

于 2012-12-14T21:07:12.630 に答える
1

(OpenGL 3.2で)使用する一人称カメラクラスがあり、x、y、zの位置、ピッチ、ヨー、ロールの動きを処理します。これを行う方法は、サイクルごとに位置を更新し、レンダリングの一部として、新しいビューマトリックスを作成し、それをユニフォームとして頂点シェーダーに送信することで、カメラからこれらの更新を適用します。

これを実現する方法は次のとおりです。

@Override
public void applyTranslations(int uniformLocation) {
    viewMatrix = new Matrix4f();
    Matrix4f.rotate(MatrixUtils.degreesToRadians(pitch), new Vector3f(1, 0, 0), viewMatrix, viewMatrix);
    Matrix4f.rotate(MatrixUtils.degreesToRadians(yaw), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
    Matrix4f.rotate(MatrixUtils.degreesToRadians(roll), new Vector3f(0, 0, 1), viewMatrix, viewMatrix);
    Matrix4f.translate(new Vector3f(-x, -y, -z), viewMatrix, viewMatrix);
    viewMatrix.store(matrix44Buffer); matrix44Buffer.flip();
    glUniformMatrix4(uniformLocation, false, matrix44Buffer);
}

ここで、uniformLocationは、シェーダー内のviewMatrixユニフォームの場所です。

手順は次のとおりです。

  1. 新しい4x4マトリックスを作成します
  2. x、y、z軸に回転を適用します
  3. x、y、z軸に平行移動を適用します
  4. マトリックスをシェーダーに送信します
于 2013-01-14T22:26:57.960 に答える
0

までfloat aux[16]、コードは正規直交基底(「軸」としての3つの相互に垂直なベクトル)を作成しています。直交回転行列のプロパティにより、viewMatrix要素を直接設定できます。aux次に、(おそらく)変換行列として入力され、変換は。で連結されmultMatrixます。

于 2012-12-14T21:12:15.877 に答える