Первый постер на этом сайте. Но я ударил серьезный блок и потерян. Если это слишком много, чтобы прочитать, вопрос в нижней части. Но я думал, что фон поможет.
Немного предыстории по проекту:
В настоящее время у меня есть движок рендеринга, настроенный с использованием DirectX10. Похоже, что после реализации моего дизайна указателей компонентов (данных) внутри диспетчера компонентов (содержит указатели на компоненты сущностей внутри мира) и отправки этих данных в диспетчер интерфейсов (все методы для загрузки, создания, обновления, рендеринга и т. Д.) .).
Вот изображение диаграммы классов, чтобы ее было проще визуализировать:
Отредактировано: (Не хватает представителя для публикации, поэтому здесь вместо ссылки: http://imgur.com/L3nOyoY
редактировать:
У моего движка рендеринга есть странная проблема — рендерить куб (анализируется из файла Wavefront .obj и помещается в массив пользовательских вершин) только для одного кадра. После первоначального представления заднего буфера мой куб исчезает.
Я прошел много отладок, чтобы решить эту проблему, но не дал ответов. У меня есть файлы дампов изменения векторов для положения, масштаба, поворота и т. Д., А также мировой матрицы. Все данные, касающиеся положения объекта в мировом пространстве и положения камеры в мировом пространстве, сохраняют свою целостность. Я также проверил, не было ли проблем с другими указателями, которые были повреждены, изменены, где они не должны быть, или удалены случайно.
Проходя по местным жителям через несколько обновлений и рендеров, я не вижу изменений в компонентах движения,
без изменений в компонентах текстур и без изменений переменных и указателей моего шейдера.
Вот код, который выполняется вначале, а затем цикл,
void GameWorld::Load()
{
//initialize all members here
mInterface = InterfaceManager(pDXManager);
//create entities here
mEHouse = CEntity(
CT::MESH | CT::MOVEMENT | CT::SHADER | CT::TEXTURE,
"House", &mCManager);
mECamera = CEntity(
CT::CAMERA | CT::MOVEMENT | CT::LIGHT,
"Camera", &mCManager);
//HACKS FOR TESTING ONLY
//Ideally create script to parse to create entities;
//GameWorld will have dynamic entity list;
//////////////////////////////////////////////////
tm = CMesh("../Models/Box.obj");
mCManager.mMesh[0] = &tm;
//hmmm.... how to make non-RDMS style entities...
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;
////////////////////////////////////////////////////
//only after all entities are created
mInterface.onLoad(&mCManager);
}
//core game logic goes here
void GameWorld::Update(float dt)
{
mInterface.Update(dt, &mCManager);
}
//core rendering logic goes here
void GameWorld::Render()
{
pDXManager->BeginScene();
//render calls go here
mInterface.Render(&mCManager);
//disappears after end scene
pDXManager->EndScene();
}
А вот интерфейс рендеринга и методы обновления:
void InterfaceManager::onLoad(CComponentManager* pCManager)
{
//create all
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: put this somewhere else to maintain structure
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::Update(float dt, CComponentManager* pCManager)
{
//update input
//update ai
//update collision detection
//update physics
//update movement
for(int i = 0; i < pCManager->mMovement.size(); ++i)
{
mMovement.transformToWorld(pCManager->mMovement[i]);
}
//update animations
//update camera
//There is only ever one active camera
//TODO: somehow set up for an activecamera variable
mCamera.Update(pCManager->mCamera[0], pCManager->mMovement[pCManager->mCamera[0]->mOwnerID]);
}
void InterfaceManager::Render(CComponentManager* pCManager)
{
for(int i = 0; i < pCManager->mMesh.size(); ++i)
{
//render meshes
mMesh.RenderMeshes(pDXManager->mD3DDevice, pCManager->mMesh[i]);
//set shader variables
mShader.setShaderMatrices(pCManager->mCamera[0], pCManager->mShader[i], pCManager->mMovement[i]);
mShader.setShaderLight(pCManager->mLight[i], pCManager->mShader[i]);
mShader.setShaderTexture(pCManager->mTexture[i]);
//render shader
mShader.RenderShader(pDXManager->mD3DDevice, pCManager->mShader[i], pCManager->mMesh[i]);
}
}
Короче говоря, мой вопрос может быть таким: почему мой куб рендерится только для одного кадра, а затем исчезает?
ОБНОВЛЕНИЕ: я нашел метод, вызывающий проблемы, изолировав его. Он лежит в моем методе update (), перед render (). Это когда моя камера обновляется, что вызывает проблемы. Вот код для этого метода, возможно, кто-то может увидеть, чем я не являюсь?
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);
}
Из кода обновления камеры одной очевидной проблемой является переменная lookAt.
Обычно переменная lookAt является «точкой», а не «вектором» (направлением), но из вашего кода кажется, что вы сохранили ее как точку, но использовали как вектор. И определение вашей камеры также не является полным, стандартная камера должна, по крайней мере, содержать: положение, направление вверх и направление просмотра (или lookAt point).
Я предполагаю, что вы хотите повернуть и перевести вашу камеру в функцию ICamera :: Update, чтобы вы поворачивали вверх и просматривали направление, а также переводили положение.
Я предполагаю, что ваше CMovement даст вам новую позицию камеры и применит вращение к камере. Затем вы можете попытаться изменить, как показано ниже, (mEye и mLookAt это позиция, mUp это направление)
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);
Других решений пока нет …