18.关于动态改变模型矩阵

本文探讨了在图形渲染中使用模型矩阵时遇到的问题,详细解释了如何通过正确更新mvpMatrix来避免显示错误,并提出了一个实用的解决方案。

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

1.问题描述:一般来说,我们设置全局变量来保存模型矩阵的参数,当用户输入时改变参数,最后在draw方法中计算矩阵并传入着色器,但是今天我遇到了这样的问题:

    在draw方法中,mvpMatrix.multiply(modelMatrix),键盘事件中以步长的方式改变了模型参数,即:Y_ANGLE +=(-=) ANGLE_STEP;实现的效果出错,原因在于:

    当modelMatrix中参数改变时,与mvpMatrix相乘后mvpMatrix发生了改变,在进行下次运算时导致mvpMatrix是在上次变换后的基础上进行变换,显示效果出错。

//键盘事件
Y_ANGLE +=(-=) ANGLE_STEP;
draw(...);
//每次事件触发时执行情况如下:每次mvpMatrix的初值都不同,导致显示效果出错
draw(){
    modelMatrix.setRotate(Y_ANGLE);
    mvpMatrix.muliply(modeMatrix);
}

    值得注意的是:这时我们很自然的想到,那只要把每次事件触发后Y_ANGLE赋值为要改变的角度就可以了,即

//键盘事件
Y_ANGLE = ANGLE(-ANGLE);
draw(...);
//每次事件触发时执行情况如下:每次mvpMatrix的初值都不同,导致显示效果出错
draw(){
    modelMatrix.setRotate(Y_ANGLE);
    mvpMatrix.muliply(modeMatrix);
}

这样的确可以解决该问题,但是当会导致每次调用draw方法时都会旋转指定角度(不论旋转角度的事件是否触发),所以我们应该采用下面的方案

2.解决方案:

应该在主函数中定义投影视图矩阵viewProjMatrix来设置投影和视图参数,然后将该矩阵传入draw方法,在每次调用draw方法之前先将viewProj矩阵赋给mvpMatrix,再进行运算,即

//键盘事件
Y_ANGLE +=(-=) ANGLE_STEP;

draw(){
    mvpMatrix.set(viewProjMatrix);
    modelMatrix.setRotate(Y_ANGLE...)
    mvpMatrix.multiply(modelMatrix);
}

3.关于Matrix4中设置模型变换参数的进一步理解:

 

如果Matrix4的参数皆未设置,setFunName和funName只使用一次的效果是相同的,如果还有后续操作,那么结果是不同的,应该使用相应的正确方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值