旋转相机时 DirectX 基元不会在屏幕上移动
Posted
技术标签:
【中文标题】旋转相机时 DirectX 基元不会在屏幕上移动【英文标题】:DirectX primitive doesn't move on screen when rotating camera 【发布时间】:2012-01-12 23:20:45 【问题描述】:我正在尝试使用顶点在屏幕上放置一个立方体...我有一个可以使用鼠标和键盘命令旋转和平移的相机...但是,在运行时,立方体的方形表面平放在屏幕并且在相机旋转时不移动...屏幕上的其他项目出现在方形表面后面...谁能解释渲染图元的过程?提前感谢您的任何帮助...非常感谢!
#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 );
【问题讨论】:
【参考方案1】:这都是矩阵数学。只要它的顶点通过顶点着色器中的逆相机变换(也称为相机或视图矩阵)进行变换,您的立方体就会旋转(它也应该通过它自己的世界变换矩阵和所谓的投影矩阵进行变换,这是负责的用于透视效果)。
假设您有一个顶点着色器(固定功能管道有点过时),您所要做的就是确保应用这些转换。通常,这是通过与 world*view*projection 矩阵的单次乘法来完成的,我很确定你在某个地方这样做,但它不是正确的。
渲染管道上有很多不错的资源,但哪一个是正确的取决于您使用的 DirectX/硬件级别(不过有一条红线它们都共享,基本 在过去的 15 年里,单个原语如何出现在屏幕上的想法并没有太大变化)。
由于您是 3D 图形的新手,我猜想,让我警告您:DirectX 和 OpenGl 可能很棘手/不直观,而且 3D 图形背后的数学通常不是微不足道的,两者一起经常会给您感觉某些东西不会移动,甚至不会出现在屏幕上。只需继续调试,使用教程或示例代码仔细检查您的代码,... .
【讨论】:
【参考方案2】:相机的矩阵在哪里?您只设置了一个世界矩阵。在调用 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);
您可能会在某处找到相机矩阵。
【讨论】:
以上是关于旋转相机时 DirectX 基元不会在屏幕上移动的主要内容,如果未能解决你的问题,请参考以下文章
请教directx 龙书中一个灵活的camera类 应用于物体的前进旋转 前进可以 但是旋转只是绕固定轴旋转呢
UnsatisfiedLinkError - 在 Android 中旋转相机图像数据(在 OpenCV 中使用,而不仅仅是在屏幕上显示)