web-dev-qa-db-ja.com

回転ベクトルへの方向ベクトル

方向から回転行列を作成する方法(単位ベクトル)

私のマトリックスは3x3、列が大きく、右手です

「column1」が正しい、「column2」が上、「column3」が前にあることを知っています

しかし、私はこれを行うことができません。

//3x3, Right Hand
struct Mat3x3
{
    Vec3 column1;
    Vec3 column2;
    Vec3 column3;

    void makeRotationDir(const Vec3& direction)
    {
        //:((
    }
}
14
UfnCod3r

ありがとうございます。解決しました。

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;
    }
}
12
UfnCod3r

コメントでやりたいことを行うには、プレーヤーの以前の向きも知っている必要があります。実際、最善の方法は、プレーヤー(およびゲーム内の他のほとんどすべて)の位置と方向に関するすべてのデータを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 
4
darius