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

BasicMan01

Frischling

  • »BasicMan01« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Nürnberg

Beruf: Webanwendungsentwickler

  • Private Nachricht senden

1

15.10.2009, 19:08

Koordinaten nach Welttransformation bei Picking

Hallo alle miteinand,

ich habe in meinem 3D-Raum einige Würfel angeordnet, wobei die Position denen der Vertexdaten entspricht. Jeden Würfel kann ich mit meiner Maus auch anklicken. Alles wunderbar.

Nun hab ich aber ein paar Verschiebegeschichten eingebaut, die ich über die Transformation der Weltmatrix realisiere und dann dazu noch ein paar Rotationen. Dadurch ändert sich natürlich die Position der Würfel im 3D-Raum und mein Picking funktioniert nicht, weil ich immer noch die Ursprungsvertexdaten verwende.

Wie komm ich denn jetzt an die neuen Daten? Kann man die irgendwo auslesen oder muss man diese separat errechnen?

Danke schonmal für die Hilfe.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

15.10.2009, 19:25

Du kannst den Strahl den du vom rückprojizieren bekommst mit der inversen Weltmatrix transformieren und diesen dann zum Picking verwenden.

BasicMan01

Frischling

  • »BasicMan01« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Nürnberg

Beruf: Webanwendungsentwickler

  • Private Nachricht senden

3

15.10.2009, 20:27

ich hab nun ein wenig herumprobiert und den Ortsvektor sowie den Richtungsvektor meiner Maus mit der inversen Weltmatrix transformiert und das Ergebnis dann zum Picking verwendet

C-/C++-Quelltext

1
2
3
D3DXMatrixInverse(&matWeltInvers, NULL, &matWelt);
D3DXVec3TransformNormal(&vMoveRayDir, &vMoveRayDir, &matWeltInvers);
D3DXVec3TransformNormal(&vMoveRayOrig, &vMoveRayOrig, &matWeltInvers);


Im ersten Ansatz scheint dieses so zu funktionieren :)
Ich hoffe, es war auch so gemeint *g*

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.10.2009, 20:55

Da hast du Glück dass das geht. Im Prinzip is deine Vorgehensweise schon richtig aber RayOrig musst du eigentlich mit D3DXVec3TransformCoord() transformieren (weils ein Punkt ist und keine Richtung) und bei RayDir passt zwar das mit D3DXVec3TransformNormal() aber der Funktion musst du die Inverse Transponierte der Matrix die du verwenden willst übergeben:

C-/C++-Quelltext

1
2
3
4
D3DXMatrixInverse(&matWeltInvers, 0, &matWelt);
D3DXVec3TransformCoord(& vMoveRayOrig, & vMoveRayOrig, &matWeltInvers);
D3DXMatrixTranspose(&matWeltTranspose, &matWelt);
D3DXVec3TransformNormal(&vMoveRayDir, &vMoveRayDir, &matWeltTransp); 

BasicMan01

Frischling

  • »BasicMan01« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Nürnberg

Beruf: Webanwendungsentwickler

  • Private Nachricht senden

5

15.10.2009, 21:26

ja, du hast Recht ... es war Glück :?
Bei einer einfachen Rotation um die Y-Achse fällt es wohl nicht sehr ins Gewicht.
Erst bei einer wirklichen Verschiebung beispielsweise auf der X-Achse hat meine Möglichkeit nämlich garnimmer funktioniert.

Danke für die Hilfe *freu*

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.10.2009, 21:29

Zitat von »"BasicMan01"«

Erst bei einer wirklichen Verschiebung beispielsweise auf der X-Achse hat meine Möglichkeit nämlich garnimmer funktioniert.


Jap, genau dann (Verschiebung) is der Spezialfall bei dem dein Code auch funktioniert nimmer gegeben. Naja, ich hoff es geht jetzt :)

Werbeanzeige