DirectX Sprite drehen



  • Hi,

    ich habe mal wieder eine kleine Frage zu DirectX 😃
    Und zwar möchte ich gerne ein Sprite drehen - aber nicht nur zweidimensional.
    Im DirectXSDK gibts ja zB. die "Tutorials" hier wird in "Tut03 - Matrices" ein Dreieck um die Y-Achse gedreht. Das ganze möchte ich jetzt analog mit einem Sprite (einer Textur) machen.

    Mein Ansatz war:

    if (D3D_OK == m_device->BeginScene())
    {
      sprite->Begin(D3DXSPRITE_ALPHABLEND);
      D3DXMATRIX mat;
      //D3DXMatrixTranslation(&mat, 150, 100, 0);
      D3DXMatrixRotationY(&mat, 0.01);
    
      sprite->SetTransform(&mat);
      sprite->Draw(texture, 0, 0, 0, 0xFFFFFFFF);
      sprite->End();
      m_device->EndScene();
    }
    

    Nur leider verschwindet das Sprite so einfach. Das hier auskommentierte "Verschieben" auf den Achsen funktioniert dagegen einwandfrei.
    Wie macht man das also? 😉



  • versuch es mal mit der z-Achse



  • Ich hab das damals als ich mal mit DX rumgemurkst hab so gemacht:

    void SpriteDX9::rotate( float x, float y, float angle )
    {
    	m_angle = angle;
    	D3DXMatrixTransformation2D(&m_transform, NULL, 0.0f, &m_scale, &m_hotspot, m_angle, &m_position );
    }
    

    Natürlich muss Du angle in jedem Frame erhöhen:

    // früher
    float angle = 0.0f;
    
    // Render- bzw Updatefunktion:
    angle += 0.2f;
    sprite->rotate(1.0f, 0.0f, angle);
    

    gausss schrieb:

    versuch es mal mit der z-Achse

    Eher X-Achse wenn er 2D verwendet^^. Naja kommt drauf an wie er rotieren will :p.



  • Das mit der Z-Achse funktioniert zwar halbwegs - aber irgendwie auch nicht wirklich wie gedacht. Das Sprite dreht sich dann halt zweidimensional und nicht um seine Y-Achse.. Edit @Vorposter: Mit D3DXMatrixTransformation2D() kann man das Ding ja auch nicht um seine Y-Achse drehen 😉

    Eventuell liegt es daran dass ein Sprite keine Y-Achse hat um die man es drehen kann?
    Dann müsse es so in etwa gehen:

    D3DXMATRIX mat;
    D3DXVECTOR3 cen(64, 32, 0);
    D3DXVECTOR3 pos(100, 50, 0);
    D3DXVECTOR3 y(0.0, 1.0, 0.0);
    D3DXQUATERNION quat(0, 0, 0, 0);
    D3DXQuaternionRotationAxis(&quat, &y, 0.1);
    D3DXMatrixTransformation(&mat, 0, 0, 0, &cen, &quat, &pos);
    

    Funktioniert allerdings auch nicht wie gewünscht, hier werden Teile des Sprites einfach ausgeblendet. Wenn ich statt "D3DXQuaternionRotationAxis()" einfach einen Wert in "quad" setze funktioniert das zwar so mehr oder weniger aber leider verstehe ich nicht was das für eine Einheit sein soll.. (Grad? Radiant? Passt irgendwie beides nicht so richtig..)
    D3DXQuaternionRotationAxis() wird also scheinbar benötigt, funktioniert aber nicht..


Anmelden zum Antworten