[英]Java how to calculate the angle between an entity's current direction and it's target destination
我正在開發一個Java程序,該程序將通過網絡傳輸實體狀態PDU,以用於網絡仿真。 我正在使用open-DIS庫來幫助完成此任務。
當前,當我運行程序時,我有多個實體在一個模擬上運行,並希望通過讓第二個模擬接收第一個模擬發送的PDU並在另一個模擬中顯示它們,來表示它們的信息。以圖形方式包含。
就目前情況而言,我可以在第二個模擬中看到第一個模擬中的所有實體,但是當前,當第一個模擬中的任何實體移動時,盡管我看到這些相同的實體都朝着它們應在在第二次模擬中,它們保持與原來相同的方向……即,它們沒有轉向面對當前移動的方向。
我知道open-DIS庫有一個'Orientation'類,它帶有setPhi
, setPsi
和setTheta
方法,這是我需要設置它們應該面對的方向/角度的方法,但是我不確定如何我要算出哪些值可以提供這些方法...是否有可用的庫提供獲取這些值的數學方法,或者這是我必須自己編寫的東西嗎?
編輯
我嘗試EntitStateFormatter.java
添加到我的EntitStateFormatter.java
類中(這是創建要發送到第二次模擬的PDU的類,已經從第一次模擬中獲得了PDU中的數據):
orientation.setPhi((float) (entity.getLocation().getAzimuth()));
orientation.setPsi((float) (entity.getLocation().getElevation()));
orientation.setTheta((float) (entity.getLocation().getTilt()));
'orientation'是一個'Orientation'變量( edu.nps.moves.dis.Orientation
),我通過以下代碼創建了該變量:
Orientation orientation = new Orientation();
“實體”是一個“實體”變量(實體是我程序中的另一個類),我已使用以下行將其作為方法的參數傳遞:
public static EntityStatePdu createPdu(Entity entity){...
但是由於某種原因,盡管在運行程序時,雖然我可以看到在第二個模擬中顯示的第一個模擬中創建的實體,但在地形中移動時(如在第一個模擬中的命令),但是在第二個中,它們不會轉而面對其移動的方向,而只是沿該方向移動(例如,車輛向側面移動等)。
運行程序時,我打開了一個控制台窗口,該窗口不時顯示一些調試信息,並拋出一條消息:
內部錯誤:java.lang.ArrayIndexOutOfBoundsException:154
我不知道為什么會這樣-特別是因為我在EntityStateFormatter.java類中實際上沒有任何數組...
有人有想法么? 提前致謝!
phi / psi / theta是歐拉角。 現在,您應該能夠在PDU的方向部分中為每個實體設置2或3個角度(取決於是否需要滾動),然后在接收端使用關聯的吸氣劑,而無需考慮自己的角度與DIS的角度是否正確(這僅在第三方仿真組件使用PDU時才重要,但首先應進行內部數據交換)。 例如(偽代碼),
// sender:
pdu.orientation.setPhi(entity.heading)
pdu.orientation.setPsi(entity.pitch)
pdu.orientation.setTheta(entity.roll)
// receiver:
entity.heading = pdu.orientation.getPhi()
entity.pitch = pdu.orientation.getPsi()
entity.roll = pdu.orientation.getTheta()
一旦證明上述方法可行,就可以弄清楚如何將角度轉換為phi,psi和theta。 查看Wikipedia上的Euler Angles頁面,其中包含許多轉換公式,您所需要確定的只是要為實體使用哪個討論的定向系統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.