JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Picking Sample
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> News
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 13.07.2003, 22:01    Titel: Picking Sample Antworten mit Zitat

Hallo,

ich habe ein Picking-Example zusammengestellt. Es kann hier runterladen werden [1.3 MB].

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


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.07.2003, 12:43    Titel: Antworten mit Zitat

Hallo,

habe das Picking-Sample erweitert, so dass man jetzt auch beliebig viele Objekte "picken" kann.

Download
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 23.07.2003, 22:21    Titel: Antworten mit Zitat

Hallo,

mit der nächste Erweiterung kann jetzt ein Objekt punktgenau über eine Ebene bewegt werden.

Download

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: 23.07.2003, 22:27    Titel: Hmm Antworten mit Zitat

Hallo,

ohh Mann. Sorry Christian Wink. Ich habs echt probiert, aber irgendwie gings ned wie du an den Codes gesehen hast. Aber danke dir. Ich kzuck mir das mal an Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
X-FILE
Super JLI'ler



Anmeldedatum: 12.07.2003
Beiträge: 349

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 21:13    Titel: Hmmm Antworten mit Zitat

Hallo,

sag mal Christian, ich hab mir diese Routine angesehen (und bin auf gute Gedankengaenge gebracht worden, die ein voellig anderes Problem geloest haben Wink), aber mit einem Teil des Codes echt Probleme:

Was genau macht den dieses Stueckchen hier? Also was es macht (rein technisch nach Schulbuch) weiß ich, aber wozu, oder wofuer? Ich hoffe du weißt was ich meine Wink (also was memcpy ist weiß ich, wollt ich damit sagen, es geht eher ums Funktionsprinzip)

Code:


int   nVertexSize = 0;

      nVertexSize = D3DXGetFVFVertexSize(m_lpMesh->GetFVF());
      
      
      D3DXVECTOR3* pTriangle = new D3DXVECTOR3[3];



memcpy(&pTriangle[0],&pVertices[pIndexTriangle[0] * nVertexSize],sizeof(D3DXVECTOR3));
      memcpy(&pTriangle[1],&pVertices[pIndexTriangle[1] * nVertexSize],sizeof(D3DXVECTOR3));
      memcpy(&pTriangle[2],&pVertices[pIndexTriangle[2] * nVertexSize],sizeof(D3DXVECTOR3));




Was genau machst du mit diesem FVF?? Flexible Vertex Format habe ich so oder so nicht 100% verstanden? Bekommst du damit die Vertices EINES Dreiecks, oder die des gesamten Modells (m_lpMesh ja Zeiger auf gesamtes Modell)?

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


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 22:04    Titel: Antworten mit Zitat

Das Problem ist, dass man bei der Plane (plane.x) oder auch andernen Modellen nicht weiss wie das Vertex-Format aussieht. Das Modell hat auf jeden Fall Koordinaten (x,y,z), ob es aber eine Diffuse-Farbe oder Texturkoordinaten oder Normalen hat, weiss man nicht. Deshalb kenn man auch die Größe, die ein Vertex im Vertexbuffer belegt nicht oder besser gesagt, sie ist nicht immer gleich.

D3DXGetFVFVertexSize() gibt die Größe/Speicherbedarf eines Vertex in Byte zurück. Da wir uns für die Koordinaten der 3 Vertices interessieren benötigen wir diese Größe um den Offset von einem Vertex zum anderen berechnen zu können.

Was in den memcpy Zeilen geschieht, ist folgendes:

In pIndexTriangle[0] steht der Index des Vertex. Um an die Position im Vertexbuffer zu kommen, muss man diesen Index mit der Größe der Vertexstruktur multiplizieren. Also ist pVertices[pIndexTriangle[0] * nVertexSize] die Adresse der x-Koordinate, da die immer zuerst kommt. Nach der x Koordinaten kommt auch immer unmittelbar die y und die z Koordinate. Deshalb kann ich einfach 12 Byte (3 floats) ab dieser Stelle kopieren.

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: 30.07.2003, 16:46    Titel: Hmmm Antworten mit Zitat

Hallo,

sag mal Christian. Ich habe das Picking-Sample fuer meine Zwecke etwas erweitert (um zusaetzliche Darstellungsmethoden usw), aber hab jetzt noch ein Problem, wo mein Verstaendnis etwas aushakt.

Ich moechte eigentlich einen Schritt zurueck. Du zeichnest das getroffene Dreieick, indem du die Koordinaten vom Meshzeiger nimmst und somit die Position berechnest. Aber wie bekomme ich das gesamte zugehoerige Mesh? Also wie kann ich differenzieren?
Nen Vertexbuffer mit der Groeße (sizeof(m_lpMesh))?? Oder gibt es eine besere Methode?

Danke vielmals...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 30.07.2003, 17:33    Titel: Antworten mit Zitat

Du bekommst doch den Zeiger auf den Mesh zurück, was meinst 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: 30.07.2003, 20:19    Titel: Hmm Antworten mit Zitat

Guten Abend Christian,

ja so, oder so aehnlich hatte ich das auch gedacht. Was daraus folgte, war der Gedanke diesen Zeiger in eine Liste zu speichern und die Liste dann zu rendern. Aber das will nicht so recht.

Code:

std::list<LPD3DXMESH>::iterator sl;
   
   for(sl=m_SelectList.begin(); sl!=m_SelectList.end();sl++)
   {
      m_lpD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
      (*sl)->DrawSubset(0);
   }


