![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: 12.07.2003, 00:38 Titel: Pick Routine fuer Modelle |
|
|
Hallo,
ich bin grad ganz neu hier, hab aber schon interessante Sachen rausgefunden beim durchstoebern.
Jetzt hab ich aber gleich selbst eine Frage und ich hoffe echt instaendig, dass mir jemand helfen kann!! Ich suche schon seit Ewigkeiten nach einer Loesung.
Und zwar hab ich auf Basis der Zweiten Ausgabe des Buches von hier ein "Spielprogramm" zusammengebastelt, mit dem ich einfach lernen wollte. ICh hab alles geschafft, was ich wollte, bis auf eine "Pick" Routine. Also eine Funktion, die mich die X-Files am Screen anwaehlen laesst (Strategiegame laesst grueßen ). Ich schaffe es einfach nicht diese vernuenftig zu implementieren, da ich bei meinem Ansatz Zeiger brauche, die ich nicht bekomme. Ich habe schon die Inverse Matrix berechnet, ich habe also Mauskoordinaten in Weltkoordinaten gewandelt usw. Aber ich bekomme keine Objektzugehoerigkeit.
Ich kann selbstverstaendlich den Code hier reinstellen (oder per Mail schicken), wenn sich jemand damit befassen kann und helfen will. *seufz*
Fuer Unterstuetzung waere ich echt superdankbar. Ansonsten bleibt nur vom Hochhaus huepfen ))
Vielen Dank... im Voraus. |
|
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: 12.07.2003, 07:36 Titel: |
|
|
Hallo,
hast du dir die Methode D3DXIntersect() mal angeschaut? Wenn du sonst alles berechnet hast und miz X-Files (Meshes) arbeitest, solltes es gehen.
Christian |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 12.07.2003, 10:18 Titel: Danke... ;) |
|
|
Hallo,
ja die hatte ich angesehen. Die benutze ich auch. Das dumme ist nur, dass ich wei gesagt das ganze System auf dem Prinzip des Buches aufgebaut habe (war ja mein erst mein Zweites D3D_Projekt). Damit ergibt sich das Problem, die D3DXIntersect Methode in der Klasse fuer 3DObjekte zu machen, die Umrechnung aber in der Klasse der Scene (wg der Matrizen). Das passt jetzt aber nicht mehr zusammen, da das eine ohne das andere nicht kann (die Matrizen brauchen nen Meshpointer und das Intersect braucht die Matrizen). Also entweder bin ich zu doof, oder ich weiß einfach nicht weiter. Zusammenlegen geht auch nicht, hab ich schon probiert.
Kann sichs vielleicht jmd. mal ansehen? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
The Lord of Programming Living Legend
![](http://extern.visualgamesentertainment.net/ava_vge.png)
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.07.2003, 10:55 Titel: |
|
|
Ich kenn mich zwar noch nicht mit D3D aus, aber ich würde mir an deiner Stelle einfach überlegen, wie man es in 2D machen kann. Wenn du das grob umrissen hast, versuchst du, es in 3D umzuwandeln.
Wahrscheinlich hast du X-,Y-(und vielleicht auch Z-) Koordinaten für jede Einheit. Diese Koordinate wird dann im Bezug auf das Weltkoord.-system berechnet.
Jetzt musst du eben die Mauskoordinaten im Bezug auf die Scrollposition in Weltkoordinaten umwandeln und mit den Koordinaten der Einheiten vergleichen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 12.07.2003, 11:11 Titel: Hmmm |
|
|
Hi,
naja. Die Sache ist so, dass ich das Prinzip ganz gut habe. Ich erstelle in meiner Szenenklasse einfach eine Berechnung der Mauskoordinaten in Weltkoordinaten und pruefe dann in einem durchlauf, ob ich einen Mesh erwischt habe. Dann geht das Ergebnis an die Meshklasse weiter, die dann jeweils einen genauen Test mit den Meshoberflaechen macht (D3DXIntersect) wo ich denn getroffen habe und wie weit das MEsh entfernt is vom NClipping. Und dann gehts wieder von vorne los. So weit so gut. Aber das ist nicht das Problem (also die Funktionsweise). Sondern die Implementierung ist das Problem!
Da ich eben die Funktionalitaet nur in zwei Klassen realisieren kann, diese aber einen oder mehrere Pointer austauschen muessen. Und genau DA (Pointer) liegt das Problem. Ich weiß einfach nicht, wie ich das machen soll. Ich habs mit allem probiert. Listen, Pointersending usw. usw. Ich kann es einfach nicht, aber die Loesung soll angeblich einfach sein?? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
The Lord of Programming Living Legend
![](http://extern.visualgamesentertainment.net/ava_vge.png)
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.07.2003, 11:36 Titel: |
|
|
Was ist denn konkret das Problem bzw. was kannst du technisch nicht machen?
Und wozu brauchst du da Pointer?
Hier mal ein anschauliches Beispiel:
Code: | int x[anzahl_der_einheiten];
int y[anzahl_der_einheiten];
int scrollX=0;
int scrollY=0;
//In d. Renderfunktion
int renderkoordX=x-scrollX;
int renderkoordY=y-scrollY;
//In der Callbackfunktion oder Inputfunkiton
//Mausposition rausfinden
int clickposInWorldX=mausPosX+scrollX;
int clickposInWorldY=mausPosY+scrollY;
//Überprüfen
//wenn clickposInWorldX zw. x[] und x[]+einheitenbreite
//und clickposInWorldY zw. y[] und y[]+einheitenhoehe liegt
//Einheit ausgewählt |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
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: 12.07.2003, 12:27 Titel: |
|
|
Ich werde mal was zusammenbauen, mit welchen Beispiel arbeitest du? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 12.07.2003, 14:32 Titel: Hmm |
|
|
Hallo,
wow, Herr Rousselle persoenlich. Ist mir oben gar nicht aufgefallen.
Ich stelle mal rein, was ich meine:
Code: |
Funktion in C3DObjekt:
C3DObjekt* C3DObjekt::Pick(D3DXVECTOR3 *pvNear, D3DXVECTOR3 *pvDir, float MaxDist, C3DObjekt *pObj)
{
//die Selektierflag nullsetzen
m_bHit = FALSE;
//haben wir ein Mesh?
if(m_lpMesh)
{
//falls ja, den Strahl in Modellkoordinaten umsetzen
D3DXVECTOR3 vNear, vDir;
D3DXMATRIX invMat;
D3DXMatrixInverse(&invMat, NULL, &m_combinedMatrix);
D3DXVec3TransformCoord(&vNear, pvNear, &invMat);
D3DXVec3TransformNormal(&vDir, pvDir, &invMat);
//testen ob Ueberschneidung besteht
BOOL bHit;
DWORD dwIndex;
float u,v;
float dist;
D3DXIntersect(m_lpMesh, &vNear, &vDir, &bHit, &dwIndex, &u, &v, &dist, NULL, NULL);
if(bHit)
{
//eine Ueberschneidung - jenseits der Far Clipping?
if(dist<MaxDist)
{
//nein - gabs vorher schon einen treffer?
if(pObj)
{
//falls ja, ist dieser naeher dran?
if(pObj->m_fHitDist>dist)
{
//ja, dann loesche Selektflag von vorherigem Objekt
pObj->m_bHit=FALSE;
//setze neuen Selektflag
m_bHit=TRUE;
if(m_bHit == TRUE)
{
MessageBox(0,"Objektflag korrekt gesetzt 1","Meldung", MB_OK);
}
//speicher distanz zum treffer
m_fHitDist = dist;
//setze Objekttrefferpointer um auf das Objekt zu zeigen
pObj=this;
}
//nein das ist der erste treffer
}
else
{
//setze die Trefferflag
m_bHit=TRUE;
if(m_bHit == TRUE)
{
MessageBox(0,"Objektflag korrekt gesetzt","Meldung", MB_OK);
}
//speichere die Distanz in Ueberschneidung
m_fHitDist = dist;
//setze Objekttrefferpoint um auf dieses (this) Objekt zu zeigen
pObj=this;
}
}
}
}
return pObj;
}
Funktion in CScene:
void CScene::PickMesh()
{
DWORD m_dwNumIntersections = 0L;
SetCapture(hWnd);
//Den Auswahlstarhl von der aktuellen Mausposition abfragen
if( GetCapture() )
{
m_lpD3DDevice->GetTransform( D3DTS_PROJECTION, &ProjMatrix);
POINT ptCursor;
GetCursorPos( & ptCursor);
ScreenToClient(hWnd, & ptCursor);
//Vektor erstellen, den der Auswahlstrahl zurueckgibt
D3DXVECTOR3 v;
v.x = (((2.0f * ptCursor.x) / SCR_WEITE)-1) / ProjMatrix._11;
v.y = (((2.0f * ptCursor.x) / SCR_HOEHE)-1) / ProjMatrix._22;
v.z = 1.0f;
//Die inverse ViewMatrix
m_lpD3DDevice->GetTransform(D3DTS_VIEW, &m_ViewMatrix);
D3DXMatrixInverse(&m , NULL, &m_ViewMatrix);
//Transformieren des Bildschirmauswahlstrahls(Koords) in 3D-Weltkoords
vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
D3DXVec3Normalize(&vPickRayDir, &vPickRayDir);
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
sprintf(strbuffer, "Matrixdaten: %2f, %2f, %2f", (float)vPickRayDir.x, (float)vPickRayDir.y, (float)vPickRayDir.z);
//berechne den Ursprung mit einer ueberschneidung des near clipping plane
vPickRayOrig += vPickRayDir * NEAR_Z;
//durch die szene durchgehen und den am naechsten liegenden treffer finden
//C3DObjekt *hitObj=m_pScene->Pick(&vPickRayOrig, &vPickRayDir, FAR_Z-NEAR_Z);
}
}
|
So das die beiden Funktionen. Zum laden der Meshes nutze ich nahezu aequivalent die "Load" Funktion ausm Buch. Und von dieser Loadfunktion brauche ich ja den Meshzeiger. Oder noch besser, nen Zeiger von einer Liste mit allen Meshes.
Allerdings ist die Klasse C3DObjekt keine void, sondern eine (ID3DXMesh* pMesh).
Hoffe das hilft. Vielen Dank an euch alle!![/code] |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 12.07.2003, 21:29 Titel: Hmm |
|
|
Hallo,
konnte jemand da was mit Anfangen? Oder eher nicht?? Ich hab selber noch immer weiter probiert, aber es wird einfach nix. |
|
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: 13.07.2003, 11:45 Titel: |
|
|
Hallo X-File,
ich habe das Beispiel 3DObjects jetzt so angepasst, dass man picken kann. Bei deinem Code ist mir folgendes aufgefallen:
v.y = (((2.0f * ptCursor.x) / SCR_HOEHE)-1) / ProjMatrix._22;
das sollte
v.y = -(((2.0f * ptCursor.x) / SCR_HOEHE)-1) / ProjMatrix._22;
sein. Außerdem muss du darauf achten, dass SCR_WEITE und SCR_HOEHE vernünftige Werte haben. Im Fullscreenmodus sind die Werte okay (z.B. 800x600). Im Fenstermodus muss du aber noch die Höhe der Titelleiste und Menü usw. abziehen. Hole dir die Breite/Höhe besser mit GetClientRect() im Windowed-Mode.
Ob es bei dir aber daran liegt, kann ich nicht sagen. Ich kann aber das Beispielprogramm zum runterladen anbieten....
Christian |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 13.07.2003, 16:10 Titel: Wow... |
|
|
Hallo,
super!!! Wo kann ich denn deine Routine finden?? Das is wirklich toll.
Vielen Dank,
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: 13.07.2003, 20:58 Titel: |
|
|
Hallo,
das Beispiel kannst du hier runterladen.
Christian |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 13.07.2003, 23:52 Titel: Many, many THX |
|
|
Hallo Christian, (oder Herr Rousselle?)
vielen Dank fuer die Routine. Wenn ich das so sehe, habe ich total falsch gedacht *seufz*
Also vielen, vielen Dank!!!
Ein Problem bleibt aber bestehen. Und zwar zeichnet er angewaehlte Dreiecke, wenn ein Objekt sehr nahe an der Kamera ist, oder die Sicht schnell bewegt wird. Woran kann das liegen? Auch witzig - Kugeln waehlöt er gar nicht an )
Danke trotzdem vielmals.... super Platz hier. Jetzt weiß ich wo man gut aufgehoben ist.
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: 14.07.2003, 06:49 Titel: |
|
|
Hallo,
was genau meinst du? Welche Kugel? Wenn du die Sicht sehr schnell bewegst, könnte es sein, dass die Windows-Nachricht zu langsam kommt, dann muss du die Maus in der Schleife anstatt in der Callback-Funktion abfragen.
Christian |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 14.07.2003, 10:32 Titel: Stimmt. |
|
|
Hallo,
ja die WinProc is zu langsam. Ok. Kein Thema . Kugeln? Naja ich hatte in MAX (wie unsinnig ) eine "Testkugel" erstellt als MOdell und dann mit DeepHemisphere in X verwandelt. Anzeigen ist wie mit jedem Modell kein Problem. Aber wenn ich die Kugel anklicke, dann zeichnet er IN der Kugel verbindungsdreicke wild durch die Gegend. Selbes Phenomen auch bei einem sehr großen Terrainmodell. Beide Modelle haben keine Texturen.
Nachtrag: bei dem sehr großen Terrainmodel hat sichs jetzt geaendert. Da lags daran, dass zwei Modelle abgefragt wurden, aber nur eines zuverlaessig funktioniert . Allerdings markiert er da immer noch Dreicke weit ueber (Y_Achse) dem eigentlichen MOdell?? Seltsam.
Karl |
|
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
|