JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Pick Routine fuer Modelle
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: 12.07.2003, 00:38    Titel: Pick Routine fuer Modelle Antworten mit Zitat

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 Wink ). 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 Wink))

Vielen Dank... im Voraus.
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: 12.07.2003, 07:36    Titel: Antworten mit Zitat

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
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: 12.07.2003, 10:18    Titel: Danke... ;) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 12.07.2003, 10:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 12.07.2003, 11:11    Titel: Hmmm Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 12.07.2003, 11:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 12.07.2003, 12:27    Titel: Antworten mit Zitat

Ich werde mal was zusammenbauen, mit welchen Beispiel arbeitest du?
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: 12.07.2003, 14:32    Titel: Hmm Antworten mit Zitat

Hallo,

wow, Herr Rousselle persoenlich. Ist mir oben gar nicht aufgefallen. Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 12.07.2003, 21:29    Titel: Hmm Antworten mit Zitat

Hallo,

konnte jemand da was mit Anfangen? Oder eher nicht?? Ich hab selber noch immer weiter probiert, aber es wird einfach nix.
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: 13.07.2003, 11:45    Titel: Antworten mit Zitat

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
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: 13.07.2003, 16:10    Titel: Wow... Antworten mit Zitat

Hallo,

super!!! Wo kann ich denn deine Routine finden?? Das is wirklich toll.

Vielen Dank,
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: 13.07.2003, 20:58    Titel: Antworten mit Zitat

Hallo,

das Beispiel kannst du hier runterladen.

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: 13.07.2003, 23:52    Titel: Many, many THX Antworten mit Zitat

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 Wink)

Danke trotzdem vielmals.... super Platz hier. Jetzt weiß ich wo man gut aufgehoben ist.

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: 14.07.2003, 06:49    Titel: Antworten mit Zitat

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
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: 14.07.2003, 10:32    Titel: Stimmt. Antworten mit Zitat

Hallo,

ja die WinProc is zu langsam. Ok. Kein Thema Wink. Kugeln? Naja ich hatte in MAX (wie unsinnig Wink) 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 Wink. Allerdings markiert er da immer noch Dreicke weit ueber (Y_Achse) dem eigentlichen MOdell?? Seltsam.

Karl
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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