2 Stimmen

C++ DirectX10 Mesh Verschwindet nach einem Frame, Warum?

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: Klassendiagramm

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);
}

0voto

Wayne Wang Punkte 1277

Vom Kamera-Update-Code ist ein offensichtliches Problem die Variable lookAt.

Normalerweise ist die Variable lookAt ein "Punkt", kein "Vektor" (Richtung), aber aus deinem Code scheint es, dass du es als Punkt gespeichert hast, aber als Vektor verwendet hast. Und deine Kameradefinition ist auch nicht vollständig, eine Standardkamera sollte mindestens folgendes enthalten: Position, Aufwärtsrichtung und Sichtrichtung (oder lookAt-Punkt). Ich nehme an, du möchtest deine Kamera in der Funktion ICamera::Update drehen und verschieben, also drehst du die Aufwärts- und Sichtrichtung und verschiebst die Position.

Ich vermute, dass deine CMovement dir eine neue Kameraposition gibt und eine Drehung auf die Kamera anwendet. Dann kannst du versuchen, wie folgt zu ändern, (mEye und mLookAt sind die Position, mUp ist die Richtung)

XMVECTOR up = XMLoadFloat3(&pCamera->mUp);
XMVECTOR lookAt = XMLoadFloat3(&pCamera->mLookAt);
XMVECTOR oldPos = XMLoadFloat3(&pCamera->mEye);
XMVECTOR viewDir = lookAt - oldPos;
XMVECTOR pos = XMLoadFloat3(&pMovement->mPosition);

viewDir = XMVector3TransformCoord(viewDir, rotMat);
up = XMVector3TransformCoord(up, rotMat);

lookAt = pos + viewDir;

view = XMMatrixLookAtLH(pos,
    lookAt,
    up);

XMStoreFloat3(&pCamera->mEye, position);
XMStoreFloat3(&pCamera->mLookAt, lookAt);
XMStoreFloat3(&pCamera->mUp, up);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X