面对同样的问题并解决了一些问题。首先我将解释它,然后将粘贴转换方法。
的问题,你想拥有
坐标场景坐标其相关的场景开始(0,0)点(在我的情况左下角为AndEngine anchorCenter)和界限从( 0,0)改为[Camera.getSurfaceWidth(),Camera.getSurfaceHeight()]。
坐标从MotionEvent得到的是屏幕坐标与界限从(0,0)到[displayMetrix.widthPixels,displayMetrix.heightPixels]而且他们总是恒定不进行变焦或相机对场景位置的事情。
解决方案的解释
对于横坐标(一般X)计算,你将需要屏幕corrdinates转化为相关现场协调(带摄像头的宽度为界),并把它添加到相机在场景左上角的位置。式,它看起来像:
x = cameraStartX + screenX * camera.width/display.width
cameraStartX - camera left corner x position on the scene
screenX - x you get from MotionEvent
camera.width - just getWidth() from your camera method
display.width - display width from DisplayMetrics
对于坐标(一般Ÿ),你必须做同样为横坐标,但请记住,这是(最重要的),有错误的方向。因此,公式会有点改变:
y = cameraStartY+(display.heigth-screenY)*camera.height/display.heigth
cameraStartY - camera left corner y position on the scene
screenX - y you get from MotionEvent
camera.height - just getHeight() from your camera method
display.height - display height from DisplayMetrics
方法实现的例子
public static void convertScreenToSurfaceCoordinates(
final Camera camera,
final Context context,
final float[] screenCoordinates,
final float[] surfaceCoordinates) {
//you may want to have separate method and fields for display metrics
//and no Context as a method param
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
float displayWidth = Math.max(metrics.widthPixels, metrics.heightPixels);
loat displayHeight = Math.min(metrics.widthPixels, metrics.heightPixels);
//abscissa
surfaceCoordinates[Constants.VERTEX_INDEX_X] = camera.getXMin()
+ screenCoordinates[Constants.VERTEX_INDEX_X] * camera.getWidth()
/displayWidth;
//ordinate
surfaceCoordinates[Constants.VERTEX_INDEX_Y] = camera.getYMin()
+ (displayHeight - screenCoordinates[Constants.VERTEX_INDEX_Y])
* camera.getHeight()/displayHeight;
}
我这样做,看到问题。问题在于坐标指定了手机屏幕上的触摸点,而不是场景。 TouchEvent将屏幕坐标转换为场景坐标,我正在寻找一种方法可以为我做到这一点。 – JohnEye 2012-04-30 09:20:19