繁体   English   中英

Direct3D9无法使垂直Fov相机正常工作

[英]Direct3D9 Can't get vertical fov camera working

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM