2013-07-09 59 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 

如果您擔心性能,可以使用atan避免sqrt操作,但是您需要執行額外的測試以確定象限並避免被零除。它可能會更快,但可能不值得。

+0

如果您對我在做什麼有任何疑問,請告訴我。 – maybeWeCouldStealAVan

+0

這總是會返回一個-45或135的值。 –

+0

您是不是指'double dy =(my-vy);'?如果我這樣做,它會起作用。謝謝! –