2014-03-23 5 views
4

Я пытаюсь принять событие касания и перемещать фигуру туда, куда движется сенсорное событие.Android OpenGL ES: Нормализованная координата MotionEvent

public boolean onTouchEvent(MotionEvent e) { 
    mRenderer.setPosition(e.getX(), e.getY()); 

    return true; 
} 

Проблема заключается в том, что координаты я получаю от MotionEvent являются расположение экрана в пикселях, не нормированные координаты [-1, 1]. Как преобразовать координаты экрана в нормализованные координаты? Заранее спасибо!

ответ

4
float x = e.getX(); 
    float y = e.getY(); 
    float screenWidth; 
    float screenHeight; 

    float sceneX = (x/screenWidth)*2.0f - 1.0f; 
    float sceneY = (y/screenHeight)*-2.0f + 1.0f; //if bottom is at -1. Otherwise same as X 

Чтобы добавить немного более общий код:

/* 
Source and target represent the 2 coordinate systems you want to translate points between. 
For this question the source is some UI view in which top left corner is at (0,0) and bottom right is at (screenWidth, screenHeight) 
and destination is an openGL buffer where the parameters are the same as put in "glOrtho", in common cases (-1,1) and (1,-1). 
*/ 
float sourceTopLeftX; 
float sourceTopLeftY; 
float sourceBottomRightX; 
float sourceBottomRightY; 

float targetTopLeftX; 
float targetTopLeftY; 
float targetBottomRightX; 
float targetBottomRightY; 

//the point you want to translate to another system 
    float inputX; 
    float inputY; 
//result 
    float outputX; 
    float outputY; 

outputX = targetTopLeftX + ((inputX - sourceTopLeftX)/(sourceBottomRightX-sourceTopLeftX))*(targetBottomRightX-targetTopLeftX); 
outputY = targetTopLeftY + ((inputY - sourceTopLeftY)/(sourceBottomRightY-sourceTopLeftY))*(targetBottomRightY-targetTopLeftY); 

С помощью этого метода вы можете перевести любую точку между любыми N-мерных ортогональных систем (для 3D просто добавить то же самое для Z как для X и Y). В этом примере я использовал граничные координаты представления, но вы можете использовать ЛЮБОЙ 2 точки в сцене, например, этот метод будет работать все равно, если использовать центр экрана и верхний правый угол. Единственными ограничениями являются sourceTopLeftX! = SourceBottomRightX для каждого измерения

+0

Хорошее предложение, но для людей, которые смотрят на этот ответ в будущем, будут устали от координат вашей камеры! –

+0

Вот более общий код. Я надеюсь, что это помогает.. –