您的位置:首页 > 其它

键盘控制摄像机位置改变

2010-07-01 15:24 176 查看
龙书的例程代码中真有许多值得我研究的地方。今天学习光照,自己动手写了一下那个有4个集合体的例子,我一开始用的是自动旋转的代码,突然想看看龙书的代码是怎么做的,于是看到了如下一段:

static float angle = (3.0f * D3DX_PI) / 2.0f;
static float height = 5.0f;

if (::GetAsyncKeyState(VK_LEFT) & 0x8000f)
{
angle -= timeDelta * 0.5f;
}
if (::GetAsyncKeyState(VK_RIGHT) & 0x8000f)
{
angle += timeDelta * 0.5f;
}
if (::GetAsyncKeyState(VK_UP) & 0x8000f)
{
height += timeDelta * 5.0f;
}
if (::GetAsyncKeyState(VK_DOWN) & 0x8000f)
{
height -= timeDelta * 5.0f;
}

D3DXVECTOR3 position(cosf(angle) * 7.0f, height, sinf(angle) * 7.0f);
D3DXVECTOR3 target(0, 0, 0);
D3DXVECTOR3 worldup(0, 1, 0);
D3DXMATRIX v;
D3DXMatrixLookAtLH(&v, &position, &target, &worldup);
device->SetTransform(D3DTS_VIEW, &v);


这一段通过键盘的上、下、左和右方向键控制摄像机的位置。首先定义了两个静态变量angle和height分别用来计算摄像机的位置。具体的位置计算公式是:D3DXVECTOR3 position(cosf(angle) * 7.0f, height, sinf(angle) * 7.0f);

也就是说,摄像机在xz平面上处在一个半径为7的圆上,x坐标为cos(angle),z坐标为sin(angle),而y坐标就是我们的高度,而高度控制则是通过上面的代码进行的,为了使运动平滑起来,我们使用了timeDelta作为移动的参数。

上述这段代码实现的移动效果非常好,摄像机始终定位在原点,看起来非常舒服!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: