Direct3D vertizes von meshes
-
ja hallo erstmal
hab noch nich so viel erfahrung mit directx und bin ordentlich am lernen
hab schon übelst nach tutorials gesucht was vertexbuffer usw angeht aber ich find irgendwie nur welche im bezug darauf dass man selber n vertexbuffer erstellt, fürn dreieck oder whatever und den dann benutzt, aber ich finde ums verrecken nichts was mit dem auslesen von mesh vertizes zu tun hatich würd mich sehr freuen wenn mir einer kurz erklären könnte wie man von einem Mesh das mit D3DXLoadMeshFromX() geladen wurde die vertizes ausliest.
soweit bin ich bis jetz aber ich krieg da nen speicherzugriffsfehler
void bMesh::getMeshVertices(void) { meshVertexCount = meshData->GetNumVertices(); BYTE *tempVertices; DWORD pitch = D3DXGetFVFVertexSize(meshData->GetFVF()); meshVertices = new bVector3 * [meshVertexCount]; meshData->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID *) &tempVertices); for(DWORD i = 0; i < meshVertexCount; i++) { meshVertices[i] = new bVector3(0.0f, 0.0f, 0.0f); meshVertices[i] = (bVector3 *) tempVertices; tempVertices+=pitch; } meshData->UnlockVertexBuffer(); }
damit bekomme ich die ersten 6 vertizes von einem mesh korrekt geliefert, aber der rest besteht aus total verrückten werten, weil anscheinend in tempVertices nich mehr als 6 stück drinstehn obwohl getnumvertices mir so 50-60 stück anzeigt
hoffe jemand kann mir da weiterhelfen und da ich noch ziemlich neu in dem gebiet bin würd ich mich sehr freuen wenn mir das jemand bissl genauer erklärn könnte
danke schonma im voraus
-
sh0x schrieb:
for(DWORD i = 0; i < meshVertexCount; i++) { meshVertices[i] = new bVector3(0.0f, 0.0f, 0.0f); meshVertices[i] = (bVector3 *) tempVertices; tempVertices+=pitch; }
Das kann so nicht stimmen. Erst weist du meshVertices[i] ein neu angelegtes Objekt zu, und dann nochmal das gesamte Quellarray? Da musst du nochmal drüber nachdenken.
Außerdem steht im Vertex vermutlich mehr drin als nur die Position, das musst du auch beachten.
-
danke schonma für deine antwort
also meshVertices is: bVector3 **meshVertices;
und jedes einzelne is nochma n pointer auf einzelne vertizes wofür speicher angelegt wird.
die vektorklasse enthält float x, y, z
und ich hab irgendwo gelesen in der vergangenheit dass des erste was drinsteht wenn man den buffer lockt der vektor is, also wenn ich den in meshvertices reinkopier werden die 3 koordinaten da reingeschrieben, und der pitch is eben der size von einer so ner einheit wie ich das verstanden hab also müsste des doch zum nächsten vektor springen dann
wie gesagt ich bin da nochn ziemlicher noob was das alles angeht und weis blos dass was ich gelesen hab und durch rumprobieren so ausgearbeitet hab
falls ich da falsch informiert bin bitte korrigier mich
-
Du suchst ID3DXBaseMesh::GetVertexBuffer bzw ID3DXBaseMesh::GetIndexBuffer ?
-
wie gesagt ich hab da nich so die ahnung...
mit der gezeigten funktion hab ich schonma die korrekten vertices gekriegt, aber eben nur n teil davon und dann n speicherzugriffsfehler.das problem is halt, ich brauch die vertices von einem 3dmodel das ich mit D3DXLoadMeshFromX() geladen hab um die dann zu verarbeiten,
denn ich lade 4 meshes für tetris (L T I Z) und hab dann ne objekt klasse die diese meshes benutzt. Die objecte werden dann verschoben aber die vertizes bleiben natürlich unverändert im buffer und darum muss ich die da rausholen und in die object klasse kopieren sodass ich die dann bei der transformierung anpassen kann z.b. wegen kollisionserkennung
-
Schon mal in Erwaegung gezogen, eine Transformationsmatrix zu benutzen?
-
ich hab da ganz normal die weltmatrix um die objekte rumzuschieben und zu drehen und alles aber es geht nich um die gesamten teile ich will blos die einzelnen vertizes da rausholen