我正在尝试使用Direct 3D。但是我无法使fov相机正常工作。至少不是垂直运动。我想出了原因,但仍然无法解决。
我正在使用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天。我希望你能帮助我。
最佳答案
您的旋转矩阵设置看起来有些奇怪:
D3DXMatrixRotationY(&viewRotYMat, rotY);
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ);
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1);
您到底想在这里实现什么?通常,您只需要做几次轴旋转,然后将它们组合起来即可,您的代码看上去完全一样,但是矩阵组合的顺序混乱了,然后用一些显式的三角函数进行了补偿。您很有可能只需
D3DXMatrixRotationY(&viewRotYMat, rotY);
D3DXMatrixRotationX(&viewRotXMat, rotXZ);
否则,您可以使用
D3DXMatrixRotationYawPitchRoll
至少将3个角度组合在一行中。至于
rotY
值,请记住,它预计以弧度为单位,因此3-4对应于180°。观察45°可以用rotXZ
贡献来解释。