JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=482d0ea13b8b3f589fd5269623a25814Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Immer noch TRansformationsproblem mit der Maus
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 15.07.2003, 21:11    Titel: Immer noch TRansformationsproblem mit der Maus Antworten mit Zitat

Abend alle zusammen,

ich hab wieder ein Problem mit 3D-Mathe. Ich moechte diesmal die Pickingroutine so veraendern, dass ich Objekte im 3D-Space per Maus bewegen kann. Ich meine per Tastaur isses kein Thema Wink.

Also hab ich die Mauskoordinaten wieder wie beim Picking in Worldkoordinaten umgesetzt, Normalisiert und jetzt - tja jetzt Problem. Die Sache ist, dass ich eben nur einen "Strahl" in die 3D-Welt in Abhaengigkeit der Kamera erzeugen kann. Wie aber kriege ich die virtuellen Koordinaten, wo die Maus hinging? Beim Picking gehe ich ja automatisch davon aus, dass der Strahl bis ans Ende des Screens geht (und berechne alles, was geschnitten wird), mit der Ausrichtung der Weltkoordinaten von MausX und MausY, aber keinen bestimmten Punkt in der 3D-Welt hat (tja dieses Vektorproblem Wink)

Fuer nen Vorschlag wie immer dankbar ich waere... Wink


Zuletzt bearbeitet von X-FILE am 22.07.2003, 10:48, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 15.07.2003, 21:35    Titel: Antworten mit Zitat

Ich kannte mal ein 3D-Renderprogramm, dass dieses Problem folgendermaßen löste:
Man konnte die Maus in 3 Richtungen bewegen. Die Horizontale bleibt dabei die X-Richtung, die Vertikale die Y-Richtung. Drückte man zusätzlich eine Taste (Strg z.B.) verwandelte sich die vertikale Bewegung in die Z-Richtung in den Screen Hinein oder Hinaus. Die Koordinaten wurden in der Statusleiste angezeigt.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 09:59    Titel: Hmmm Antworten mit Zitat

Hallo,

waere eine Option, aber fuer ein Spiel nicht gerade tragbar? Ich hatte mir auch ueberlegt, dass man bei Strategiekarten auch moderner Strategiegames wie Warcraft3 oder C&C:G****** ja prinzipiell auf eine Karte klickt und nicht wild in den Raum? Kann man da vielleicht was ableiten? Obwohl auch bei Warcraft direkt in den Raum geklickt werden kann und es geht. Ich cheks nicht. Zumal das direkte Problem ja eher das ist, die Z-Koordinate zu setzen (vielleicht ein Standardwert von 5 im unteren Bildschirmbereich und 10 im Oberen? Wink)

Ohhh man verzweifel......
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 10:29    Titel: Antworten mit Zitat

Klickst du tatsächlich in den Raum? Oder irgendwo auf dem Untergrund?
Man könnte ja noch den Strahl z.B. 10 m geradeaus und dann senkrecht nach unten nehmen....

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 11:02    Titel: Antworten mit Zitat

Hallo Christian,

nein ich klicke in der Tat in den Imaginaeren Untergrund (mehr oder weniger).
Ich habe das Problem testhalber mit einer "Bruteforce"-Methode geloest, indem ich einfach den Bildschirm unterteile und vorausgesetze Werte fuer Z zuweise. Das is aber dermassen ungenau, dass das gar nicht geht.

Was meintest du? Das man feststellt, ueber welchem Dreieck des Bodens sich die Maus befindet und dass dann als Referenz fuer Z nimmt? Hoffe nicht, wiel ich wieder mal ned wuesste, wie ich das umsetzen sollte Wink)

Nachtrag:
Es bleibt eh noch ein kleines Problem, was du eh schon angesprochen hattest. Die aktuelle Worldmatrix beim Picking. Im Moment der Transformation eines Objekts, funktioniert das Picking nicht mehr...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 22:08    Titel: HMMM Antworten mit Zitat

Abend,

ihc hatte mit meinem Ansatz doch keinen so großen Erfolg. Hat ueble Nebenwirkungen wenn man scrollt. Hat denn keiner einer Vorschlag, wie sich das loesen lies? Ich dachte sogar schon an die baryzentrischen Koordinaten, aber das ging auch nicht. Ziemlich dumme Sache.

Ich habe einfach keine Ahnung, wie ich einfach die Koordinaten bestimmen kann im Raum, resp. als Schnittpunkt mit einer Plane. Oder besser woher ich die nehme. D3DXIntersect gibt ja eigentlich genug zurueck, aber nix davon taugt. Oder ich machs falsch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 22.07.2003, 10:57    Titel: Hmm Antworten mit Zitat

Hallo an Alle,

gibts denn niemanden, der schon mal aehnliches Problem loesen musste? Ich persoenlich dachte, dass es nicht so schwer ist, Objekte zu verschieben per Maus, aber es geht nicht.
Ich habe es jetzt mit der Funktion D3DXIntersect gemacht, weil ich dachte, dass die genau das zurueckgibt, was ich will.

Ich habe aehnlich wie beim Picking einen Strahl generiert, der in die Welt "hinaus" geht. Dann teste ich per D3DXIntersect, ob er auf ein Dreieck der Grundflaeche (ein Terrain als X-Modell) trifft. Ist das der Fall, beginnen hier die Probleme. Ich dachte eigentlich, dass ich die Baryzentrischen Koordinaten nehmen koennte, die D3DXIntersect fuellt, weils ja genau das ist was ich will. Aber das geht nicht. Jedesmal wenn ich dann in den Raum klicke, schiebt er das Objekt an eien bestimmte Stelle, die a; nicht stimmt und b; nur einmal aufgesucht wird.

Keiner einer Idee, wies anders gehen koennte?? Liegts vielleicht daran, dass ich Christians SetPosition Funktion mit den Koordinaten fuelle und irgendwas vergesse? Nochmal eine Matrixtransformation oder was?

Danke vielmals,

Karl
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 22.07.2003, 11:47    Titel: Antworten mit Zitat

Eigentlich sollte es genau so, wie du es beschreibst funktionieren. Vielleicht habe ich ja in den nächsten Tagen etwas Zeit mal ein Beispiel zu programmieren.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 22.07.2003, 12:26    Titel: Hmm dumm aber ich lieg wohl daneben ;)) Antworten mit Zitat

Hallo,

irgendwo liegt der Fehler bei mir. Ich bin jetzt mal die Koordinaten aller "Strahlen" durchgegangen (noch vor D3DXIntersect) und siehe da habe festgestellt, dass zuerst der Initiativstrahl = 0 war. Beseitigt. Jetzt ist aber der Richtungsstrahl = 0. Und das verstehe ich nicht.



Code:

    D3DXMATRIX ProjectionMatrix;
    D3DXMATRIX ViewitMatrix;

    // Projektionsmatrix
   m_lpD3DDevice->GetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
   //ViewMatrix
   m_lpD3DDevice->GetTransform(D3DTS_VIEW, &ViewitMatrix);
   

   // Move-Vektor konstruieren
   D3DXVECTOR3 v;
   v.x =  ( ( ( 2.0f * x ) / Width  ) - 1 ) / ProjectionMatrix._11;
   v.y = -( ( ( 2.0f * y ) / Height ) - 1 ) / ProjectionMatrix._22;
   v.z =  1.0f;

   D3DXVECTOR3 vMoveRayDir;
   D3DXVECTOR3 vMoveRayOrig;

   D3DXMATRIXA16   CombinedMove;

   CombinedMove = m_MWorldMatrix * ViewitMatrix;

   D3DXMatrixInverse(&CombinedMove, NULL, &CombinedMove);

   vMoveRayDir.x = v.x * CombinedMove._11 + v.y * CombinedMove._21 + v.z * CombinedMove._31;
   vMoveRayDir.y = v.x * CombinedMove._12 + v.y * CombinedMove._22 + v.z * CombinedMove._32;
   vMoveRayDir.z = v.x * CombinedMove._13 + v.y * CombinedMove._23 + v.z * CombinedMove._33;
   vMoveRayOrig.x = CombinedMove._41;
   vMoveRayOrig.y = CombinedMove._42;
   vMoveRayOrig.z = CombinedMove._43;

   sprintf(strbuffer2, "Mauskoordinaten zur Zeit des Klicks: %2f, %2f %2f", (float)vMoveRayDir.x, (float)vMoveRayDir.y, (float)vMoveRayDir.z);


