簡體   English   中英

使用地理坐標代替笛卡爾坐標在 Argon 和 A-Frame 中繪制

[英]Using Geo-coordintes Instead of Cartesian to Draw in Argon and A-Frame

我想在 Argon 和 A-Frame 中創建一個GPS 繪圖程序,它根據人們的動作繪制線條。

例如,可以使用使用笛卡爾點的網格線組件在 A-Frame 中繪制線條:

<a-entity meshline="lineWidth: 20; path: -2 -1 0, 0 -2 0</a-entity>

如果我要使用 GPS 設備執行此操作,我會獲取 GPS 坐標並將它們直接映射到諸如谷歌地圖之類的東西。 Argon 是否有任何類似的功能,以便我可以直接使用 GPS 坐標作為路徑,如下所示:

<a-entity meshline="lineWidth: 20; path: 37.32299 -122.04185 0, 37.32298 -122.03224</a-entity>

由於可以為參考系指定 LLA 點,我想一種方法是將中心 LLA 點設想為“0, 0, 0”,然后使用函數將 LLA 域映射到笛卡爾范圍。

但是,最好直接使用地理坐標。 這在氬氣中可能嗎?

要了解答案,您首先需要了解 Argon 使用的各種參考系。

首先,Argon 利用 cesiumjs.org 的地理空間數學庫和實體,因此 Argon 中的所有“位置”都必須以地理空間表示或與地理空間實體相關。 它們植根於地球的中心,在 Cesium 稱為FIXED坐標中,但也稱為 ECEF 或 ECF 坐標。 在該系統中,坐標以米為單位,上/下穿過兩極,東/西穿過子午線(我相信)。 地球表面上的任何一點都用相當大的數字表示。

這個坐標系很好,因為我們可以使用它精確地表示地球上或附近的任何東西。 Cesium 還支持INERTIAL坐標,用於表示近地軌道物體,並且可以在兩個坐標系之間進行轉換。

但是,由於以下幾個原因,在進行 AR 時很不方便:

  1. 用於表示觀察者位置和附近物體位置的數字非常大,即使它們非常接近,這也會導致數學准確性問題,尤其是在 3D 圖形系統中。

  2. 當我們想到我們周圍的世界時,我們“想到”的坐標將地面“平坦”和“向上”指向……嗯,向上。 因此,在 3D 圖形中,另一個對象上方的對象通常具有相同的 X 和 Z 值,但具有更大的 Y。 在 ECEF 坐標中,所有數字都會發生變化,因為我們認為“向上”實際上是從地球中心到我們的向量,並且只有在我們位於北方(或南方,取決於您的 + /-) 極點。 您可能想要使用的大多數 3D 圖形庫(例如,物理庫)假設一個世界,其中地面是一個平面(通常是 XZ 平面)並且 Y 向上(一些航空和其他工程應用程序使用 Z 作為向上)並以 XY 作為地面,但問題是相同的)。

Argon 與許多地理空間 AR 系統一樣,通過創建供圖形和應用程序使用的局部坐標系來處理此問題。 為此,實際上有三種選擇:

  1. 選擇一些任意(但固定)的本地地方作為原點。 某些專為在一個地方工作而構建的系統對此進行了硬編碼。 其他人讓應用程序設置它。 我們不這樣做是因為它會鼓勵應用程序走簡單的道路並且只在一個地方工作(我們過去已經看到過這種情況)。

  2. 將本地位置設置為相機。 這具有數學最“准確”的優點,因為所有點都是相對於相機表示的。 但是,這會導致兩個問題。 首先,在 AR 應用程序中,相機往往會持續移動(即使只是由於傳感器噪聲)。 其次,許多庫(同樣,如物理庫)假設系統的起源是穩定的並且在地球上,相機/用戶在其中移動。 這些問題是可以解決的,但對於應用程序開發人員來說處理起來很乏味。

  3. 將本地坐標的原點設置為用戶附近的任意位置,如果用戶遠離它,則自動居中。 這樣做的好處是程序不必做太多處理,而且它與 3D 圖形庫很好地融合在一起。 缺點是局部坐標是任意的,並且每次運行程序時都可能不同。 但是,應用程序開發人員可能需要注意原點何時重新居中。

Argon 使用 open 3。當應用程序啟動時,我們在用戶位置創建一個新的局部坐標系,在與地球相切的平面上。 如果用戶遠離該位置,我們會更新原點並向應用程序發出事件(目前,如果您距離原點 5 公里,我們會重新定位)。 在許多簡單的應用程序中,只有少數幀或參考以地理空間坐標表示(其余的應用程序數據表示相對於已知地理空間位置),從地理空間到本地的轉換可以在每一幀中完成,允許應用程序開發人員忽略重入問題。 程序員可以自由地使用 ENU(東-北-上)或 EUS(東-南)作為他們的坐標系; 我們傾向於使用 EUS,因為它類似於大多數 3D 圖形系統使用的(Y 向上,Z 指向南,X 指向東)。

我們選擇這種方法的原因之一是我們過去發現,如果我們有可預測的本地坐標,應用程序開發人員會使用這些坐標存儲數據,即使這不是一個好主意(您的數據現在綁定到一些相對隨意的特定於應用程序的坐標系,現在只能在該位置工作)。

所以,現在回答你的問題。 您的問題是您想在 AFrame 中使用地理空間(銫的坐標,氬使用的坐標)坐標。 簡短的回答是您不能直接使用它們,因為 AFrame 是假設本地 3D 圖形坐標系構建的。 argon-aframe 包通過允許您指定將 a-entity 定位在 argon/cesium 地理空間位置的referenceframe幀組件,將 aframe 綁定到 argon,並為您處理所有內部轉換。

我編寫代碼時的假設是,作者將使用本地 3D 圖形坐標創建他們的內容,並將這些大塊圖形附加到位於世界中的具有referenceframe框架的實體。

為了讓 AFrame 中的各個坐標對應於地理空間位置,您需要自己管理它,可能通過創建一個組件來為您完成,或者(如果數據在開始時已知)通過預先轉換它。

這就是我要做的。

假設您有一個地理空間坐標列表(表示為 LLA),我會將每個坐標轉換為本地坐標(首先將 LLA 轉換為 Cesium 的 FIXED ECEF 坐標並創建一個 Cesium 實體,然后調用 Argon 的context.getEntityPose() on該實體(將返回它的本地坐標)。我會在集合中選擇一個地理空間位置(也許是第一個?),然后從每個位置減去它的本地坐標,以便它們都以相對於該的本地坐標表示已知的地理空間位置。

然后,我將創建一個附加到該唯一地理空間實體的參考框架的 AFrame 實體,並使用相對於它表示的本地坐標在其中創建您的圖形內容。 例如,假設地理空間位置是LongLat = "-84.398881 33.778463"並且您將這些點(本地坐標,相對於LongLat )存儲在userPath ,您可以執行以下操作:

<ar-scene>
  <ar-geopose id="GT" lla=" -84.398881 33.778463" userotation="false"> 
    <a-entity meshline="lineWidth: 20; path: userPath; color: #E20049"></a-entity>
 </ar-geopose>    
</ar-scene>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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