Erstmaliger Poster auf dieser Website. Aber ich bin auf ein ernsthaftes Problem gestoßen und bin verloren. Wenn dies zu viel zum Lesen ist, ist die Frage unten aufgeführt. Aber ich dachte, der Hintergrund würde helfen.
Ein wenig Hintergrund zum Projekt: Ich habe derzeit einen Rendiermotor eingerichtet, der DirectX10 verwendet. Es scheint, dass nach der Implementierung meines Designs von Komponentendatenzeigern innerhalb eines Komponentenmanagers (hält Zeiger auf Komponenten von Entitäten innerhalb der Welt) und dem Senden dieser Daten an einen Interface-Manager (alle Methoden zum Laden, Erstellen, Aktualisieren, Rendern usw.).
Hier ist ein Klassendiagramm, um es einfacher zu visualisieren: bearbeitet: (Ich habe nicht genug Reputation, um zu posten, also hier ist stattdessen ein Link: https://i.stack.imgur.com/qa5yo.jpg bearbeitet:
Mein Rendiermotor hat ein seltsames Problem, einen Würfel (analysiert aus einer Wavefront-.obj-Datei und in ein Array benutzerdefinierter Vertices eingefügt) für nur ein Frame zu renden. Nach der initialen Präsentation des Backbuffers verschwindet mein Würfel.
Ich habe viel Debugging durchgeführt, um dieses Problem zu beheben, aber keine Antworten erhalten. Ich habe Dateien von Dump-Vektoren für Position, Skalierung, Rotation usw. sowie der Weltmatrix. Alle Daten bezüglich der Position des Objekts im Weltraum und der Kameraposition im Weltraum behalten ihre Integrität bei. Ich habe auch überprüft, ob es Probleme mit anderen Zeigern gab, die entweder beschädigt, dort modifiziert oder aus Versehen gelöscht wurden.
Beim Durchgehen der Variablen über mehrere Aktualisierungen und Rendern finde ich keine Änderung in Bewegungskomponenten, keine Änderung in Texturkomponenten und keine Änderung an meinen Shader-Variablen und Zeigern.
Hier ist der Code, der zunächst ausgeführt wird, und dann die Schleife.
void GameWorld::Laden()
{
//initialisiere alle Elemente hier
mInterface = InterfaceManager(pDXManager);
//erstelle Entitäten hier
mEHouse = CEntity(
CT::MESH | CT::MOVEMENT | CT::SHADER | CT::TEXTURE,
"Haus", &mCManager);
mECamera = CEntity(
CT::CAMERA | CT::MOVEMENT | CT::LIGHT,
"Kamera", &mCManager);
//HACKS NUR ZUR PRÜFUNG
//Idealerweise Skript erstellen, um Entitäten zu parsen, die erstellt werden sollen;
//GameWorld wird dynamische Entitätenliste haben;
//////////////////////////////////////////////////
tm = CMesh("../Modelle/Box.obj");
mCManager.mMesh[0] = &tm;
//hmmm.... wie man Nicht-RDMS-Stil-Entitäten erstellt...
tc = CCamera(
XMFLOAT3(0.0f, 0.0f, 1.0f),
XMFLOAT3(0.0f, 0.0f, 0.0f),
XMFLOAT3(0.0f, 1.0f, 0.0f), 1);
mCManager.mCamera[0] = &tc;
tmc = CMovement(
XMFLOAT3(0.0f, 0.0f, -10.0f),
XMFLOAT3(0.0f, 0.0f, 0.0f),
XMFLOAT3(0.0f, 0.0f, 0.0f));
mCManager.mMovement[1] = &tmc;
////////////////////////////////////////////////////
//nur nachdem alle Entitäten erstellt sind
mInterface.onLoad(&mCManager);
}
//Kernspiellogik hier
void GameWorld::Aktualisieren(float dt)
{
mInterface.Aktualisieren(dt, &mCManager);
}
//Kernrenderlogik hier
void GameWorld::Rendern()
{
pDXManager->BeginneSzene();
//Rendernaufrufe hier
mInterface.Rendern(&mCManager);
//verschwindet nach Endszene
pDXManager->EndSzene();
}
Und hier sind die Interface-Render- und Update-Methoden:
void InterfaceManager::onLoad(CComponentManager* pCManager)
{
//erstelle alles
for(int i = 0; i < pCManager->mTexture.size(); ++i)
{
mTexture2D.loadTextureFromFile(pDXManager->mD3DDevice, pCManager->mTexture[i]);
}
for(int i = 0; i < pCManager->mMesh.size(); ++i)
{
mMesh.loadMeshFromOBJ(pCManager->mMesh[i]);
mMesh.createMesh(pDXManager->mD3DDevice, pCManager->mMesh[i]);
}
for(int i = 0; i < pCManager->mShader.size(); ++i)
{
mShader.Init(pDXManager->mD3DDevice, pDXManager->mhWnd, pCManager->mShader[i], pCManager->mTexture[i]);
}
//TODO: Lege dies an anderer Stelle fest, um die Struktur beizubehalten
XMMATRIX pFOVLH = XMMatrixPerspectiveFovLH((float)D3DX_PI / 4.0f, (float)pDXManager->mWindowWidth/pDXManager->mWindowHeight, 0.1f, 1000.0f);
XMStoreFloat4x4(&pCManager->mCamera[0]->mProjectionMat, pFOVLH);
}
void InterfaceManager::Aktualisieren(float dt, CComponentManager* pCManager)
{
//Eingabe aktualisieren
//KI aktualisieren
//Kollisionserkennung aktualisieren
//Physik aktualisieren
//Bewegung aktualisieren
for(int i = 0; i < pCManager->mMovement.size(); ++i)
{
mMovement.transformToWorld(pCManager->mMovement[i]);
}
//Animationen aktualisieren
//Kamera aktualisieren
//Es gibt immer nur eine aktive Kamera
//TODO: Irgendwie für eine aktive Kamera-Variable einrichten
mKamera.Aktualisieren(pCManager->mCamera[0], pCManager->mMovement[pCManager->mCamera[0]->mOwnerID]);
}
void InterfaceManager::Rendern(CComponentManager* pCManager)
{
for(int i = 0; i < pCManager->mMesh.size(); ++i)
{
//Meshes renden
mMesh.RenderMeshes(pDXManager->mD3DDevice, pCManager->mMesh[i]);
//Shader-Variablen setzen
mShader.setShaderMatrices(pCManager->mCamera[0], pCManager->mShader[i], pCManager->mMovement[i]);
mShader.setShaderLight(pCManager->mLight[i], pCManager->mShader[i]);
mShader.setShaderTexture(pCManager->mTexture[i]);
//Shader rendern
mShader.RenderShader(pDXManager->mD3DDevice, pCManager->mShader[i], pCManager->mMesh[i]);
}
}
Kurz gesagt, meine Frage könnte sein: Warum wird mein Würfel nur für einen Frame gerendert und verschwindet dann?
UPDATE: Ich habe die Methode gefunden, die die Probleme verursacht, indem ich sie isoliert habe. Es liegt an meiner Update()-Methode, vor dem Rendern. Es ist, wenn meine Kamera aktualisiert wird, dass Probleme verursacht werden. Hier ist der Code für diese Methode, vielleicht kann jemand sehen, was ich nicht?
void ICamera::Update(CCamera* pCamera, CMovement* pMovement)
{
XMMATRIX rotMat = XMMatrixRotationRollPitchYaw(pMovement->mRotation.x,
pMovement->mRotation.y,
pMovement->mRotation.z);
XMMATRIX view = XMLoadFloat4x4(&pCamera->mViewMat);
XMVECTOR up = XMLoadFloat3(&pCamera->mUp);
XMVECTOR lookAt = XMLoadFloat3(&pCamera->mEye);
XMVECTOR pos = XMLoadFloat3(&pMovement->mPosition);
lookAt = XMVector3TransformCoord(lookAt, rotMat);
up = XMVector3TransformCoord(up, rotMat);
lookAt = pos + lookAt;
view = XMMatrixLookAtLH(pos,
lookAt,
up);
XMStoreFloat3(&pCamera->mEye, lookAt);
XMStoreFloat3(&pCamera->mUp, up);
XMStoreFloat4x4(&pCamera->mViewMat, view);
}