1

すべての 3D オブジェクトに対して一般的なマトリックス クラスを作成しましたが、変換がうまくいかないようです。

これが私のクラスです:

class GenericMatrix
{
public:
    GenericMatrix();

    virtual void Identity();

    virtual void Scale( float x, float y, float z );
    virtual void Scale( const DirectX::XMFLOAT3& s );
    virtual DirectX::XMFLOAT3 Scaling( void );

    virtual void Translate( float x, float y, float z );
    virtual void Translate( const DirectX::XMFLOAT3& t );
    virtual DirectX::XMFLOAT3 Translations( void );

    virtual void Rotate( float x, float y, float z );
    virtual void Rotate( const DirectX::XMFLOAT3& r );
    virtual DirectX::XMVECTOR Rotations( void );
    virtual DirectX::XMFLOAT3 RotationsPYR( void );

    virtual DirectX::XMMATRIX Matrix( bool process = true );

    virtual operator DirectX::XMMATRIX()
    {
        return this->Matrix();
    }

    virtual void UpdateMatrix( void );

    DirectX::XMMATRIX   matrix;
    DirectX::XMFLOAT3   scale;
    DirectX::XMFLOAT3   translation;
    DirectX::XMVECTOR   rotation;
    bool                matrixNeedsUpdate;

protected:
    float               yaw, pitch, roll;
};

そしてソース:

#include "pch.h"
#include "GenericMatrix.h"

GenericMatrix::GenericMatrix()
    : matrixNeedsUpdate( true )
{
    this->Identity();
    this->pitch = 90.0f;
    this->yaw = 0.0f;
    this->roll = 0.0f;
}

void GenericMatrix::Identity()
{
    this->scale = DirectX::XMFLOAT3( 1.0f, 1.0f, 1.0f );
    this->translation = DirectX::XMFLOAT3( 0.0f, 0.0f, 0.0f );
    this->rotation = DirectX::XMQuaternionIdentity();
    this->pitch = 90.0f;
    this->yaw = 0.0f;
    this->roll = 0.0f;
    matrixNeedsUpdate = true;
}

void GenericMatrix::Scale( float x, float y, float z )
{
    this->scale.x += x;
    this->scale.y += y;
    this->scale.z += z;
    this->matrixNeedsUpdate = true;
}

void GenericMatrix::Scale( const DirectX::XMFLOAT3& s )
{ Scale( s.x, s.y, s.z ); }

DirectX::XMFLOAT3 GenericMatrix::Scaling( void )
{ return this->scale; }

void GenericMatrix::Translate( float x, float y, float z )
{
    this->translation.x += x;
    this->translation.y += y;
    this->translation.z += z;
    this->matrixNeedsUpdate = true;
}

void GenericMatrix::Translate( const DirectX::XMFLOAT3& t )
{ Translate( t.x, t.y, t.z ); }

DirectX::XMFLOAT3 GenericMatrix::Translations( void )
{ return this->translation; }

void GenericMatrix::Rotate( float x, float y, float z )
{
    pitch = x;
    yaw = y;
    roll = z;
    this->rotation = DirectX::XMQuaternionRotationRollPitchYaw( pitch, yaw, roll );
    this->matrixNeedsUpdate = true;
}

void GenericMatrix::Rotate( const DirectX::XMFLOAT3& r )
{ Rotate( r.x, r.y, r.z ); }

DirectX::XMVECTOR GenericMatrix::Rotations( void )
{ return this->rotation; }

DirectX::XMFLOAT3 GenericMatrix::RotationsPYR( void )
{
    return DirectX::XMFLOAT3( pitch, yaw, roll );
}

DirectX::XMMATRIX GenericMatrix::Matrix( bool process )
{
    if ( process && this->matrixNeedsUpdate )
    {
        UpdateMatrix();
        this->matrixNeedsUpdate = false;
    }
    return this->matrix;
}

void GenericMatrix::UpdateMatrix( void )
{
    DirectX::XMVECTOR scaleVec, translateVec;
    scaleVec = DirectX::XMLoadFloat3( &this->scale );
    translateVec = DirectX::XMLoadFloat3( &this->translation );
    this->matrix = DirectX::XMMatrixScalingFromVector( scaleVec ) * DirectX::XMMatrixRotationQuaternion( this->rotation ) * DirectX::XMMatrixTranslationFromVector( translateVec );
}

これをモデル マトリックスとして使用すると、Identity() を実行してから Translate( 0.0f, 0.0f, 5.0f ) を実行した後、カメラを [0,0,5] に配置したときにのみモデルが表示され、その後でもモデルが表示されます。 、それはただのちらつきです。私が行った最後の 3D プログラミングは OpenGL 1.x を使用したものでした。そのため、マトリックスで奇妙なことをしている可能性は十分にありますが、それ以外の方法でこれを行う方法を教えてくれるものは何も見つかりませんでした。誰かが必要とする情報がさらにある場合は、尋ねてください。

更新:いくつかの詳細 - マトリックスを Identity() に設定してそのままにしておくと、カメラを移動して、どの位置からでも問題なくモデルを見ることができますが、どこにでも移動すると、可視性が台無しになります。

4

1 に答える 1

0

いくつかのテストの後、問題を発見しました。カメラには左手の座標系を使用していたようですが、視点には右手を使用していました。z 0.9 から -0.9 の間で、左利きと右利きの両方のシステムがモデルを表示することに同意できましたが、それらをそのスペースから移動すると、カメラが正確に同じコーディネート。

教訓 - コード全体で一貫して同じ座標系を使用することを忘れないでください。

于 2013-02-07T14:42:15.067 に答える