前言
在文章https://blog.csdn.net/hnbxs/article/details/129786077中,我已经配置好了键鼠的一些基本操作,本文我将继续说明如何用键鼠实现四棱锥的移动和缩放功能。
实现键鼠移动和缩放四棱锥
1.鼠标移动四棱锥
因为之前我已经把鼠标左键用来实现旋转功能,这里我就用鼠标滚轮键来实现移动功能,这里的移动是在xoy平面内的二维移动。
首先在D3DApp::MsgProc()中添加两个处理鼠标滚轮输入的情况
//鼠标滚轮
case WM_MOUSEWHEEL:
case WM_MOUSEHOVER:
接着在GameApp::UpdateScene()中,定义两个静态float变量用于记录x轴和y轴的移动距离
static float betaX = 1.0f, betaY = 1.0f;
新定义一个静态float变量作为缩放系数
static float lambda = 1.0f;
添加按下鼠标中键并移动时,让四棱锥移动的代码
//鼠标中键按下时可移动四棱锥
if (mouseState.middleButton == true && m_MouseTracker.middleButton == m_MouseTracker.HELD)
{
betaX -= (lastMouseState.x - mouseState.x) * 0.01f;
betaY += (lastMouseState.y - mouseState.y) * 0.01f;
}
2.鼠标滚轮缩放四棱锥
因为已经在MsgProc中添加鼠标滚轮的处理,这里我们只需要记录鼠标滚轮的改变量来控制缩放
lambda += (mouseState.scrollWheelValue - lastMouseState.scrollWheelValue) * 0.001f;
3.键盘移动四棱锥
类似鼠标,我们只需要让对应按键改变对应方向的移动距离
if (keyState.IsKeyDown(Keyboard::W))//按下w向上移动
{
betaY += dt * 0.5f;
}
if (keyState.IsKeyDown(Keyboard::A))//按下a向左移动
{
betaX -= dt * 0.5f;
}
if (keyState.IsKeyDown(Keyboard::S))//按下s向下移动
{
betaY -= dt * 0.5f;
}
if (keyState.IsKeyDown(Keyboard::D))//按下d向右移动
{
betaX += dt * 0.5f;
}
4.键盘缩放四棱锥
类似鼠标,这次改变的是lambda的大小
if (keyState.IsKeyDown(Keyboard::Q))//按下q放大
{
lambda += dt * 0.5f;
}
if (keyState.IsKeyDown(Keyboard::E))//按下e缩小
{
lambda -= dt * 0.5f;
}
5.更新常量缓冲区
前四步只设置好了对应的改变量,还未将其作用于四棱锥上,所以我们还要用矩阵来进行相应的操作,在Direct3D的数学库里,我们需要用到两个函数来帮我们完成移动和缩放,它们分别是XMMatrixTranslation函数和XMMatrixScaling函数,最后还需要用XMMatrixTransPose函数来进行矩阵转置。
首先设置平移矩阵的参数
XMMatrixTranslation(betaX,betaY,1.0f)
然后是缩放矩阵
XMMatrixScaling(lambda, lambda, lambda)
再将其和之前的旋转矩阵相乘再转置,赋值给常量缓冲区
m_CBuffer.world = XMMatrixTranspose( XMMatrixRotationY(theta) * XMMatrixRotationX(phi) * XMMatrixScaling(lambda, lambda, lambda) * XMMatrixTranslation(betaX,betaY,1.0f));
这样就实现了鼠标控制四棱锥的移动和缩放。
效果展示:
四棱锥的移动和缩放