같은 문제에 직면하여 해결 방법을 찾았습니다. 먼저 설명을 한 다음 convert 메소드를 붙여 넣습니다.
당신이 갖고 싶어 좌표 문제는 장면에서 장면과 관련이 (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에서) 좌표 당신은 가로 좌표의 경우와 동일한 기능을 수행하지만이 있다고 (무엇보다도)를 기억 잘못된 방향을 가지고해야합니다 : 같은 식 같습니다. 그래서 공식은 약간 변경 될 것입니다 :
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