2016-09-14 56 views
0

我正在尝试Direct 3D的入门。但我无法让fov相机工作。至少不是垂直运动。我想出了为什么,但我仍然无法解决它。Direct3D9无法获得垂直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函数将角度作为参数,但有些浮点数?该参数甚至是命名角度...我现在在这个问题上约3天。我希望你能帮助我。

+1

你的角度是否为弧度或弧度?它应该作为弧度传递给'D3DXMatrixRotationY'(和'cos' /'sin')。 '&(viewMat * viewRotXMat * viewRotYMat * viewRotZMat)'中的临时右值的地址也不符合标准,但您的编译器可能会支持它。 – user4407569

+0

这是directx教程显示的做法.http://www.directxtutorial.com/ –

+0

rotY显然是弧度。但我定义了一个新的浮动,它以sin度为单位旋转。但它仍然会像以前一样失败。它翻转周围45 *,135 *等 –

回答

2

您的旋转矩阵设置看起来有点怪异:

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贡献。

+0

谢谢。但不知何故,相机仍然会这样翻转0 * 90 * usw。 变化: float deg = rotY *(180/PI); \t D3DXMatrixRotationYawPitchRoll(&viewRotXMat,rotY,sin(deg)* rotXZ,(cos(deg)* rotXZ)* -1); 我评论了rotationxyz的设置。 –

+0

正如我所说,你有这个奇怪的三角组合,这可能会导致万向节锁和所有类型的翻转,对于POV相机请尝试使用只有2个角度没有三角调用 – Ap31

+0

这样的功能将是完美的,但我找不到一个。你知道这个名字吗? –