Wenn ich den Buffer ausgebe, gibts bei mir immer nen Koordinatenpaar von 0.000 usw. sollte aber doch laut meines Verstaendnisses irgendwo zischen -1 und 1 sein? Wo hab ich denn da was uebersehen?

Karl
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 11:34    Titel: Hmmm Antworten mit Zitat

Hallo,

muss wieder was dazu schreiben. Ich habe das PRoblem Oben jetzt auch geloest. Lag an einer falschen WorldMatrix. Jetzt bin ich endlich soweit, dass ich die Baryzentrischen Koordinaten bekomme.
Da ja aber Baryzentrische Koordinaten U und V sind ist das ja Tiefe und Breite, oder? Nur warum sind diese Koordinaten ebenso klein, wie der umgesetze Strahl? Ich meine zw. 0.8 und 0.001. Das kann doch nicht stimmen? Wenn ich jetzt ein Objekt direkt an die Stelle bewege, habe ich ja wieder nur eine Minimalbewegung. Ich weiß ned weiter. Vor allem brauch ich ja x, y und z. Und da fehlts dann wieder.

Code:


Hier mal meine Funktion:

void CScene::MoveMesh(int x, int y, int Width, int Height)
{
   sprintf(strbuffer, "Mauskoordinaten zur Zeit des Klicks: %i, %i", (int)x, (int)y);

   D3DXMATRIX ProjectionMatrix;
    D3DXMATRIX ViewitMatrix;

    // Projektionsmatrix holen
   m_lpD3DDevice->GetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
   //ViewMatrix holen
   m_lpD3DDevice->GetTransform(D3DTS_VIEW, &ViewitMatrix);

   m_lpD3DDevice->GetTransform(D3DTS_WORLD, &m_MWorldMatrix);
   

   // Move-Vektor konstruieren (Screen Space)
   D3DXVECTOR3 v;
   v.x =  ( ( ( 2.0f * x ) / Width  ) - 1 ) / ProjectionMatrix._11;
   v.y = -( ( ( 2.0f * y ) / Height ) - 1 ) / ProjectionMatrix._22;
   v.z =  1.0f;

   //sphere.MoveObject(&v, &ViewitMatrix);

   D3DXVECTOR3 vMoveRayDir;
   D3DXVECTOR3 vMoveRayOrig;

   D3DXMATRIXA16   CombinedMove;

   CombinedMove = m_MWorldMatrix * ViewitMatrix;

   D3DXMatrixInverse(&CombinedMove, NULL, &CombinedMove);

   vMoveRayDir.x = v.x * CombinedMove._11 + v.y * CombinedMove._21 + v.z * CombinedMove._31;
   vMoveRayDir.y = v.x * CombinedMove._12 + v.y * CombinedMove._22 + v.z * CombinedMove._32;
   vMoveRayDir.z = v.x * CombinedMove._13 + v.y * CombinedMove._23 + v.z * CombinedMove._33;
   vMoveRayOrig.x = CombinedMove._41;
   vMoveRayOrig.y = CombinedMove._42;
   vMoveRayOrig.z = CombinedMove._43;

   BOOL  bHit;
    DWORD dwMFace;
    FLOAT fMBary1, fMBary2, fMDist;

   LPD3DXMESH pMesh = terrain.GetMesh();

   struct MOVEINTERSECTION
   {
      DWORD dwMFace;
      FLOAT fMDist;
      FLOAT fMBary1, fMBary2;
      FLOAT tu, tv;
   };

   MOVEINTERSECTION MoveIntersection;

   D3DXIntersect(pMesh, &vMoveRayOrig, &vMoveRayDir, &bHit, &dwMFace, &fMBary1, &fMBary2, &fMDist, NULL, NULL);
   
   if(bHit)
    {
      MoveIntersection.dwMFace = dwMFace;
        MoveIntersection.fMBary1 = fMBary1;
        MoveIntersection.fMBary2 = fMBary2;
        MoveIntersection.fMDist  = fMDist;

      sprintf(strbuffer2, "Mauskoordinaten zur Zeit des Klicks: %2f, %2f, %2f", (float)MoveIntersection.fMBary1,
         (float)MoveIntersection.fMBary2, (float)fMDist);

      sphere.SetMeshPosition(D3DXVECTOR3(fMBary1, fMBary2, fMDist));
 
       
   }

}



