2013-05-27 69 views
0

我正在研究另一個3D遊戲引擎並且有以下問題。爲了提高性能,我想檢查兩個對象是靠近還是遠離對方。只有當它們彼此靠近時纔會發生碰撞檢測。如何顯示兩個對象是否在3D空間中移動

目前代碼使用兩個對象的位置來計算當前距離。然後移動有關速度矢量的兩個位置並計算預期距離。等等。

public class Model{ 

    public boolean isApproaching(Model model) { 
     float [] otherPosition = model.getPosition(); 
     float [] otherVelocity = model.getVelocity(); 
     double currentDistance = Math.pow(this.position[0] - otherPosition[0], 2) 
           + Math.pow(this.position[1] - otherPosition[1], 2) 
           + Math.pow(this.position[2] - otherPosition[2], 2); 
     double expectedDistance = Math.pow(this.position[0] + this.velocityVector[0]/1000 - otherPosition[0] - otherVelocity[0]/1000, 2) 
           + Math.pow(this.position[1] + this.velocityVector[1]/1000 - otherPosition[1] - otherVelocity[1]/1000, 2) 
           + Math.pow(this.position[2] + this.velocityVector[2]/1000 - otherPosition[2] - otherVelocity[2]/1000, 2); 
     if(currentDistance < expectedDistance) 
      return false; 
     return true; 
    } 

} 

正如您在圖片中看到的,它不適用於快速移動的物體。有沒有什麼好的方法可以表明兩點是否相互移動?

enter image description here

+1

我會嘗試使用他們的方向向量的叉積。要麼或解決他們的交點。 – Blender

回答

1

鑑於兩個直線軌跡,也就是當他們將最接近獨特的時間,這可能已經過去。如果它在過去,那麼它意味着物體彼此遠離,但如果它在將來意味着它們正在靠得更近。但即便如此,他們正在靠近在一起,我猜測知道多久你需要的信息,以便你可以安排什麼時候擔心它。這種方法應該適用於緩慢移動和快速移動的物體。

1

看起來您正在使用/1000與其他任何值相比較,因爲某些未說明的原因可能會否定以下內容。

通過更改此比例因子,您可以更快地檢測到物體。執行相同的isApproaching()計算,除了使用/(1000*N)而不是/1000。然後你會知道他們是否接近或不接近N倍。

+0

1000是一些隨機值,應該「減慢」兩個對象,以避免情況2.您的解決方案聽起來更好。謝謝。 –

+0

曾在空中交通管制部門工作過,提供了一些見解。你想提高性能,爲什麼不使用整數數學或者只使用'double'並避免'float'來加倍轉換時間? @Blender的跨產品理念也不錯。 – chux

相關問題