2013-07-09 3 views
0

Я хочу, чтобы квадрат (представленный head) всегда был лицом к мыши (представлен Mouse - да, это LWJGL). У меня немного проблемы на самом деле получить его к лицу torward мыши, потому что я использую glRotatef(angle), которыйПоиск угла с использованием трех точек

  1. Требует градусов, в то время как большинство Java Math функции включают радиан
  2. трудно сделать, так как я нет способа узнать, как далеко я должен вращаться, чтобы указать к мыши

я взбитыми следующий Java-код, который предполагает, что 0 градусов не прямо:

double mx = Mouse.getX(); 
double my = Mouse.getY(); 
double rx = head.x; 
double ry = head.y + 1; 
double vx = head.x; 
double vy = head.y; 
double mtor = Math.sqrt(Math.pow(mx + rx, 2) + Math.pow(my + ry, 2)); 
double mtov = Math.sqrt(Math.pow(mx + vx, 2) + Math.pow(my + vy, 2)); 
double rtov = Math.sqrt(Math.pow(rx + vx, 2) + Math.pow(ry + vy, 2)); 
double rotate = Math.toDegrees(Math.acos((Math.pow(mtov, 2) + Math.pow(rtov, 2) - Math.pow(mtor, 2))/(2*mtov*rtov)))); 

Однако, это создает некоторые странные результаты:

What

(сторона с белыми квадратами фронт. Для полного альбома перейти к http://imgur.com/a/4DwFg)

Вот некоторые консоли вывода:

Mouse X: 555.0 
Mouse Y: 439.0 
Reference X: 400.0 
Reference Y: 301.0 
Vertex X: 400.0 
Vertex Y: 300.0 
Rotation: 65.56236879269605 

Mouse X: 552.0 
Mouse Y: 440.0 
Reference X: 400.0 
Reference Y: 301.0 
Vertex X: 400.0 
Vertex Y: 300.0 
Rotation: 65.5244609346555 

Итак, что я делаю неправильно? (Дополнительный кредит: есть ли лучший способ сделать это в openGL?)

ответ

1

Это предполагает, что 0 градусов прямо вверх, против часовой стрелки положительно, что x увеличивается вправо и что y увеличивается вверх. (Я не знаю, верно ли это для LWJGL.) Я использую диапазон от -180 до 180, а не от 0 до 360, поскольку это кажется более естественным (например, если голова должна медленно вращаться)

double dx = (mx-vx); // change in x from head to mouse 
double dy = (my-vy); // change in y from head to mouse 
double dist = Math.sqrt(dx*dx + dy*dy); // distance, pythagorean theorem 
double degrees = Math.toDegrees((Math.acos(dy/dist)) * -Math.signum(dx)); 
     // dy/dist is the cosine 
     // the sign of dx determines positive (CCW) or negative (CW) angle 

Если вы беспокоитесь о производительности, вы можете избежать операции sqrt, используя atan, но вам нужно будет выполнить дополнительные тесты для определения квадранта и избежать деления на ноль. Скорее всего, волосы будут быстрее, но, возможно, это не стоит.

+0

Дайте мне знать, если у вас есть вопросы по поводу того, что я делаю. – maybeWeCouldStealAVan

+0

Это всегда возвращает значение -45 или 135. –

+0

Возможно, вы имели в виду: 'double dy = (my-vy);'? Он работает, если я это сделаю. Спасибо! –

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