Darf ich die Koordinaten nicht direkt setzen??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 13:08    Titel: Antworten mit Zitat

Aus der DirectX-Hilfe:

Zitat:

The D3DXIntersect function provides a way to understand points in and around a triangle, independent of where the triangle is actually located. This function returns the resulting point by using the following equation: V1 + U(V2-V1) + V(V3-V1).

Any point in the plane V1V2V3 can be represented by the barycentric coordinate (U,V). The parameter U controls how much V2 gets weighted into the result and the parameter V controls how much V3 gets weighted into the result. Lastly, 1-U-V controls how much V1 gets weighted into the result.

Barycentric coordinates are a form of general coordinates. In this context, using barycentric coordinates represents a change in coordinate systems. What holds true for Cartesian coordinates holds true for barycentric coordinates.


D.h. du musst mit den Koordinaten noch rechnen. Dein genauer Trefferpunkt ist:

Code:

pHitVec->x = pTriangle[0].x + fBary1 * (pTriangle[1].x-pTriangle[0].x) + fBary2 * (pTriangle[2].x-pTriangle[0].x);
pHitVec->y = pTriangle[0].y + fBary1 * (pTriangle[1].y-pTriangle[0].y) + fBary2 * (pTriangle[2].y-pTriangle[0].y);
pHitVec->z = pTriangle[0].z + fBary1 * (pTriangle[1].z-pTriangle[0].z) + fBary2 * (pTriangle[2].z-pTriangle[0].z);


wobei pHitVec der Vektor zum geklickten Punkt ist, pTriangle ist das Dreieck, auf das geklickt wurde und fBary1 und fBary2 sind die baryzentrischen Koordinaten.

Christian


Zuletzt bearbeitet von Christian Rousselle am 23.07.2003, 20:58, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 14:37    Titel: Hmmm Antworten mit Zitat

Hallo,

verstehe ich nicht so ganz jetzt. Was ist pHit? Ein Vektor, oder Tatsaechlich der BOOL-Wert aus der Hilfe (sinnlos?)? Oder eine Koordinate (macht ja keinen Sinn, wenn man x,y,z braucht)
Ansonsten ok. Ich denk das macht dann Sinn... Wink


Zuletzt bearbeitet von X-FILE am 23.07.2003, 14:49, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 14:49    Titel: Antworten mit Zitat

pHit, V1, V2, V3 sind Vektoren
U, V sind Skalare
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 14:55    Titel: Seufz Antworten mit Zitat

Ok pHit laesst sich ja dann deklarieren, aber was ist mit den Vs?? Wo nimmt man die denn her?
D3DXIntersect gibt ja nur den Face-Container zurueck. Aber damit kann ich ja nix anfangen in dem Fall??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 15:14    Titel: Antworten mit Zitat

Question In meinem Beispiel wird das Dreieck doch auch markiert. V1,V2,V3 sind die Eckpunkte dieses Dreiecks
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum