2009-12-22 151 views
4

我已经在我的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; 
    } 

平移代码只是设置矩阵的平移组件。似乎在这两种情况下,我都需要撤销之前的翻译,以避免跳跃,但我看不出如何。谢谢。

尼克

新增回应评论:

矩阵是javax.matrix.Matrix4f

平移代码:

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加载()来设置最顶层矩阵堆栈中的。预期的输出是普通的平滑平移,在平移的情况下没有额外的跳跃,并且在缩放的情况下没有在缩放/缩放之前的跳跃。通过跳跃我的意思是现场意外转移。例如,如果场景是一个大方块,并且鼠标位于方块的中心,那么方块应该沿着鼠标拖动的方向移动,而方块的中心仍然位于鼠标下方。随着跳跃,鼠标将开始广场的中心,但平底锅的开始将移动场景,使得广场的不同部分现在在鼠标下方。缩放的跳跃工作原理类似。第一次缩放移动场景,以便最初位于鼠标下方的位置现在不再位于鼠标下方。

请注意,如果没有发生缩放,平移就可以正常工作。如果缩放不在某个特定点附近,平移也可以正常工作。

+0

是什么'matrix'以及它是如何在你的代码中使用?你用这个矩阵乘你的分数还是什么?你说你显示的功能用于缩放。那么平移代码在哪里? 请尝试给出一个更具体的例子,包括预期的输出和观测的输出。 – catchmeifyoutry 2009-12-22 22:40:13

回答

1

你的问题是,不是做一个三角洲翻译,你只需设置翻译。这在平移时起作用,但是,当您缩放时,由于缩放而不存储翻译,并且会在下一个翻译操作中被删除。所以我会做什么,而不是设置翻译是我会增加它。因此,当您拖动鼠标时,从2个gluUnProject调用中获取增量,然后将该增量添加到矩阵转换值。这将防止它消除由点行为周围的规模造成的轻微翻译。

所以:

public void pan(Vector3f delta_pan) 
{ 
    root.markAsDirty(); 
    matrix.m03 += delta_pan.x; 
    matrix.m13 += delta_pan.y; 
    matirx.m23 += delta_pan.z; 
}
+0

所以它是旋转/缩放后翻译? – 2012-08-23 18:23:25

+0

您好内德,你可以建议在Android的Opengl Es2.0的平移功能的任何示例代码我参考了更多的链接,但是,我无法得到关于平移的任何清晰的想法。如果你建议任何示例代码的手段,它的易于理解对我来说..谢谢推进 – harikrishnan 2013-06-28 13:32:20