【问题标题】:openGL camera zoom / scale around point and pan围绕点和平移的openGL相机缩放/缩放
【发布时间】: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;
  }

平移代码只是设置矩阵的平移分量。似乎在这两种情况下,我都需要以某种方式撤消先前的翻译以避免跳转,但我看不出如何。谢谢。

尼克

为回应评论添加:

矩阵是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() 加载矩阵以设置堆栈中的最顶层矩阵。预期的输出是正常的平滑平移,在平移的情况下没有额外的跳跃,在缩放的情况下在缩放/缩放之前没有跳跃。跳跃是指场景出乎意料地变化。因此,例如,如果场景是一个大正方形并且鼠标位于正方形的中心,则正方形应该沿鼠标拖动的方向移动,而正方形的中心仍然在鼠标下方。随着跳跃,鼠标将从正方形的中心开始,但平移的开始将移动场景,使得正方形的不同部分现在位于鼠标下方。缩放的跳跃同样起作用。第一次缩放会移动场景,使最初位于鼠标下方的位置现在不再位于鼠标下方。

请注意,如果没有围绕某个点进行缩放,则平移可以正常工作。如果缩放不在某个特定点附近,平移也可以正常工作。

【问题讨论】:

  • 什么是matrix,它是如何在您的代码中使用的?你是用这个矩阵乘以你的点还是什么?您说您显示的功能用于缩放。那么平移代码在哪里呢?请尝试给出一个更具体的例子,包括预期输出和观察到的输出。

标签: opengl matrix


【解决方案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;
}

【讨论】:

  • 所以它在旋转/缩放后正在平移?
  • 嗨,内德,你能建议任何关于 Android 中 Opengl Es2.0 中平移功能的示例代码吗?我参考了更多链接,但是,我对平移没有任何明确的想法。如果你建议任何示例代码意味着,它对我来说很容易理解.. 感谢 Advance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2013-11-15
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多