Ist die Liste denn noetig? Anders kriege ich aber genau das gepickte Mesh nicht zurueck....??

Btw: Zwischenfrage zum Zeigerverstaendnis:
Ein Zeiger von einer Struktur wie hier m_lpMesh kann immer nur genau EINEN Wert enthalten, oder???
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.07.2003, 08:44    Titel: Antworten mit Zitat

Wenn du nur ein einziges Mesh als Wireframe darstellen willst, kannst du in der Scene Klasse einfach eine zusätzlich Variable z.B. m_lpCurPickedMesh anlegen und in der Picking-Routine dann

m_lpCurPickedMesh = lpMesh;

sagen. Wenn kein Mesh gewählt ist, dann setzt du m_lpCurPickedMesh auf 0. Bei Rendern prüfst du m_lpCurPickedMesh auf 0 und renderst dann den Mesh. Sollte gehen.

Zitat:

Btw: Zwischenfrage zum Zeigerverstaendnis:
Ein Zeiger von einer Struktur wie hier m_lpMesh kann immer nur genau EINEN Wert enthalten, oder???


Es gibt im Prinzip keinen Zeiger "von einer Struktur". Ein Zeiger enthält immer eine Adresse. In diesem Fall, die Adresse eines Meshes. Die Deklaration LPMESH dient nur dazu, damit der Compiler die Typen überprüfen kann. Der Zeiger kann nur auf eine Adresse zeigen.

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: 31.07.2003, 13:10    Titel: Hmm Antworten mit Zitat

Hallo,

ich hab die Liste jetzt so gemacht, weil ich auch mehrere Objekte als angewaehlt deklarieren will. Das Problem ist die Deaktivierung von gepickten Meshes.
Das heißt also den Status von dem vorherig gepickten Mesh wieder wegzunehmen und einem neuen zu ueberweisen.

Nehme ich die "Routine", die da ich gepostet hatte oben, zeichnet er ein gepicktes Mesh nach dem anderen als durchscheinendes Wireframe. Das soll er ja auch, aber wenn ich ein anderes Einzeln auswaehle, krieg ich den Status vom vorherigen nicht mehr weg.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.07.2003, 13:15    Titel: Antworten mit Zitat

Naja, dass ist aber nur ein Problem wie du die Liste verwaltest. Wenn du einen Mesh deselektieren willst:

1. Du klickst auf den Mesh, der deselektiert werden soll
2. Du bekommst den Zeiger
3. Du suchst in der Liste, ob der Zeiger vorhanden ist
4. Wenn ja löscht du ihn aus der Liste

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: 31.07.2003, 14:02    Titel: Hmmm Antworten mit Zitat

Hallo,

hatte ich schon probiert. Das dumme ist, dass ich ja nicht auf ein Mesh klicken will um es zu deselektieren. Ich klicke ein anderes an, erzeuge einen neuen Pointer damit und fuege den in die Liste ein. Prinzipiell wird ja immer der gleiche Pointer in die Liste gesetzt.
Wo soll ich da also einen rausnehmen? Bevor ich einen reinschreibe, die ganze Liste loeschen? Funktioniert nicht. Zumal ich ja dann auch den RenderStat vom alten Mesh wieder losbringen muesste, was nicht geht. Zumindest bei mir nicht.... *seufz*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.07.2003, 14:43    Titel: Antworten mit Zitat

Sag doch mal bitte was du genau machen möchtest.
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: 31.07.2003, 14:57    Titel: TUT MIR LEID ;)))) Antworten mit Zitat

Hallo,

tut mir echt leid. Warscheinlich liegts nur an meiner Dummheit, aber ich packs nicht.
Ich verdeutliche es mal mit dem Code:

Code:


Meshzeiger uebergeben in einer Pick-Funktion:

if(bHit)
   {
      m_lpPicked = m_lpMesh;

      m_SelectList.clear();

      m_SelectList.push_back(m_lpPicked);
                 ...}

(ich nehm nen neuen Zeiger, damit ich in den Bezeichnungen etwas weiter unten kein Mist mache, ist aber ja hier irrelevant)

Die Geometrierenderfunktion fuer gepickte Meshobjekte:

std::list<LPD3DXMESH>::iterator sl;
   
   for(sl=m_SelectList.begin(); sl!=m_SelectList.end();sl++)
   {
      m_lpD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
      (*sl)->DrawSubset(0);
   }

   m_lpD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);



So. Also ich uebergeb den Zeiger in die Liste, die ja sowieso bei jedem Hit anfangs = 0 ist und Rendere dann oben ein Wireframe ueber den Solid des Modells (naja eher umgekehrt Wink).

Das Problem ist jetzt, dass ich jetzt zwei Objekte habe. Klicke ich Eines, dann wirds zum Wireframe. Klick ich ein Zweites, wirds auch zum Wireframe, aber eben ZUSAETZLICH! Ich will dann aber dem Ersten Mesh den Wireframe wieder entziehen und nur das Zweite so haben.
Ich kann natuerlich nach der Meshauswahl beim Rendern eine m_SelectList.clear(); setzen. Aber dann wirds ja nur beim einmaligen Klick gerendert (aber schon mal besser Wink). Mir fehlt also die Bedingung fuer dieses "clear()".
Also in der Renderfunktion ein "Wenn das nicht mehr das vorherige ist, dann loesche RS vom alten und gibs dem Neuen". Vereinfacht gesagt...

Danke Wink ....
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 -> News 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