DX11实现四棱锥的缩放和平移

本文详细介绍了如何利用鼠标滚轮、键盘输入以及鼠标中键来实现四棱锥在3D空间中的移动和缩放功能。通过处理WM_MOUSEWHEEL和WM_MOUSEHOVER消息,结合静态变量betaX和betaY记录移动距离,以及lambda表示缩放系数,实现鼠标操作。同时,通过监听键盘WASD键和QE键,调整betaX和betaY或lambda来控制四棱锥的移动和缩放。最后,通过矩阵运算将这些变换应用到四棱锥的模型矩阵上,完成动态效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在文章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));

这样就实现了鼠标控制四棱锥的移动和缩放。

效果展示:

四棱锥的移动和缩放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hunnybub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值