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

17.08.2003, 20:18

Matrizen: Dreieck dreht sich nicht

Hallo!
Kann sich vielleicht jemand den Quellcode von unten anschauen?
Die Funktion wird jedes Mal vorm Rendern aufgerufen und sollte eigentlich bewirken, dass das danach gerenderte Dreieck um die Y-Achse gedreht dargestellt wird. Aber das tut es nicht - das ist mein Problem.

Ich bin für jeden hilfreichen Tipp sehr dankbar!

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
/**
 * itcResult SetupMatrices(
 *  void
 * );
 *
 * Setzt die D3D9 - Matrizen
 */
itcResult SetupMatrices()
{
    D3DXMATRIX matWorld, matView, matProj;

    // World Matrix
    D3DXMatrixRotationY(&matWorld, 0.2f);
    g_p3DDevice->SetTransform(D3DTS_WORLD, &matWorld);

    // View Matrix
    D3DXMatrixLookAtLH(&matView,
        &D3DXVECTOR3(0.0f, 3.0f,-5.0f),
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    g_p3DDevice->SetTransform(D3DTS_VIEW, &matView);

    // Projection Matrix
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
    g_p3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

    return ITC_OK;
}


Nochmal danke!

Anonymous

unregistriert

2

17.08.2003, 20:25

Wenn ich das richtig sehe, wird immer der gleiche Faktor für die Rotationsmatrix verwendet. Natürlich dreht sich dann das Dreieck nicht.
Man muss den globalen Zeitzähler da mit einbringen. Also:

Quellcode

1
D3DXMatrixRotationY(&matWorld, Konstante*globalerzeitzähler);

Anonymous

unregistriert

3

17.08.2003, 20:30

Ja, tschuldigung. Falsch ausgedrückt. Es sollte sich nicht wirklich drehen, sondern nur gedreht angezeigt werden. So, wie es momentan ist, zeigt mir das Programme in Dreieck und zwar 100%ig frontal. Eigentlich müsste es ja um 0.2f Radiants auf der Y-Achse gedreht gezeigt werden.

4

17.08.2003, 20:31

Doofes Forum hat mich ausgeloggt. Letzte Antwort stammt von mir.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

17.08.2003, 22:04

Zitat von »"Anonymous"«

So, wie es momentan ist, zeigt mir das Programme in Dreieck und zwar 100%ig frontal.

Glaube ich Dir nicht :)
Das kann man nämlich praktisch garnicht erkennen, da das Dreieck ja nur ein wenig schmäler wird. Bring eine Animation mit rein, dann wirst Du es sehen. Im Code ist nämlich alles OK.

6

17.08.2003, 22:14

Zitat von »"David Scherfgen"«

Zitat von »"Anonymous"«

So, wie es momentan ist, zeigt mir das Programme in Dreieck und zwar 100%ig frontal.

Glaube ich Dir nicht :)
Das kann man nämlich praktisch garnicht erkennen, da das Dreieck ja nur ein wenig schmäler wird. Bring eine Animation mit rein, dann wirst Du es sehen. Im Code ist nämlich alles OK.


Hehe :)
Ist aber wirklich so! Es tut sich nüscht!
Wär wirklich super, würdest du oder jemand anders hier sich die 13KB Projektdaten für VC++6 runterladen und anschauen.

Tausend Dank!

http://s19p933.server19.yourwebstart.com/temp/DXTestGehtNicht.rar

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

17.08.2003, 22:35

Aaah, hättest Du mal irgendwo erwähnt, dass Du mit transformierten Vertizes (D3DFVF_XYZRHW) arbeitest... die laufen natürlich nicht mehr durch die Transformationspipeline, da sie ja schon in 2D-Koordinaten angegeben werden.

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

8

17.08.2003, 22:41

hm, ich hab nur ganz kurz den Code angeschaut:

Quellcode

1
2
3
4
5
6
7
    g_p3DDevice->SetTransform(D3DTS_VIEW, &matView);

    // Projection Matrix
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
    g_p3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

    return ITC_OK;


Das kommt mir seltsam vor, muss man hier nicht zuerst Rotation * Translation multiplizieren und anschleißend das Ergbnis in SetTransform setzten??

9

17.08.2003, 22:49

Zitat von »"David Scherfgen"«

Aaah, hättest Du mal irgendwo erwähnt, dass Du mit transformierten Vertizes (D3DFVF_XYZRHW) arbeitest... die laufen natürlich nicht mehr durch die Transformationspipeline, da sie ja schon in 2D-Koordinaten angegeben werden.

Du bist echt gut :)
Jetzt schaut das ganze bei mir so aus:

Quellcode

1
2
3
4
5
6
7
struct CUSTOMVERTEX
{
    float x, y, z;
    DWORD color;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

vertices[] habe ich auch angepasst.
Das Programm lässt sich weiter kompilieren, linken und ausführen, das Dreieck ist jedoch verschwunden. An fehlender Beleuchtung liegts nicht, die ist ausgeschaltet. Hast Du eine Idee, was der Grund sein könnte?

Auf jeden Fall schonmal vielen Dank für deine Mühen!

Zitat von »"Stefan"«

hm, ich hab nur ganz kurz den Code angeschaut:

Quellcode

1
2
3
4
5
6
7
    g_p3DDevice->SetTransform(D3DTS_VIEW, &matView);

    // Projection Matrix
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
    g_p3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

    return ITC_OK;


Das kommt mir seltsam vor, muss man hier nicht zuerst Rotation * Translation multiplizieren und anschleißend das Ergbnis in SetTransform setzten??

So 100%ig bin ich noch nicht durch die Matrizen durch. Deswegen kann ich darüber nicht viel aussagen. Werd mir heute Nacht noch einmal das Buch vornehmen. Die Routine stammt jedoch aus dem Tutorial 03 vom DX9 SDK...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

17.08.2003, 22:54

Verschiebe das Dreieck weiter nach hinten und überprüfe die Kameraeinstellungen (Position, wohin sie blickt, Nach-oben-Vektor).

Werbeanzeige