Android。打开 GlES。 panning/scrolling
Android. OpenGl ES. panning/scrolling
我正在编写一个显示地图的应用程序。用户可以缩放和平移。地图根据磁力计的值旋转(地图以与设备旋转相反的方向旋转)。
为了缩放,我使用 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 并有效,因为我将它用于许多其他任务。更新模型矩阵:
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);
}
windowToWorld 函数的 gluUnproject 中使用相同的 mModelMatrix 进行点转换。
所以我的问题有两个:
- 平移比手指在设备屏幕上的移动慢两倍
- 在某些时候连续平移几秒钟(例如在屏幕上画圈)地图开始 'shake'。这震动的幅度越来越大。看起来有些值在 handlePan 迭代中加起来并导致这种效果。
知道为什么会这样吗?
提前谢谢你,格雷格。
嗯,我的代码的问题是这一行:
mPanStart.set(mCurrentPan);
仅仅是因为我拖入了世界坐标,并更新了偏移量,但当前位置保持不变。这是我的错误。
删除此行将解决所有问题。
我正在编写一个显示地图的应用程序。用户可以缩放和平移。地图根据磁力计的值旋转(地图以与设备旋转相反的方向旋转)。
为了缩放,我使用 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 并有效,因为我将它用于许多其他任务。更新模型矩阵:
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);
}
windowToWorld 函数的 gluUnproject 中使用相同的 mModelMatrix 进行点转换。
所以我的问题有两个:
- 平移比手指在设备屏幕上的移动慢两倍
- 在某些时候连续平移几秒钟(例如在屏幕上画圈)地图开始 'shake'。这震动的幅度越来越大。看起来有些值在 handlePan 迭代中加起来并导致这种效果。
知道为什么会这样吗?
提前谢谢你,格雷格。
嗯,我的代码的问题是这一行:
mPanStart.set(mCurrentPan);
仅仅是因为我拖入了世界坐标,并更新了偏移量,但当前位置保持不变。这是我的错误。
删除此行将解决所有问题。