旋转相机时,DirectX 基元不会在屏幕上移动
DirectX primitive doesn't move on screen when rotating camera
我正试图使用顶点在屏幕上放置一个立方体。。。我有一台相机,可以通过鼠标和键盘命令进行旋转和平移。。。然而,在运行时,立方体的方形表面平放在屏幕上,当相机旋转时不会移动。。。屏幕上的其他项目出现在方形表面后面。。。有人能解释渲染基元的过程吗?提前感谢您的帮助。。。非常感谢!
#define SQUAREFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct SQUARE {
float x, y, z;
DWORD color;
};
SQUARE vert[] =
{
// 1
{ -64.0f, -64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)},
{ -64.0f, 64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)},
{ 64.0f, 64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)},
{ 64.0f, -64.0f, 64.0f, D3DCOLOR_ARGB(0,0,0,255)},
};
bool CGraphics::TerrainTwo(D3DXVECTOR3 minB, D3DXVECTOR3 maxB, int numCellsW, int numCellsL)
{
HRESULT hr;
void* pVoid;
hr = m_d3ddev->CreateVertexBuffer(sizeof(SQUARE)*sizeof(vert),0,
CUSTOMFVF,D3DPOOL_DEFAULT,&m_terrainVertexBuffer,NULL);
if(FAILED(hr)){
MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK);
return false;
}
hr = m_terrainVertexBuffer->Lock(0, 0, (void**)&pVoid, NULL);
if(FAILED(hr)){
MessageBox(NULL, L"Could not Lock Vertex Buffer", L"ERROR", MB_OK);
return false;
}
memcpy(pVoid, &vert, sizeof(vert));
m_terrainVertexBuffer->Unlock();
/*hr = m_d3ddev->CreateIndexBuffer(sizeof(DWORD)*sizeof(indices),0,
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_terrainIndexBuffer, NULL);
if(FAILED(hr)){
MessageBox(NULL, L"Could not Create Index Buffer", L"ERROR", MB_OK);
return false;
}
hr = m_terrainIndexBuffer->Lock(0, 0, (void**)&pVoid, 0);
if(FAILED(hr)){
MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK);
return false;
}
memcpy(pVoid, indices, sizeof(indices));
if(FAILED(hr)){
MessageBox(NULL, L"Could not Create Vertex Buffer", L"ERROR", MB_OK);
return false;
}
m_terrainIndexBuffer->Unlock();*/
return true;
}
void CGAME::Update()
{
if(m_graphics){
//m_graphics->UpdateSkyBox();
D3DXMATRIX matRotX, matRotY, matRotZ, matTrans;
D3DXMatrixRotationX (&matRotX, 0);
D3DXMatrixRotationY( &matRotY, 0 );
D3DXMatrixRotationZ( &matRotZ, 0 );
// Calculate a translation matrix
D3DXMatrixTranslation(&matTrans,5.0,1.0,5.0);
D3DXMATRIX matWorld = (matRotX*matRotY*matRotZ)*matTrans;
m_graphics->RenderTerrain(matWorld);
}
}
void CGraphics::RenderTerrain(D3DXMATRIX matW)
{
m_d3ddev->SetTransform(D3DTS_WORLD, &matW);
m_d3ddev->SetTexture(0, NULL);
m_d3ddev->SetStreamSource(0, m_terrainVertexBuffer, 0, sizeof(SQUARE));
m_d3ddev->SetFVF(CUSTOMFVF);
m_d3ddev->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
这都是矩阵数学。只要立方体的顶点通过顶点着色器中的反向摄影机变换(也称为摄影机或视图矩阵)进行变换,立方体就会旋转(它也应该通过自己的世界变换矩阵和所谓的投影矩阵进行变换,后者负责透视效果)。
假设您有一个顶点着色器(固定函数管道有点过时),您所要做的就是确保应用这些转换。通常,这是通过与世界视图投影矩阵的一次乘法来完成的,我敢肯定你在某个地方做了这件事,但这不是正确的。
渲染管道上有很多好的源,但哪一个是正确的源取决于您使用的DirectX/硬件级别(不过,它们都有一条红线,而且在过去的15年里,单个原语如何出现在屏幕上的基本想法没有太大变化)。
既然你是3D图形的新手,我想,让我警告你:DirectX和OpenGl可能很棘手/不直观,而且3D图形背后的数学原理通常都不是微不足道的,两者结合在一起经常会给你一种感觉,即有些东西不会移动,甚至不会出现在屏幕上。只需继续调试,使用教程或示例代码仔细检查您的代码。
相机的矩阵在哪里?您只设置了一个世界矩阵。在调用DrawPrimitive之前,您必须设置相机矩阵,如下所示。
m_d3ddev->SetTransform(D3DTS_WORLD, &matW); // This line is already in your code.
m_d3ddev->SetTransform(D3DTS_VIEW, &camera.m_viewMatrix);
m_d3ddev->SetTransform(D3DTS_PROJECTION, &camera.m_projMatrix);
你可以在某处找到相机矩阵。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- SFML 向下移动时如何围绕屏幕中心旋转?
- 使用 C++将文本光标移动到屏幕中不可见的行
- SFML 在屏幕上移动矩形时滞后/小卡顿
- 如果您向前移动,如何更改屏幕,如果向后移动,如何看到较旧的东西?
- 它是一个"X",漂浮在输出屏幕上并实时移动
- 如何在C 屏幕上的任何可能点移动光标
- 如何使用 SDL2 移动屏幕,C++
- 当光标锁定在屏幕中时,如何获得鼠标移动
- 如何使用mouseevent在windows登录屏幕中移动鼠标光标
- 如何在 c++ 中在屏幕上移动文本字符
- C++公共和私有类,带有屏幕移动
- 制作贪吃蛇游戏。检测到移动后,我无法更改屏幕。C++
- 在屏幕中选择并移动Qwidget
- 将文本光标移动到特定的屏幕坐标
- 使用ncurses c++(Linux)将光标移动到屏幕上的特定点
- 如何在屏幕上缓慢移动对象
- 旋转相机时,DirectX 基元不会在屏幕上移动