Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 13.07.2003, 21:01 Titel: Picking Sample |
|
|
Hallo,
ich habe ein Picking-Example zusammengestellt. Es kann hier runterladen werden [1.3 MB].
Christian |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 18.07.2003, 11:43 Titel: |
|
|
Hallo,
habe das Picking-Sample erweitert, so dass man jetzt auch beliebig viele Objekte "picken" kann.
Download |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 21:21 Titel: |
|
|
Hallo,
mit der nächste Erweiterung kann jetzt ein Objekt punktgenau über eine Ebene bewegt werden.
Download
Christian |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 23.07.2003, 21:27 Titel: Hmm |
|
|
Hallo,
ohh Mann. Sorry Christian . Ich habs echt probiert, aber irgendwie gings ned wie du an den Codes gesehen hast. Aber danke dir. Ich kzuck mir das mal an |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 24.07.2003, 20:13 Titel: Hmmm |
|
|
Hallo,
sag mal Christian, ich hab mir diese Routine angesehen (und bin auf gute Gedankengaenge gebracht worden, die ein voellig anderes Problem geloest haben ), 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 (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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.07.2003, 21:04 Titel: |
|
|
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 |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 30.07.2003, 15:46 Titel: Hmmm |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.07.2003, 16:33 Titel: |
|
|
Du bekommst doch den Zeiger auf den Mesh zurück, was meinst du? |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 30.07.2003, 19:19 Titel: Hmm |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.07.2003, 07:44 Titel: |
|
|
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 |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 31.07.2003, 12:10 Titel: Hmm |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.07.2003, 12:15 Titel: |
|
|
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 |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 31.07.2003, 13:02 Titel: Hmmm |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.07.2003, 13:43 Titel: |
|
|
Sag doch mal bitte was du genau machen möchtest. |
|
Nach oben |
|
|
X-FILE Super JLI'ler
Anmeldedatum: 12.07.2003 Beiträge: 349
Medaillen: Keine
|
Verfasst am: 31.07.2003, 13:57 Titel: TUT MIR LEID ;)))) |
|
|
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 ).
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 ). 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 .... |
|
Nach oben |
|
|
|