我已经在我的2D opengl应用程序中实现了一个相机(模型视图),并且在缩放某个点时发生了一些问题,并且还结合平移缩放了一个点。两者都适用于鼠标。平移使用鼠标拖动进行工作,并在当前鼠标位置周围进行缩放以放大/缩小。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'以及它是如何在你的代码中使用?你用这个矩阵乘你的分数还是什么?你说你显示的功能用于缩放。那么平移代码在哪里? 请尝试给出一个更具体的例子,包括预期的输出和观测的输出。 – catchmeifyoutry 2009-12-22 22:40:13