Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openGL相机围绕点和平移进行缩放/缩放_Opengl_Matrix - Fatal编程技术网

openGL相机围绕点和平移进行缩放/缩放

openGL相机围绕点和平移进行缩放/缩放,opengl,matrix,Opengl,Matrix,我已经在我的2D opengl应用程序中实现了一个相机(模型视图),在围绕一个点进行缩放以及结合平移围绕一个点进行缩放时遇到了一些问题。两者都与鼠标一起工作。平移使用鼠标拖动,缩放到点会围绕当前鼠标位置放大/缩小 平移效果很好,只要我还没有围绕一个点缩放。如果我围绕一个点进行缩放,那么平移中会有一个初始的“跳跃”,但随后它会平稳地工作。对于第一个点,围绕点缩放可以正常工作,但对于后续点,场景会平移一次,然后围绕当前鼠标点缩放即可。围绕点的比例代码如下所示: public void scaleTo

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


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

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

因此:


什么是矩阵,它在代码中是如何使用的?你用这个矩阵乘以你的点还是什么?您说您显示的函数用于缩放。那么平移代码在哪里呢?请试着给出一个更具体的例子,包括预期输出和观察到的输出。所以它在旋转/缩放后进行转换?嗨,你能为Android中的Opengl Es2.0中的平移功能推荐任何示例代码吗?我参考了更多的链接,但是,我对平移没有任何清晰的概念。如果你推荐任何示例代码的意思,对我来说很容易理解。。提前谢谢
public void pan(Vector3f delta_pan)
{
    root.markAsDirty();
    matrix.m03 += delta_pan.x; 
    matrix.m13 += delta_pan.y;
    matirx.m23 += delta_pan.z;
}