Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.05.2004, 20:51

Frage zu Beispiel aus DirectX SDK "Matrices"

Hi,

ich habe mal eine Frage zu diesem Beispiel da ist ja ein Dreieck was sich dreht. Nun hab ich mal ein zweites Dreieck hinzugefügt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HRESULT InitGeometry()
{
    // Initialize three vertices for rendering a triangle
    CUSTOMVERTEX g_Vertices[] =
    {
        { -1.0f,-1.0f, 0.0f, 0xffff0000, },
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
        {  0.0f, 1.0f, 0.0f, 0xffffffff, },

        { 1.0f,1.0f,0.0f, 0xffff0000, }, //<----- Zweites Dreieck
        { 3.0f,1.0f,0.0f, 0xff0000ff, },
        { 2.0f,2.0f,0.0f, 0xff0000ff, },
    };
usw...


Nun will ich das sich ein Dreieck dreht und das andere nicht aber wenn ich das Programm ausführe drehen sich natuerlich beide Dreiecke. Hier nochmal der Code aus dem Beispiel der für die Drehung zuständig ist:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VOID SetupMatrices()
{
    // For our world matrix, we will just rotate the object about the y-axis.
    D3DXMATRIXA16 matWorld, matWorld1, matWorld2, matWorld3;

    // Set up the rotation matrix to generate 1 full rotation (2*PI radians) 
    // every 1000 ms. To avoid the loss of precision inherent in very high 
    // floating point numbers, the system time is modulated by the rotation 
    // period before conversion to a radian angle.
    UINT  iTime  = timeGetTime() % 1000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    D3DXMatrixRotationY( &matWorld, fAngle );


    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
   usw....


Wie kann man es also bewerkstelligen das sich ein Dreieck dreht und das andere nicht ? ??? ???

2

04.05.2004, 20:58

das dreieck render das sich nicht drehen soll,
dann die rotationsmatrix setzen und dann das andere rendern
bzw. wenn du das renderst das sich nicht drehen soll
dann setzt entsprechend wieder eine nicht rotiert transformationsmatrix.

3

04.05.2004, 21:36

Zitat von »"0x00000023"«

das dreieck render das sich nicht drehen soll,
dann die rotationsmatrix setzen und dann das andere rendern
bzw. wenn du das renderst das sich nicht drehen soll
dann setzt entsprechend wieder eine nicht rotiert transformationsmatrix.


Wie macht man das genau (bin Anfänger) so hab ich das jetzt mal umgebastelt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VOID Render()
{
    // Clear the backbuffer to a black color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Setup the world, view, and projection matrices
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); //<--- zeichnet das erste Dreieck
        SetupMatrices(); <--- Jetzt kommt die Rotation

        // Render the vertex buffer contents
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 1, 2 ); <-- Zeichnet das zweite Dreieck


Klappt aber leider nicht kommt nur Müll raus.

jube

Frischling

Beiträge: 36

Beruf: Schüler

  • Private Nachricht senden

4

04.05.2004, 21:44

Hi,
die render Funktion wird ja jeden Frame ausgeführt. Du musst bevor du dass nicht drehende Dreieck renderst, die Weltmatrix schon wieder auf eine nicht Rotationsmatrix setzen. Dann müsste es eigentlich klappen.
mfg Juli :huhu:

Anonymous

unregistriert

5

04.05.2004, 21:50

also in der c++ -Dokumentation der
DirectX-SDk findet man folgendes :

Zitat

Syntax

HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex, <--------------!!!!
UINT PrimitiveCount <--------------!!!!!
);


Wie Du also siehst KANN das gar nicht funktionieren so !

Das 1.Dreieck malste in Deinem Fall so :
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);

und das 2.te so:
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 3, 1 );


und zu dem Drehen/nicht-Drehen :
also wenn Du das 1.ste drehen willst und das 2.te nicht :

musst Du einfach erst vor dem 2.ten Dreieck die Rotation einfügen wie auch in dem Beispiel und vor dem 1.ten Dreieck musst Du die IDENTITÄTS-MATRIX einfügen, sozusagen die "Normale" Matrix, weil Du ja bei dem 2.ten Dreieck die Matrix änderst und die muss immer wieder zurückgesetzt werden

der passende Befehl ist dann halt nicht :

Quellcode

1
2
D3DXMatrixRotationY( &matWorld, fAngle ); 
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); 


sondern:

Quellcode

1
2
D3DXMatrixIdentity( &matWorld); 
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); 

6

04.05.2004, 21:50

ich probier es mal eben

7

04.05.2004, 22:04

Ich habs jetzt mal so geändert wie du sagst :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
VOID SetupMatrices()
{
    // For our world matrix, we will just rotate the object about the y-axis.
    D3DXMATRIXA16 matWorld, matWorld1, matWorld2, matWorld3;

    D3DXMatrixIdentity( &matWorld);  <-- Hier hab ich die Identitätsmatrix eingefügt 
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

    // Set up the rotation matrix to generate 1 full rotation (2*PI radians) 
    // every 1000 ms. To avoid the loss of precision inherent in very high 
    // floating point numbers, the system time is modulated by the rotation 
    // period before conversion to a radian angle.
    UINT  iTime  = timeGetTime() % 1000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    D3DXMatrixRotationY( &matWorld, fAngle );


    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );


VOID Render()
{
    // Clear the backbuffer to a black color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Setup the world, view, and projection matrices
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);
     
        SetupMatrices();

        // Render the vertex buffer contents
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 3, 1 );

        // End the scene
        g_pd3dDevice->EndScene();
    }


Es drehen sich aber immer noch die beiden Dreiecke.

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

8

04.05.2004, 22:09

wenn du dir deinen code mal der reihe nach anguckst:

du renderst das erste dreieck,
dann Matrix = Identitätsmatrix, dann aber direkt
MatrixTransformation
und dann renderst du das nächste Dreieck;

das mit der identitätsmatrix ist also schwachsinning, da es direkt überschrieben wird
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

9

04.05.2004, 22:27

Und wo soll ich das mit der Identitäsmatrix dann hinpacken ?

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

10

04.05.2004, 22:34

entweder vor dem rendern des ersten dreiecks oder nach dem zweiten

(edited!)
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Werbeanzeige