我正在尝试使用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贡献来解释。

10-08 09:11