1

私はopenglを使用してc ++で物理シミュレーターを作成しようとしていますが、カメラが向いている軸に沿ってオブジェクト(現在はほとんどが立方体)をスケーリングできる必要があります。

これをモデル マトリックスとして使用すると、オブジェクトを完全にうまく描画できます。

mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale);

gl.Position はカムの位置、float3 は私が書いた vec3 のようなクラスなどです...

だから私はその行を変更して、何よりも先にスケーリング係数を含めようとしました(最後にあるものが最初に適用されます):

mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale) * (Rotate(float3(gl.Rotation.x, gl.Rotation.y, gl.Rotation.z)) * Scale(float3(1.0f, 1.0f, sqrt(1 - (velocity * velocity)))) * Rotate(float3(tau - gl.Rotation.x, tau - gl.Rotation.y, tau - gl.Rotation.z)));

重要なのは最後の部分です。オブジェクトを回転させ、スケーリングし、回転させて元に戻します。各軸は、カムのピッチ、ヨー、ロールをラジアン単位で保持します。移動、回転などの関数は適切に機能しますが、スケーリングするマトリックスを作成する理論について助けが必要です。

4

2 に答える 2

1

スケーリング行列の形式は次のとおりです。

{{s_x, 0, 0, 0},
 {0, s_y, 0, 0},
 {0, 0, s_z, 0},
 {0,  0,  0, 1}}

均一な座標を仮定します。

それらを適用するには、スケーリング、回転、移動の順に行う必要があります。これを行うには、gl 関数を使用することをお勧めします。オブジェクトを x、y、z の位置に配置し、その回転が四元数 {theta, r_x, r_y, r_z} であるとします。スケーリングと回転は、モデル座標フレームで発生する必要があります。GL は適切な順序で変換を適用するため、そのコードは次のようになります。

glTranslatef(x, y, z);
glRotatef(theta, r_x, r_y, r_z);
glScalef(s_x, s_y, s_z);

//draw my model
于 2013-08-11T21:53:29.043 に答える
1

pippin1289のソリューションに基づいたこの関数を書くことで解決しました

mat4 ScaleOnAxis(float3 a)
{
    a = Norm3f(a);

    if(a == x || (a.x == -1.0f && a.y == 0.0f && a.z == 0.0f))
        return Scale(0.2f, 1.0f, 1.0f);

    float3 axis = Cross(a, x);
    float theta = acos(Dot(a, x));

    if(theta > pi / 2)
    {
        axis = axis * -1.0f;
        theta = pi - theta;
    }

    Quaternion ToRotation(axis.x, axis.y, axis.z, theta);
    Quaternion FromRotation(axis.x, axis.y, axis.z, tau - theta);

    return mat4(FromRotation) * (Scale(float3(0.2f, 1.0f, 1.0f)) * mat4(ToRotation));
}

軸上で 0.2 ずつスケーリングされる行列を返します

于 2013-08-12T21:49:51.017 に答える