![JLI Spieleprogrammierung Foren-Übersicht](templates/subSilver/images/jlilogo.jpg) |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 15.07.2003, 21:11 Titel: Immer noch TRansformationsproblem mit der Maus |
|
|
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 .
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 )
Fuer nen Vorschlag wie immer dankbar ich waere... ![Wink](images/smiles/icon_wink.gif)
Zuletzt bearbeitet von X-FILE am 22.07.2003, 10:48, insgesamt einmal bearbeitet |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
AFE-GmdG JLI MVP
![JLI MVP JLI MVP](http://www.jliforum.de/images/mvp.gif)
![](http://jliforum.de/afe-gmdg/anthill.png)
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 15.07.2003, 21:35 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 16.07.2003, 09:59 Titel: Hmmm |
|
|
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? )
Ohhh man verzweifel...... |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Christian Rousselle Site Admin
![](http://www.jliforum.de/images/spiderman.png)
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 16.07.2003, 10:29 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 16.07.2003, 11:02 Titel: |
|
|
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 )
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 16.07.2003, 22:08 Titel: HMMM |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 22.07.2003, 10:57 Titel: Hmm |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Christian Rousselle Site Admin
![](http://www.jliforum.de/images/spiderman.png)
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 22.07.2003, 11:47 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 22.07.2003, 12:26 Titel: Hmm dumm aber ich lieg wohl daneben ;)) |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 23.07.2003, 11:34 Titel: Hmmm |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Christian Rousselle Site Admin
![](http://www.jliforum.de/images/spiderman.png)
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 13:08 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 23.07.2003, 14:37 Titel: Hmmm |
|
|
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](images/smiles/icon_wink.gif)
Zuletzt bearbeitet von X-FILE am 23.07.2003, 14:49, insgesamt einmal bearbeitet |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Christian Rousselle Site Admin
![](http://www.jliforum.de/images/spiderman.png)
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 14:49 Titel: |
|
|
pHit, V1, V2, V3 sind Vektoren
U, V sind Skalare |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 23.07.2003, 14:55 Titel: Seufz |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Christian Rousselle Site Admin
![](http://www.jliforum.de/images/spiderman.png)
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 15:14 Titel: |
|
|
In meinem Beispiel wird das Dreieck doch auch markiert. V1,V2,V3 sind die Eckpunkte dieses Dreiecks |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|