【发布时间】:2009-12-22 22:22:46
【问题描述】:
我已经在我的 2D opengl 应用程序中实现了一个相机(模型视图),并且在围绕一个点缩放以及围绕一个点缩放与平移相结合时遇到了一些问题。两者都可以使用鼠标。平移与鼠标拖动一起使用,并缩放到当前鼠标位置周围的点放大/缩小。
只要我还没有围绕一个点进行缩放,平移就可以正常工作。如果我已经围绕一个点进行了缩放,那么在平移中会有一个初始的“跳跃”,但它可以顺利运行。围绕一个点缩放第一个点可以正常工作,但对于后续点,场景平移一次,然后围绕当前鼠标点进行缩放。点代码周围的比例如下所示:
public void scaleToPoint(float scale, float x, float y, float z) {
root.markAsDirty();
y = drawableHeight - y - 1;
// (S(Inverse(T))
matrix.m03 = -x;
matrix.m13 = -y;
matrix.m23 = -z;
matrix.m00 = matrix.m11 = matrix.m22 = scale;
matrix.m03 *= matrix.m00;
matrix.m13 *= matrix.m11;
matrix.m23 *= matrix.m22;
matrix.m03 += x;
matrix.m13 += y;
matrix.m23 += z;
}
平移代码只是设置矩阵的平移分量。似乎在这两种情况下,我都需要以某种方式撤消先前的翻译以避免跳转,但我看不出如何。谢谢。
尼克
为回应评论添加:
平移代码:
public void pan(Vector3f pan) {
root.markAsDirty();
matrix.setTranslation(pan);
}
其中 matrix.setTranslation 设置矩阵的平移分量,即:
matrix.m03 = trans.x;
matrix.m13 = trans.y;
matirx.m23 = trans.z;
使用 glLoadMatrix() 加载矩阵以设置堆栈中的最顶层矩阵。预期的输出是正常的平滑平移,在平移的情况下没有额外的跳跃,在缩放的情况下在缩放/缩放之前没有跳跃。跳跃是指场景出乎意料地变化。因此,例如,如果场景是一个大正方形并且鼠标位于正方形的中心,则正方形应该沿鼠标拖动的方向移动,而正方形的中心仍然在鼠标下方。随着跳跃,鼠标将从正方形的中心开始,但平移的开始将移动场景,使得正方形的不同部分现在位于鼠标下方。缩放的跳跃同样起作用。第一次缩放会移动场景,使最初位于鼠标下方的位置现在不再位于鼠标下方。
请注意,如果没有围绕某个点进行缩放,则平移可以正常工作。如果缩放不在某个特定点附近,平移也可以正常工作。
【问题讨论】:
-
什么是
matrix,它是如何在您的代码中使用的?你是用这个矩阵乘以你的点还是什么?您说您显示的功能用于缩放。那么平移代码在哪里呢?请尝试给出一个更具体的例子,包括预期输出和观察到的输出。