方向から回転行列を作成する方法(単位ベクトル)
私のマトリックスは3x3、列が大きく、右手です
「column1」が正しい、「column2」が上、「column3」が前にあることを知っています
しかし、私はこれを行うことができません。
//3x3, Right Hand
struct Mat3x3
{
Vec3 column1;
Vec3 column2;
Vec3 column3;
void makeRotationDir(const Vec3& direction)
{
//:((
}
}
ありがとうございます。解決しました。
struct Mat3x3
{
Vec3 column1;
Vec3 column2;
Vec3 column3;
void makeRotationDir(const Vec3& direction, const Vec3& up = Vec3(0,1,0))
{
Vec3 xaxis = Vec3::Cross(up, direction);
xaxis.normalizeFast();
Vec3 yaxis = Vec3::Cross(direction, xaxis);
yaxis.normalizeFast();
column1.x = xaxis.x;
column1.y = yaxis.x;
column1.z = direction.x;
column2.x = xaxis.y;
column2.y = yaxis.y;
column2.z = direction.y;
column3.x = xaxis.z;
column3.y = yaxis.z;
column3.z = direction.z;
}
}
コメントでやりたいことを行うには、プレーヤーの以前の向きも知っている必要があります。実際、最善の方法は、プレーヤー(およびゲーム内の他のほとんどすべて)の位置と方向に関するすべてのデータを4x4マトリックスに格納することです。これは、4列目と4行目を3x3ローテーションマトリックスに「追加」し、追加の列を使用してプレーヤーの位置に関する情報を格納することによって行われます。この背後にある数学(同種の座標)は非常に単純で、OpenGLとDirectXの両方で非常に重要です。この素晴らしいチュートリアルをお勧めします http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ ここで、GLMを使用して、プレーヤーを敵に向けて回転させることができます。これを行う:
1)プレーヤークラスと敵クラスで、位置の行列と3Dベクトルを宣言します
glm::mat4 matrix;
glm::vec3 position;
2)で敵に向かって回転
player.matrix = glm::LookAt(
player.position, // position of the player
enemy.position, // position of the enemy
vec3(0.0f,1.0f,0.0f) ); // the up direction
3)敵をプレイヤーに向けて回転させるには、
enemy.matrix = glm::LookAt(
enemy.position, // position of the player
player.position, // position of the enemy
vec3(0.0f,1.0f,0.0f) ); // the up direction
すべてを行列に格納する場合は、位置を変数としてではなく関数として宣言してください
vec3 position(){
return vec3(matrix[3][0],matrix[3][1],matrix[3][2])
}
と回転
player.matrix = glm::LookAt(
player.position(), // position of the player
enemy.position(), // position of the enemy
vec3(0.0f,1.0f,0.0f) ); // the up direction