2

このサイトで初めてのポスター。しかし、私は深刻な障害にぶつかり、道に迷っています。これが読みにくい場合は、質問は一番下にあります。しかし、私は背景が役立つと思いました。

プロジェクトの背景: 現在、DirectX10 を使用してレンダリング エンジンをセットアップしています。コンポーネントマネージャー(ワールド内のエンティティのコンポーネントへのポインターを保持する)内にコンポーネント(データ)ポインターの私の設計を実装し、そのデータをインターフェイスマネージャー(ロード、作成、更新、レンダリングなどのすべてのメソッド)に送信した後.)。

視覚化を容易にするためのクラス図の画像を次に示します : クラス図

私のレンダリング エンジンには、1 つのフレームに対してのみ立方体 (Wavefront .obj ファイルから解析され、カスタム頂点の配列に配置される) をレンダリングするという奇妙な問題があります。バック バッファーの最初のプレゼンテーションの後、キューブが消えます。

この問題を修正するために多くのデバッグを行いましたが、答えは得られませんでした。位置、スケール、回転などのベクトルの変化のダンプのファイルと、ワールド マトリックスがあります。ワールド空間でのオブジェクトの位置とワールド空間でのカメラの位置に関するすべてのデータは、その整合性を維持します。また、他のポインターが破損しているか、本来あるべきではない場所で変更されているか、誤って削除されているかどうかを確認しました。

いくつかの更新とレンダリングでローカルをステップ実行すると、Movement コンポーネント、Texture コンポーネント、およびシェーダー変数とポインターに変更がありません。

これは最初に実行されるコードで、次にループします。

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

そして、ここにインターフェイスの render メソッドと update メソッドがあります:

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

要するに、私の質問は次のとおりです。私の立方体が 1 フレームだけレンダリングされてから消えてしまうのはなぜですか?

更新: 分離することで問題の原因となっている方法を見つけました。render() の前に、私の update() メソッド内にあります。問題が発生するのは、カメラが更新されたときです。これがそのメソッドのコードです。おそらく誰かが私ではないことがわかりますか?

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

カメラ更新コードから明らかな問題の 1 つは、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 に答える