サードパーソンカメラで小さなゲームを書こうとしていますが、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);
}