openGL 相机缩放/缩放点和平移

标签 opengl matrix

我已经在我的 2D opengl 应用程序中实现了一个相机(模型 View ),并且在围绕一个点缩放以及围绕一个点缩放与平移相结合时遇到了一些问题。两者都使用鼠标。平移与鼠标拖动一起工作,并缩放到当前鼠标位置周围的点放大/缩小。

只要我还没有围绕一个点缩放,平移就可以正常工作。如果我围绕一个点进行缩放,那么平移中会有一个初始的“跳跃”,但随后它运行顺利。围绕一个点缩放对于第一个点可以正常工作,但对于后续点,场景会平移一次,然后围绕当前鼠标点缩放。点代码周围的比例看起来像:

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

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

最佳答案

您的问题是,您只需设置翻译,而不是进行增量翻译。这仅适用于平移,但是,当您缩放时,由于缩放,您不会存储翻译,并且会在下一个翻译操作中删除。所以我会做什么,而不是设置翻译,我会增加它。因此,当您拖动鼠标时,从 2 个 gluUnProject 调用中获取增量,然后将该增量添加到矩阵平移值中。这将防止它删除由围绕点 Action 的比例产生的轻微平移。

所以:

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

关于openGL 相机缩放/缩放点和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1949597/

相关文章:

linux - Linux 依赖项的 Mac Firebreath 插件端口

c++ - 从深度纹理采样总是结果为 0

C++ OpenGL 绘制一个房间

c - fscanf 无法从多维矩阵文件中读取正确的 double

opengl - 关于 glBindTexture 的问题

c++ - 当仅需要 X-Y 旋转时,3D 对象沿所有三个轴旋转

c++ - 透视投影与光线追踪/光线转换的效率

matlab - 替换矩阵中的特定数字

c++ - 在 C++ 中按列保存矩阵

c++ - 在 C++ 或 Python 中从多个输入文件创建矩阵