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

07.04.2007, 15:24

Billboarding

Hallo,

also es geht um folgendes. ich wollte mal das billboarding probieren, weil es irgendwie nicht schwierig zu sein schien, aber ich krigs irgendwie ned hin :(

für die,die es nicht kennen:
es geht darum, dass ein 2D objekt 3D wirkt, indem es immer zur kamera schaut. beispielsweise, wenn man 2D personen zeichnet und die immer dem spieler anschauen, wirkt es so, als wären die personen 3D.

funktionieren sollte es damit, dass man die negativen x,y,z-rotationswerte der viewmatrix hernimmt und sie für die worldmatrix einsetzt. eine zweite variante wäre die viewmatrix zu invertieren (transpose) und dann nur noch die translationsmatrix für die worldmatrix setzen.

beide varianten funktionieren bei mir nicht und ich frag mich wieso :)

hier mal meine "ansätze":

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// fCAMangleX,Y,Z sind die x,y,z koordinaten des viewpoints der viewmatrix

D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(fCAMangleX, fCAMangleY, fCAMangleZ), 
                                &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
                                &D3DXVECTOR3(0.0f, 1.0f, 0.0f));

// ...


// Create world matrix

    D3DXMatrixIdentity(&matWorld);
    g_pD3DDevice->GetTransform(D3DTS_VIEW, &matView);
    D3DXMatrixTranslation(&matTrans, 0.0f, -3.0f, 5.0f);
    D3DXMatrixTranspose(&matView, &matView);
    D3DXMatrixMultiply(&matWorld, &matView, &matTrans);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);


bitte um hilfe :)

mfg
Drac

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.04.2007, 22:15

Zitat

eine zweite variante wäre die viewmatrix zu invertieren (transpose)


die viewmatrix ist nich unbedingt orthogonal daher ist inverse != transpose.
versuch mal sie wirklich zu invertieren und nicht nur zu transponieren...D3DXMatrixInverse() ;)

3

07.04.2007, 22:33

hm kann sein,dass es damit funktioniert, aber die steuerung ist jetzt irgendwie wieder übern haufen geworfen... wenn ich mich jetzt mit WASDRF bewege freaked die kamera wieder so merkwürdig herum :)

will ja eigentlich eine kamera die sich entlang der X,Z achse bewegt und um die y achse rotiert, aber so einfach ist das gar ned irgendwie :P

C-/C++-Quelltext

1
2
3
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(fCAMangleX, fCAMangleY, fCAMangleZ), 
                                &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
                                &D3DXVECTOR3(0.0f, 1.0f, 0.0f));


erster vector ist ja der VP vector, also der vektor wo man gerade ist, der zweite vektor ist wo man hinschaut und der dritte ist der UP vector, wie hoch bzw wo die kamera noch zusätzlich verschoben werden soll.

mit AD nimmt der fCAMangleX wert zu bzw. ab mit WS der z wert und mit RF der y wert. leider freaked das sehr merkwürdig herum :(
ich schau morgen,dass ich vl nochmal ne ordentliche cam zusammenbekomme, dann kann ich dir sagen obs funktioniert hat :)

danke jedenfalls dot

4

09.04.2007, 11:00

hoi hoi :)

also 1) ich hab endlich die viewmatrix verstanden^^

2) das billboarding funzt weiterhin nicht :(

ich zeig euch mal kurz screenshots

und hier kurz noch die quellcodepassage, wo die matrizen gesetzt werden

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f, 0.0f, -5.0f), 
                                                             &D3DXVECTOR3(fCAMangleX, 0.0f, 0.0f), 
                                                             &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
  g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);

    // Create world matrix

    D3DXMatrixIdentity(&matWorld);
    g_pD3DDevice->GetTransform(D3DTS_VIEW, &matView);
    D3DXMatrixTranslation(&matTrans, 0.0f, 0.0f, 0.0f);
    D3DXMatrixTranspose(&matView, &matView);
    D3DXMatrixMultiply(&matWorld, &matView, &matTrans);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);



hier das ausgangsbild, die cam schaut 90° auf die szene

(Link)


hier,wenn sich die entlang der x achse schaut (x wert != 0.0f), der baum sollte eigentlich die kamera anschauen, aber nein^^

(Link)




P.S.: hab es mit inverse auch schon versucht dot, da kommt ein sehr merkwürdiges ergebnis raus, was WEIT von dem tatsächlichen ergebniss weg ist^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.04.2007, 12:03

transpose ist aber schlichtweg falsch.

außderdem denk ich, dass deine multiplikationsreihenfolge falsch is:

C-/C++-Quelltext

1
2
3
4
5
6
    D3DXMatrixIdentity(&matWorld);
    g_pD3DDevice->GetTransform(D3DTS_VIEW, &matView);
    D3DXMatrixTranslation(&matTrans, 0.0f, 0.0f, 0.0f);
    D3DXMatrixInverse(&matView, &matView);
    D3DXMatrixMultiply(&matWorld, &matTrans, &matView);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);

6

09.04.2007, 14:05

k also :)

hier wenn ich die camera bewege und von der seite z.b. reinschaue

(Link)


hier wenn ich o drücke für die billbOardcamera :D

(Link)


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if(GetAsyncKeyState('O')) {

        // Create world matrix

        D3DXMatrixIdentity(&matWorld); 
        g_pD3DDevice->GetTransform(D3DTS_VIEW, &matView); 
        D3DXMatrixTranslation(&matTrans, 0.0f, 0.0f, 20.0f); 
        D3DXMatrixInverse(&matView,NULL, &matView); 
        D3DXMatrixMultiply(&matWorld, &matTrans, &matView); 
        g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld); 
    }


das wars anscheinend :)

thx wieder mal an dot^^

Werbeanzeige