我正在尝试开始使用Direct 3D。但我不能让前视摄像头工作。至少不是垂直运动。我想通了为什么,但我还是修不好。
我使用的是C++ (140)和D3DX9
代码:
D3DXMATRIX viewMat;
static D3DXMATRIX viewRotXMat;
static D3DXMATRIX viewRotYMat;
static D3DXMATRIX viewRotZMat;
static float rotY = 0.0f;
static float rotXZ = 0.0f;
if (GetAsyncKeyState(VK_LEFT)) { rotY += 0.1f; }
if (GetAsyncKeyState(VK_RIGHT)) { rotY -= 0.1f; }
if (GetAsyncKeyState(VK_UP)) { rotXZ += 0.1f; }
if (GetAsyncKeyState(VK_DOWN)) { rotXZ -= 0.1f; }
//POINT pMO = getMouseOffset();
//rotY += pMO.x / 10;
//rotXZ += pMO.y / 10;
D3DXMatrixLookAtLH(&viewMat,
&D3DXVECTOR3(10.0f, 10.0f, 0.0f), //pos
&D3DXVECTOR3(0.0f, 10.0f, 0.0f), //look-at
&D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //weird values
D3DXMatrixRotationY(&viewRotYMat, rotY);
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ);
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1);
d3ddev->SetTransform(D3DTS_VIEW, &(viewMat * viewRotXMat * viewRotYMat * viewRotZMat));
D3DXMatrixPerspectiveFovLH(&projMat,
D3DXToRadian(90),
(FLOAT)SIZEX / (FLOAT)SIZEY,
1.0f,
1000.0f);
d3ddev->SetTransform(D3DTS_PROJECTION, &projMat);这是我的RenderFrame函数的重要部分。它不能工作的原因是因为rotY和rotXZ。由于某些原因,当我将相机旋转45度时,rotY变量只会变成3-4。那么,为什么D3DXMatrixRotationY函数不接受角度作为参数,而是接受一些浮点数呢?这个参数甚至被命名为angle...我已经在这个问题上研究了大约3天了。我希望你能帮助我。
发布于 2016-09-15 03:10:34
旋转矩阵的设置看起来有点奇怪:
D3DXMatrixRotationY(&viewRotYMat, rotY);
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ);
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1);你在这里到底想要达到什么目的?通常,你只需要做几次轴旋转,然后组合它们,你的代码看起来就像这样,但是矩阵组合的顺序混乱,然后用一些显式的三角来补偿。有一个很好的机会,你可以做同样的事情
D3DXMatrixRotationY(&viewRotYMat, rotY);
D3DXMatrixRotationX(&viewRotXMat, rotXZ);否则,您可以使用D3DXMatrixRotationYawPitchRoll至少将三个角度组合在一条直线上。
至于rotY值,请记住,它预计是以弧度测量的,因此3-4相当于180°。相反,观测45°可以用rotXZ贡献来解释。
https://stackoverflow.com/questions/39497636
复制相似问题