Android系统。 OpenGl ES。摇摄/滚动

时间:2016-08-15 13:05:11

标签: android scroll opengl-es panning

我正在编写一个显示地图的应用程序。用户可以缩放和平移。根据磁力计的值旋转地图(地图在设备旋转的相反方向旋转)。

对于缩放我使用ScaleGestureDetector并将比例因子传递给Matrix.scaleM。

对于平移我正在使用此代码:

GlSurfaceView方面:

private void handlePanAndZoom(MotionEvent event) {
    int action = MotionEventCompat.getActionMasked(event);
    // Get the index of the pointer associated with the action.
    int index = MotionEventCompat.getActionIndex(event);
    int xPos = (int) MotionEventCompat.getX(event, index);
    int yPos = (int) MotionEventCompat.getY(event, index);

    mScaleDetector.onTouchEvent(event);

    switch (action) {
        case MotionEvent.ACTION_DOWN:
            mRenderer.handleStartPan(xPos, yPos);
            break;
        case MotionEvent.ACTION_MOVE:
            if (!mScaleDetector.isInProgress()) {
                mRenderer.handlePan(xPos, yPos);
            }
            break;
    }
}

渲染者方:

private static final PointF mPanStart = new PointF();
public void handleStartPan(final int x, final int y) {
    runOnGlThread(new Runnable() {
        @Override
        public void run() {
            windowToWorld(x, y, mPanStart);
        }
    });
}

private static final PointF mCurrentPan = new PointF();
public void handlePan(final int x, final int y) {
    runOnGlThread(new Runnable() {
        @Override
        public void run() {
            windowToWorld(x, y, mCurrentPan);
            float dx = mCurrentPan.x - mPanStart.x;
            float dy = mCurrentPan.y - mPanStart.y;
            mOffsetX += dx;
            mOffsetY += dy;
            updateModelMatrix();
            mPanStart.set(mCurrentPan);
        }
    });
}

windowToWorld函数使用gluUnProject并且有效,因为我将它用于许多其他任务。 UpdateModelMatrix:

private void updateModelMatrix() {
    Matrix.setIdentityM(mScaleMatrix,0);
    Matrix.scaleM(mScaleMatrix, 0, mScale, mScale, mScale);

    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);

    Matrix.setIdentityM(mTranslationMatrix,0);
    Matrix.translateM(mTranslationMatrix, 0, mOffsetX, mOffsetY, 0);

    // Model = Scale * Rotate * Translate
    Matrix.multiplyMM(mIntermediateMatrix, 0, mScaleMatrix, 0, mRotationMatrix, 0);
    Matrix.multiplyMM(mModelMatrix, 0, mIntermediateMatrix, 0, mTranslationMatrix, 0);
}

相同的mModelMatrix用于windowToWorld函数的gluUnproject中进行点转换。

所以我的问题是双重的:

  1. 平移比设备屏幕上的手指移动慢两倍
  2. 在连续平移几秒钟(例如在屏幕上制作圆圈)的某个时刻,地图开始“摇晃”。这种震动的幅度越来越大。看起来像handlePan迭代中的某些值会增加并导致此效果。
  3. 知道为什么会发生这种情况吗?

    提前谢谢你,格雷格。

1 个答案:

答案 0 :(得分:0)

嗯,我的代码的问题是这一行:

        mPanStart.set(mCurrentPan);

仅仅因为我拖动世界坐标并更新偏移量,但当前位置保持不变。这是我的错误。

删除此行将解决所有问题。