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只使用一次的效果是相同的,如果还有后续操作,那么结果是不同的,应该使用相应的正确方法。