Я делаю простую обучающую игру с openGL и у меня есть вопрос о сенсорном методе. Пожалуйста, проверьте мой код:
Моя (0,0) точка находится в центре экрана:
void Init()
{
glClearColor(0.3,0.3,0.3,0.0);
glMatrixMode(GL_PROJECTION);
glOrtho(-400.0,400.0,-300.0,300.0,0,1.0); //сетка, середина в точке 0
}
Перед этим я вызываю методы мыши:
glutPassiveMotionFunc(Mouse);
glutMouseFunc(MousePress);
А в методе MousePress, когда наступает прикосновение, это другая системная координата с точкой (0,0) в левом верхнем углу экрана. Подскажите, пожалуйста, лучший подход, чем сделать что-то вроде x-300; y-400 в методе MousePress.
Учитывая более простую ортографическую проекцию, ваш «Х-300, у-400» это правильный подход, хотя вы можете захотеть сделать некоторые масштабирования тоже …
float x = mouseX/(float)windowWidth;
float y = 1.0f - mouseY/(float)windowHeight; //flip since y=0 is at the top
//x and y are now 0 to 1, bottom left to top right
x = left + x * (right - left);
y = bottom + y * (top - bottom);
//x and y are now in 3D coordinates
Здесь left / right / bottom / top взяты из glOrtho, которое в вашем случае можно заменить следующим образом (но, конечно, лучше хранить переменную) …
x = -400 + x * (400 - (-400));
y = -300 + y * (300 - (-300));
Если вы использовали перспективную проекцию, она становится немного сложнее, как я описал Вот.
[РЕДАКТИРОВАТЬ] Предполагая, что размер окна составляет 800×600, вышеприведенное отменяет{x-400,300-y}
, Например,
mouseY = 50;
windowHeight = 600;
float y = 1.0f - (50/(float)600); //1.0 - 0.08333 = 0.91667
y = -300 + y * (300 - (-300)); //-300 + 0.91667 * 600 = 250, also 300-50
Других решений пока нет …