проекция нажатия мыши (c ++ openGL)

Я делаю простую обучающую игру с 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.

1

Решение

Учитывая более простую ортографическую проекцию, ваш «Х-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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]