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

Griesser

Frischling

  • »Griesser« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

1

13.08.2006, 00:36

2D Mausposition in 3D Koordinaten

Hallo zusammen!

Zunächst meine grundlegenden Infos:
- DirectX 9 nur im Fenstermodus
- Visual C++ 6.0
- MDI Umgebung
- Fenster vergrößerbar
- <= 0 Ahnung von Matrizen (fast)

Nun zum Problem:
Wie kann ich die 2D Mauskoordinaten so umrechnen, dass sie passend zu
meiner View-, World- und Projektionsmatrix die entsprechenden 3D Koordinaten liefern?

Die Funktion zum Errechnen des Strahles hab ich schon. Was muss ich
weiters machen um zu meinen gewünschten Koordinaten zu kommen?
Von meinen verwendeten Klassen nicht abschrecken lassen, funktionieren
im Prinzip gleich wie Scherfgens Klassen bzw. die von DirectX.

C-/C++-Quelltext

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
inline void CProGiDisplay::DeviceToDatabase(const CPoint &ptDevice, CProGePoint &ptDatabase)
{
    double x = ptDevice.x, y = ptDevice.y;
    CRect clipRect;
    m_pWnd->GetClientRect(clipRect);
        //Länge/Breite des Client-Fensters

    double dWidth = clipRect.Width();
    double dHeight = clipRect.Height();

    CProGeMatrix proj, view, InvView;
        //Projektions- und Weltmatrix

    m_gi->GetProjection(proj);
    m_gi->GetWorld(view);

    CProGeVector v;
    v.m_x = (((2 * x) / dWidth ) - 1) / proj.m11;
    v.m_y = -(((2 * y) / dHeight) - 1) / proj.m22;
    v.m_z = 1;

    InvView = view.Inverse();
    CProGeVector dir, origin;
    dir.m_x = v.m_x * InvView.m11 + v.m_y * InvView.m21 + v.m_z * InvView.m31;
    dir.m_y = v.m_x * InvView.m12 + v.m_y * InvView.m22 + v.m_z * InvView.m32;
    dir.m_z = v.m_x * InvView.m13 + v.m_y * InvView.m23 + v.m_z * InvView.m33;
    
    dir.Normalize();

    origin.m_x = InvView.m41;
    origin.m_y = InvView.m42;
    origin.m_z = InvView.m43;

    // TODO??

        // und nun?


    ptDatabase = dir;
}


Bin für jede Hilfe dankbar!

Markus[/cpp][/code]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.08.2006, 00:41

Teste, ob der Strahl irgendwelche Objekte trifft.
2D-Koordinaten in 3D-Koordinaten eindeutig umzurechnen ist natürlich unmöglich, denn jeder 2D-Koordinate entsprechen unendlich viele 3D-Koordinaten (die alle auf dem Strahl liegen, den du berechnet hast). Was du jetzt damit machst, ist deine Sache.

Griesser

Frischling

  • »Griesser« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

3

13.08.2006, 00:58

Danke für deine Antwort. Aber ich denke da zum Beispiel an diverse
CAD Programme (AutoCAD), die entsprechende Koordinaten darstellen.
Mir ist klar das mir in der Draufsicht z.B. die z-Koordinate fehlt, aber
x und y können doch korrekt berechnet werden.

Der Status ist doch so:
- Meine Mauskoordinaten sind in Pixel, relativ zu meinem Fenster
(ScreenToClient)
- DirectX zeichnet die Daten in seiner 3D-Welt mit verschiedenen
Tranformationen

Dazwischen muss es doch eine Möglichkeit geben das Ganze umzurechnen.
Also mein 2D-Zeugs zu 3D (mit der oben genannten Einschränkung natürlich)
oder liege ich da komplett falsch?

Markus

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

13.08.2006, 09:22

Zitat von »"Griesser"«

Dazwischen muss es doch eine Möglichkeit geben das Ganze umzurechnen.
Also mein 2D-Zeugs zu 3D (mit der oben genannten Einschränkung natürlich)
oder liege ich da komplett falsch?

Genau das hast du doch in deiner Funktion schon gemacht.
Nur was du jetzt damit machen willst, musst du wissen.

Griesser

Frischling

  • »Griesser« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

5

13.08.2006, 10:57

Dann verstehe ich nicht, warum mir die Funktion immer die selben Werte
liefert...

C-/C++-Quelltext

1
2
double dWidth = clipRect.Width();
double dHeight = clipRect.Height();


Diese beiden Werte ändern sich je nach Größe des Fenster (resizeable).

C-/C++-Quelltext

1
2
m_gi->GetProjection(proj);
m_gi->GetWorld(view);


proj ist Projektionsmatrix, im aktuellen Fall die Einheitsmatrix.
view ist die Kameramatrix, im aktuellen Fall auch die Einheitsmatrix.

Wenn ich nun hinein- oder herauszoome, bzw. die Kamera verschiebe,
müsste sich das Ergebnis doch verändern, oder?
Die Objekte die ich über DirectX darstellen lasse werden jedenfalls
korrekt gezoomt bzw. verschoben, je nachdem was ich mit der Kamera
mache.

dir.m_x und dir.m_y bleiben aber immer im selben Bereich.
Zwischen -0.842 und +0.842 (x) und -0.7 und +0.7 (y).

Wenn ich hineinzoome sollte der Bereich von x und y kleiner werden...

Griesser

Frischling

  • »Griesser« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

6

28.08.2006, 21:00

Hat vielleicht jemand eine Idee was ich da machen soll, oder habe ich einen
Denkfehler?
Bin für jede Hilfe dankbar!

7

29.08.2006, 17:49

Google einfahc danach ... dazu gibt es soviele Lösungen ... auch in andern Programmiersprachen ... das ist aber egal da es bei allen im Grunde gleich funktioniert ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Griesser

Frischling

  • »Griesser« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Villach

Beruf: Programmierer

  • Private Nachricht senden

8

29.08.2006, 21:11

Ich habe danach gegoogelt und ich google noch immer danach :(
Vielleicht such ich ja nicht nach den richtigen Stichwörtern aber was
ist falsch an "2D Koordinaten zu 3D" in allen mir bekannten Sprachen
und Kombinationen...
Hast du vielleicht einen Link für mich?

Danke

9

29.08.2006, 22:17

Hmm? Im Grunde suchst du nach nix anderem als "Picking" ... ja k mit picking versuchst du dann auch noch ein object damit eindeutig auszuwählen ... aber sonnst sehr ähnlich ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

10

30.08.2006, 16:34

Warum guckst du nicht in der directx sample dings bums nach? da gibts ein ausführliches beispiel zu genau dem thema(picking). also ich habs damit hinbekommen...
Gruß vincent
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Werbeanzeige