0

Direct3D を使用して独自の 3D エンジンに取り組んできました。World View と Projection Matrix で問題が発生するまでは、これはかなりうまくいきました。私が取り組んだ以前のプロジェクトのコードを使用していますが、プロジェクトには含まれていません。そこで、Direct3D 関数の D3DXMatrixLookAtLH と D3DXMatrixPerspectiveFovLH を使用することにしました。

これにより、機能するマトリックスが得られますが、カメラを回転または平行移動してジオメトリを画面の端に近づけると、そのオブジェクト全体が水平軸に引き伸ばされます。これが正しいかどうかはわかりません。

画面中央の立方体は正常に見えます。 ノーマルキューブ

しかし、横に動かすと伸び始めます。 伸びた立方体

これは、そのような場合に取得するビュー マトリックスです。

-0.81964797 -0.017183444    -0.57260966 0.00000000
 0.00000000  0.99954993 -0.029995499    0.00000000
 0.57286739 -0.024585750    -0.81927919 0.00000000
-1.1457349   0.049171507     1.6385586  1.0000000

また、アプリケーション内の WVP マトリックスとシェーダーが受け取るマトリックスとの間で転置されることにも気付きました。( memcpy を使用して CBuffer に入れるので、問題にはなりません) これは大きな問題ではありません。送信する前に転置するだけですが、これが一般的かどうかを知りたいです。

これは私のシェーダーです:

cbuffer WVP :cb0
{
    float4x4 WVP;
};


struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float3 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = mul( float4(position, 1.0f), WVP);

    output.color = color;

    return output;
}


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}

これは、入力に従ってビュー マトリックスを更新するためにフレームごとに発生するコードです。

// reset the vectors so the changes don't stack
vcPos.Set(x, y, z);
vcDir.Set(0.0f, 0.0f, -1.0f);

// Rotate the dir vector
Matrix3D m;
m.Rota(Looky/100, 0.0f, Lookx/100);
vcDir.RotateWith(m);

// add the pos to the dir vector so it points to in a direction rather then a point in the world
vcDir += vcPos;

// Set and get the View matrix
g_pDevice->SetViewMatrix(vcRight, vcUp, vcDir, vcPos );
g_pDevice->GetViewProjMatrix(&g_mView, NULL);

// Multiply them
g_mWVP = g_mWorld * g_mView * g_mProj;

// Transpose them so the shader tranposes them back.
Transpose(&g_mWVP);

そして、これはその舞台裏の部分です:

意見:

D3DXMatrixLookAtLH(&m_mView, &D3DXVECTOR3(vcPos.x, vcPos.y, vcPos.z),
                    &D3DXVECTOR3(vcDir.x, vcDir.y, vcDir.z), &D3DXVECTOR3(vcUp.x, vcUp.y, vcUp.z));   // The .x/.y/.z has to do with some compatability stuff 

プロジェクト:

D3DXMatrixPerspectiveFovLH(&m_mProj, FOV, Aspect, m_fNear, m_fFar); // Straight 
forward

D3DXMatrixPerspectiveFovLH(&m_mProj, 90.0, Aspect, 0.1f, 100.0f); // With values

Update2: 新しい情報で完全に書き直しました

Update3: View マトリックスとおそらく Projection に問題があります。World マトリックスは正常に機能します。

アップデート4:

さらにコードを変更した後、動作しているように見えるものができました! 私が今抱えている唯一の問題は、横へのストレッチです。

4

2 に答える 2

0

オブジェクトの前面がカメラに近い場合、垂直方向の伸びはおそらく私が予想するよりも大きくないことに注意してください. この出力は正しくありませんか?

しかし、より関連性が高いのは、FoV パラメーターを調整することです。そして、なぜ、正確に、それを転置しているのですか? D3DXMATRIX を使用する場合、行列は既に正しい順序で GPU に送信されるため、転置する必要はありません。

于 2012-06-23T20:36:07.153 に答える
0

翻訳行列を乗算する順序を考慮に入れていますか? つまり、最初に移動してからスケーリングすると、結果は引き伸ばされたメッシュになるということです。必ず順番に行う必要があります。メッシュを独自の軸を中心に回転させたい場合は、最初に回転させてから平行移動させます。メッシュを何かの周りを「周回」させたい場合は、最初にオブジェクトの周りを周回する距離だけメッシュを移動し、次に回転させてから、そのオブジェクトの位置に移動する必要があります。

とにかく、あなたはストレッチについて言及したので、最初に翻訳してからスケーリングしているためだと思います:

worldMatrix = translate * scale; // This will cause your mesh to stretch

worldMatrix = scale * translate; // this will cause your mesh to scale correctly

最初に変換したいのは、スケーリングしていないときだけで、オブジェクトを別のオブジェクトの周りに「周回」させたい場合です

于 2012-06-12T07:21:10.430 に答える