面對同樣的問題並解決了一些問題。首先我將解釋它,然後將粘貼轉換方法。
的問題,你想擁有
座標場景座標其相關的場景開始(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