2

第一次在这个网站上发布海报。但是我遇到了严重的障碍并且迷路了。如果这太难读了,问题就在底部。但我认为背景会有所帮助。

该项目的一些背景知识:我目前有一个使用 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);
}
4

1 回答 1

0

从相机更新代码中,一个明显的问题是lookAt 变量。

通常lookAt变量是一个“点”而不是一个“向量”(方向),但从你的代码来看,你似乎将它保存为一个点,但将它用作一个向量。而且你的相机定义也不完整,一个标准的相机至少应该包含:位置、向上方向和观察方向(或lookAt点)。我假设您想在 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);
于 2013-09-03T14:10:43.353 回答