2011-09-08 141 views
0

我在C++下面的方法:移植的C++代碼到Java

void sphereCollisionResponse(Sphere *a, Sphere *b) 
{ 
    Vector3 U1x,U1y,U2x,U2y,V1x,V1y,V2x,V2y; 


    float m1, m2, x1, x2; 
    Vector3 v1temp, v1, v2, v1x, v2x, v1y, v2y, x(a->pos - b->pos); 

    x.normalize(); 
    v1 = a->vel; 
    x1 = x.dot(v1); 
    v1x = x * x1; 
    v1y = v1 - v1x; 
    m1 = a->mass; 

    x = x*-1; 
    v2 = b->vel; 
    x2 = x.dot(v2); 
    v2x = x * x2; 
    v2y = v2 - v2x; 
    m2 = b->mass; 

    a->vel = Vector3(v1x*(m1-m2)/(m1+m2) + v2x*(2*m2)/(m1+m2) + v1y); 
} 

這是關於球形物體碰撞響應。 我想將它移植到Java,所以我用從這裏開始的Vector2D類:http://goo.gl/I4R4Y,並把這個代碼的Java:

private void sphereCollisionResponse(Sphere a, Sphere b) { 

     double m1, m2, x1, x2; 
     Vector2D v1, v2, v1x, v2x, v1y, v2y; 
     Vector2D x = new Vector2D(a.getPos().subtract(b.getPos())); 

     x.normalize(); 
     v1 = a.getVelocity(); 
     x1 = x.dot(v1); 
     v1x = x.multiply(x1); 
     v1y = v1.subtract(v1x); 
     m1 = a.getMass(); 

     x = x.multiply(-1); 
     v2 = b.getVelocity(); 
     x2 = x.dot(v2); 
     v2x = x.multiply(x2); 
     v2y = v2.subtract(v2x); 
     m2 = b.getMass(); 

     Vector2D av = ((v1x.multiply(m1-m2)).divide(m1+m2).add((v2x.multiply(2*m2)).divide(m1+m2))).add(v1y); 
     a.setVelocity(av); 
    } 

但事實證明,當球體碰撞,球體我改變速度,從屏幕上消失。所以我可能在移植代碼時遇到麻煩。任何一個更有經驗的人都可以檢查移植的代碼並告訴我是否有什麼問題?

感謝

+0

也許繪圖座標不一樣。在java中,我認爲(0,0)是左上角。 –

+1

你有沒有嘗試在調試器中通過它? – molbdnilo

+0

同意@molbdnilo:只需在調試器中執行這兩個操作,或打印出中間值即可。在某個時候,行爲必須分歧。 –

回答

0

我不是用java好,但你引用的代碼看起來不錯,但與我的Java基礎知識判斷。

問題可能在於最後一個任務:

Vector2D av = ((v1x.multiply(m1-m2)).divide(m1+m2).add((v2x.multiply(2*m2)).divide(m1+m2))).add(v1y); 

也許導致速度矢量,AV,太大了?這可以解釋爲什麼球體從屏幕上消失。你可以調試它,並檢查av的值,或打印它的地方?

+0

是的,它太大了..:/ x:-2283.873017402746,y:539.247 – Tzanter

+0

你確定這兩個物體的質量是有效的嗎?也許m1和m2關閉。 – EddieBytes

+0

是的,他們都是3.0(兩個領域)。 – Tzanter