2013-12-18 3 views
1

Я делаю простую учебную игру с openGL и задаюсь вопросом о методе касания. Пожалуйста, проверка мой код:мышь прессовая проекция (C++ 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.

+2

Возможно, вы ищете 'gluUnproject()'? Я не могу предоставить ссылку сейчас, мое соединение несколько неустойчивое :-( – Angew

+0

спасибо, я посмотрю на функцию, но на мгновение я думаю, что лучший подход находится здесь:/ http://stackoverflow.com/a/13299602/2204866 Thokra, я пытаюсь сделать управление перетаскиванием для текстуры, взять текстуру и перемещаться по методу мыши. – gronzzz

+0

Вы можете/должны также рассмотреть аналогичный вопрос, который я когда-то задавал. Http: // stackoverflow .com/questions/18244678/3d-ray-picking-use-mouse-coord-when-mouse-isnt-locked – Vallentin

ответ

2

Учитывая проще орфографическая проекция, ваш «х-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 

Здесь, левый/справа/снизу/сверху взяты из glOrtho, что в вашем случае может быть заменен следующим образом (но, конечно, хранить в переменной, тем лучше) ...

x = -400 + x * (400 - (-400)); 
y = -300 + y * (300 - (-300)); 

Если вы использовали перспективную проекцию он получает немного более сложным, как я описал here.

[РЕДАКТИРОВАТЬ]
Предполагая, что размер окна 800x600, указанное в {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 
+0

Спасибо, я использую простую проекцию и, прежде всего, хочу попробовать gluUnproject(), так как я понимаю , это метод специально для этого, а затем простой подход с числами. Кстати, я понимаю, что это будет X = x - 400; Y = 300 - y; , потому что мне нужно в точках, но в моей системе координат с (0,0) в центре) – gronzzz

+1

@gronzzz Предполагая, что у вас есть окно «800x600», тогда приведенный выше код фактически отменяет это. 'gluUnproject' будет работать отлично, но, как вы говорите, довольно просто сделать это самостоятельно с орфографической проекцией. – jozxyqk

+0

извините, мой глупый, но почему отменяет? коснитесь y в 50, поэтому touch в моей системе координат будет 300 - 50 = 250, и это правая точка, коснитесь y в 450, дайте мне -150, поскольку мне нужно ... так что мне не нужны значения от -1 до 1, мне нужно точек в моей системе координат. снова, если я тупой – gronzzz

Смежные вопросы