簡體   English   中英

Java如何計算實體當前方向與其目標位置之間的夾角

[英]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'類,它帶有setPhisetPsisetTheta方法,這是我需要設置它們應該面對的方向/角度的方法,但是我不確定如何我要算出哪些值可以提供這些方法...是否有可用的庫提供獲取這些值的數學方法,或者這是我必須自己編寫的東西嗎?

編輯

我嘗試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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM