|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 15:30 Titel: Probleme mit Models |
|
|
Hallo zusamme,
folgendes Problem:
Ich habe eine Klasse für Models(X-Files) dort wird das Model geladen, Position, Rotation und Skalierung bestimmt.
In der Renderfunktion wird dann die Worldmatrix gesetzt. In der KLasse wird auch eine Boundingbox erstellt die bei bedarf gerendert werden kann.
Dies funktioniert auch alles so weit.
Da ich nun mehrere Instanzen der Klasse benötige die auch zur Laufzeit erzeugt werden sollen habe ich eine Klasse für die Verwaltung in der die Models in einem Vector gespeichert werden. Wenn ich nun zwei Models erstelle und rendere mit der Boundingbox funktioniert es.
CPP: | void EinheitenManager::Render()
{
for(int i=0;i<test.size();i++)
{
test.at(i)->BoundingBox(dev,test.at(i)->WorldMatrix);
test.at(i)->Render();
}
}
|
es kann nun während der Laufzeit die Boundingbox eingeschalted werden
CPP: | for(int i=0;i<test.size();i++)
{
test.at(i)->select=true;
}
|
wenn ich aber nur bei einem Model die BB einschalten will funktioniert die nur beim ersten erstellten Model.
Nur bei diesem wird die BB richtig dargestellt.
Wenn ich das zweite selektiere ist die BB verschoben und ca. 10mal kleiner wie sie sein sollte.
hier noch die Renderfunktion von Model:
CPP: | void Model::Render()
{
D3DXMATRIX matWorld;
D3DXMATRIXA16 tmpWorld;
matWorld = WorldMatrix;
pDevice->GetTransform(D3DTS_WORLD ,&tmpWorld);
pDevice->SetTransform( D3DTS_WORLD, &matWorld);
// Rotationsmatrizen anlegen
D3DXMatrixRotationX(&RotMatrixX,rot.x);
D3DXMatrixRotationY(&RotMatrixY,rot.y);
D3DXMatrixRotationZ(&RotMatrixZ,rot.z);
D3DXMatrixIdentity(&RotMatrix);
D3DXMatrixScaling(&RotMatrix,scale.x,scale.y,scale.z);
// und miteinander multiplizieren
D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixX);
D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixY);
D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixZ);
// Transformations und Rotationsmatrix zur Weltmatrix zusammenfassen
D3DXMatrixMultiply(&WorldMatrix,&RotMatrix,&TransMatrix);
D3DXMatrixTranslation(&TransMatrix,position.x,position.y,position.z);
D3DXMatrixMultiply(&WorldMatrix,&RotMatrix,&TransMatrix);
pDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);
//pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
for( DWORD i=0; i<dMaterials; i++ )
{
// Material und Texturen setzen
pDevice->SetMaterial( &pMeshMaterials[i] );
pDevice->SetTexture( 0, pMeshTextures[i] );
// Zeichnen des aktuellen Teilmesh
pMesh->DrawSubset( i );
}
m_bolBoundingBoxOK=true;
//select = true;
if(m_bolBoundingBoxOK && select){
pDevice->SetTransform( D3DTS_WORLD, &tmpWorld);
DWORD tmpFillMode;
pDevice->GetRenderState( D3DRS_FILLMODE, &tmpFillMode);
pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//OBB
pDevice->SetStreamSource( 0, m_VertexBuffer,0, sizeof(CUBEVERTEX) );
pDevice->SetIndices( m_IndexBuffer);
pDevice->SetFVF( FVF_CUBEVERTEX);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
//AABB
pDevice->SetStreamSource( 0, m_AABBVertexBuffer,0, sizeof(CUBEVERTEX) );
pDevice->SetIndices( m_IndexBuffer);
pDevice->SetFVF( FVF_CUBEVERTEX);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
pDevice->SetRenderState( D3DRS_FILLMODE, tmpFillMode);
}
//pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
}
|
Hat jemand von Euch eine Idee woran das liegen kann?[/img] |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.04.2009, 15:33 Titel: |
|
|
Wieso setzt du eine WorldMatrix wenn du dein BB rendern willst, die WorldMatrix ist doch schon passend gesetzt.
Das hier kann also eigentlich weg:
CPP: | pDevice->SetTransform( D3DTS_WORLD, &tmpWorld); |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 15:49 Titel: |
|
|
habe ich auch schon versucht aber dann wird keine BB richtig dargestellt. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.04.2009, 16:58 Titel: |
|
|
Nun, es ist auf jeden Fall ein Problem mit deiner WorldMatrix, ich weiss nicht was DrawSubset macht, aber evtl ist es nötig, danach einfach nochmal deine berechnete Worldmatrix zu setzen:
CPP: | pDevice->SetTransform(D3DTS_WORLD,&WorldMatrix); |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 17:06 Titel: |
|
|
Nein funktioniert auch nicht es bleibt der gleiche Effekt. |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 17:29 Titel: |
|
|
Hab mal ein paar Bilder:
Das fordere Model ist das erste.
So sieht es aus wenn mann beide Boxen einschaltet
So sieht es aus wenn mann die Box des ersten Models einschaltet
Und das ist der Effekt wenn man nur die BB für das zweite Model einschaltet. Dann sieht man rechts neben dem Kopf des ersten Model eine kleine Box die eigentlich wie im zweiten Bild aussehen sollte.
Die Bilder sind etwas schlecht, ich hoffe man erkennt etwas. |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 17:33 Titel: |
|
|
Also die BB des zweiten Models wird nur richtig dargestellt wenn die BB des ersten aktiviert wird sonst nicht. |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 03.04.2009, 21:02 Titel: |
|
|
hat keiner eine Antwort? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.04.2009, 23:25 Titel: |
|
|
Dieses:
Code: | pDevice->SetTransform( D3DTS_WORLD, &tmpWorld); |
beim rendern der BB macht aber absolut keinen Sinn sonst, so nimmst du ja die vor dem rendern des Modells gesetzte WorldMatrix welches die WorldMatrix des vorher gerenderten Objektes war.
Kannst du mal den ganzen Code posten, bzw noch besser das ganze Projekt wenn möglich? ich fürchte sonst kann ich dir nicht weiter helfen.
Auch anbieten würde es sich das ganze Projekt soweit zu reduzierne das nur noch eine minimal lauffähige Version erhalten bleibt, so lässt sich das ganze einfacher nachvollziehen.
mfg Mark
Zitat: | hat keiner eine Antwort? |
Nicht so ungeduldig, sowas dauert _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 04.04.2009, 07:08 Titel: |
|
|
OK ich werde mich daran machen eine kleine Demo zu erstellen. Dank dir. |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 04.04.2009, 10:18 Titel: |
|
|
Hilft dir vielleicht die Funktion zur erstellung der BB weiter:
CPP: | HRESULT Model::ComputeBoundingBoxEx(LPDIRECT3DDEVICE9 pd3dDevice,D3DXMATRIX Matrix){
HRESULT hr = S_OK;
DWORD NumVertices = pMesh->GetNumVertices();
DWORD dwStride = pMesh->GetNumBytesPerVertex();
// Bounding Box berechnen
D3DXVECTOR3 *verts;
D3DXVECTOR3 min;
D3DXVECTOR3 max;
pMesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&verts);
hr=D3DXComputeBoundingBox(verts, pMesh->GetNumVertices(), dwStride, &min, &max);
pMesh->UnlockVertexBuffer();
// Positions
CUBEVERTEX m_worldBounds[8]; //global
CUBEVERTEX m_objectBounds[8];//local
// We have min and max values, use these to get the 8 corners of the bounding box
m_objectBounds[0].pos.x = min.x;
m_objectBounds[0].pos.y = min.y;
m_objectBounds[0].pos.z = min.z;
m_objectBounds[1].pos.x = min.x;
m_objectBounds[1].pos.y = min.y;
m_objectBounds[1].pos.z = max.z;
m_objectBounds[2].pos.x = max.x;
m_objectBounds[2].pos.y = min.y;
m_objectBounds[2].pos.z = max.z;
m_objectBounds[3].pos.x = max.x;
m_objectBounds[3].pos.y = min.y;
m_objectBounds[3].pos.z = min.z;
m_objectBounds[4].pos.x = min.x;
m_objectBounds[4].pos.y = max.y;
m_objectBounds[4].pos.z = min.z;
m_objectBounds[5].pos.x = min.x;
m_objectBounds[5].pos.y = max.y;
m_objectBounds[5].pos.z = max.z;
m_objectBounds[6].pos.x = max.x;
m_objectBounds[6].pos.y = max.y;
m_objectBounds[6].pos.z = max.z;
m_objectBounds[7].pos.x = max.x;
m_objectBounds[7].pos.y = max.y;
m_objectBounds[7].pos.z = min.z;
for( int i = 0; i < 8; i++ ){
D3DXVec3TransformCoord(&m_worldBounds[i].pos, &m_objectBounds[i].pos , &Matrix);
}
OBBmin = m_worldBounds[0].pos;
OBBmax = m_worldBounds[6].pos;
CUBEVERTEX* pVertices;
if (m_VertexBuffer == NULL){
pd3dDevice->CreateVertexBuffer(8*sizeof(CUBEVERTEX),
D3DUSAGE_WRITEONLY, FVF_CUBEVERTEX,
D3DPOOL_MANAGED, &m_VertexBuffer, NULL );
}
hr = m_VertexBuffer->Lock( 0, 0, (void**)&pVertices, 0 );
memcpy(pVertices,&m_worldBounds, sizeof(m_worldBounds));
m_VertexBuffer->Unlock();
// Box speichern
memcpy(&OrientedBoundingBox,pVertices, sizeof(OrientedBoundingBox));
WORD* indices=NULL;
if(m_IndexBuffer == NULL){
pd3dDevice->CreateIndexBuffer(36 * sizeof(WORD),
D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
D3DPOOL_MANAGED, &m_IndexBuffer, NULL);
}
hr = m_IndexBuffer->Lock( 0, 0, (void**)&indices, 0 );
// front side
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3;
// back side
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 4; indices[10] = 7; indices[11] = 6;
// left side
indices[12] = 4; indices[13] = 5; indices[14] = 1;
indices[15] = 4; indices[16] = 1; indices[17] = 0;
// right side
indices[18] = 3; indices[19] = 2; indices[20] = 6;
indices[21] = 3; indices[22] = 6; indices[23] = 7;
// top
indices[24] = 1; indices[25] = 5; indices[26] = 6;
indices[27] = 1; indices[28] = 6; indices[29] = 2;
// bottom
indices[30] = 4; indices[31] = 0; indices[32] = 3;
indices[33] = 4; indices[34] = 3; indices[35] = 7;
m_IndexBuffer->Unlock();
//AABB from OBB
min.x=max.x=m_worldBounds[0].pos.x;
min.y=max.y=m_worldBounds[0].pos.y;
min.z=max.z=m_worldBounds[0].pos.z;
for (int i=1;i<8;i++){
if (m_worldBounds[i].pos.x < min.x) min.x=m_worldBounds[i].pos.x;
if (m_worldBounds[i].pos.x > max.x) max.x=m_worldBounds[i].pos.x;
if (m_worldBounds[i].pos.y < min.y) min.y=m_worldBounds[i].pos.y;
if (m_worldBounds[i].pos.y > max.y) max.y=m_worldBounds[i].pos.y;
if (m_worldBounds[i].pos.z < min.z) min.z=m_worldBounds[i].pos.z;
if (m_worldBounds[i].pos.z > max.z) max.z=m_worldBounds[i].pos.z;
}
CUBEVERTEX* pAABBVertices;
if (m_AABBVertexBuffer ==NULL){
pd3dDevice->CreateVertexBuffer(8*sizeof(CUBEVERTEX),
D3DUSAGE_WRITEONLY, FVF_CUBEVERTEX,
D3DPOOL_MANAGED, &m_AABBVertexBuffer, NULL );
}
hr = m_AABBVertexBuffer->Lock( 0, 0, (void**)&pAABBVertices, 0 );
pAABBVertices[0] = CUBEVERTEX(min.x, min.y, min.z);
pAABBVertices[1] = CUBEVERTEX(max.x, min.y, min.z);
pAABBVertices[2] = CUBEVERTEX(max.x, min.y, max.z);
pAABBVertices[3] = CUBEVERTEX(min.x, min.y, max.z);
pAABBVertices[4] = CUBEVERTEX(min.x, max.y, min.z);
pAABBVertices[5] = CUBEVERTEX(max.x, max.y, min.z);
pAABBVertices[6] = CUBEVERTEX(max.x, max.y, max.z);
pAABBVertices[7] = CUBEVERTEX(min.x, max.y, max.z);
m_AABBVertexBuffer->Unlock();
// Box speichern
memcpy(&AxisAlignedBoundingBox,pAABBVertices, sizeof(AxisAlignedBoundingBox));
AABBmin = pAABBVertices[0].pos;
AABBmax = pAABBVertices[6].pos;
m_bolBoundingBoxOK = true;
return hr;
}
|
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.04.2009, 12:38 Titel: |
|
|
Wozu ist da eine Matrix nötig? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 04.04.2009, 15:29 Titel: |
|
|
Um die Box in die Welt zu integrieren. So stehts im Buch InsideDX |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.04.2009, 17:55 Titel: |
|
|
Das Buch klingt nach gutem Feuerholz wenn diverse andere Sachen die ich in deinem Projekt gesehen habe auch daraus stammen, sehe es nicht böse.
Nun ich habe es hinbekommen das deine BBs zu sehen sind so wie du es wolltest:
CPP: | void Model::Render()
{
D3DXMATRIXA16 RotationMatrix;
D3DXMATRIXA16 ScaleMatrix;
D3DXMATRIXA16 TranslationMatrix;
D3DXMATRIXA16 ComboMatrix;
::D3DXMatrixRotationYawPitchRoll(&RotationMatrix, rot.y, rot.x, rot.z);
::D3DXMatrixScaling(&ScaleMatrix, scale.x,scale.y,scale.z);
::D3DXMatrixTranslation(&TranslationMatrix, position.x,position.y,position.z);
::D3DXMatrixMultiply(&ComboMatrix, &RotationMatrix, &TranslationMatrix);
::D3DXMatrixMultiply(&WorldMatrix, &ScaleMatrix, &ComboMatrix);
D3DXMATRIX tmpWorld;
pDevice->GetTransform(D3DTS_WORLD ,&tmpWorld);
pDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);
for( DWORD i=0; i<dMaterials; i++ )
{
// Material und Texturen setzen
pDevice->SetMaterial( &pMeshMaterials[i] );
pDevice->SetTexture( 0, pMeshTextures[i] );
// Zeichnen des aktuellen Teilmesh
pMesh->DrawSubset( i );
}
m_bolBoundingBoxOK=true;
//select = true;
if(m_bolBoundingBoxOK && select){
D3DXMATRIXA16 NullMatrix;
D3DXMatrixIdentity(&NullMatrix);
pDevice->SetTransform(D3DTS_WORLD, &NullMatrix);
DWORD tmpFillMode;
pDevice->GetRenderState( D3DRS_FILLMODE, &tmpFillMode);
pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//OBB
pDevice->SetStreamSource( 0, m_VertexBuffer,0, sizeof(CUBEVERTEX) );
pDevice->SetIndices( m_IndexBuffer);
pDevice->SetFVF( FVF_CUBEVERTEX);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
//AABB
pDevice->SetStreamSource( 0, m_AABBVertexBuffer,0, sizeof(CUBEVERTEX) );
pDevice->SetIndices( m_IndexBuffer);
pDevice->SetFVF( FVF_CUBEVERTEX);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
pDevice->SetRenderState( D3DRS_FILLMODE, tmpFillMode);
}
}
|
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 04.04.2009, 19:48 Titel: |
|
|
DAnk Dir, dachte ichs mir dass es an der Render-Methode lag. |
|
Nach oben |
|
|
|
|
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
|