在Qt 5.9 Qt OpenGL Hello GL2 Example中,为了实现对象的旋转,在计算从鼠标移动开始的旋转时,存在度归一化函数。我只是不明白1)为什么它需要dx和dy时间8来获得鼠标移动距离?和2)然后在这里360度16来规范角度,为什么16? 3)通过划分16来设置渲染中的旋转?感谢。
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
int dx = event->x() - m_lastPos.x();
int dy = event->y() - m_lastPos.y();
if (event->buttons() & Qt::RightButton) {
....
setZRotation(m_zRot + 8 * dx);
}
m_lastPos = event->pos();
}
static void qNormalizeAngle(int &angle) {
while (angle < 0)
angle += 360 * 16;
while (angle > 360 * 16)
angle -= 360 * 16;
}
void GLWidget::setZRotation(int angle)
{
qNormalizeAngle(angle);
if (angle != m_zRot) {
m_zRot = angle;
.....
update();
}
}
void GLWidget::paintGL() {
....
m_world.rotate(m_zRot / 16.0f, 0, 0, 1);
....
}
答案 0 :(得分:0)
有关代码的一切都闻起来像是一个根本不知道他们正在做什么的人。
他们所做的效果就是这个。他们相对于鼠标增量将输入角度缩放了8。这导致最终角度大8倍。但是在得到矩阵之前,他们将这个角度除以16。因此,他们所做的就是将输入角度缩放0.5。
夹紧到范围[0,360 * 16]只是废话的一部分。他们只是以一种非常迟钝和疯狂的方式将
总的来说,我说你应该避免像瘟疫一样的Qt示例代码。
答案 1 :(得分:0)
我会假设他们只是想在旋转中保持更高的精度,因为示例中的变量是整数。用浮子将它们分开可以使旋转更平稳。 通过乘以鼠标dx只是使其变得更加敏感-使其更容易翻转。 我认为这反倒不是一个坏例子。