2016-10-28 11 views
0

我試圖使用argon.js轉換LLA座標到從預定義的參考幀的本地座標。向我推薦的方法(據我所知)要求我從一組lla's創建一個cesium實體,然後在使用其他lla's創建後續cesium實體時使用該ceisum實體作爲參考。Argon.js/A-框架:從getEntityPose()本地座標不相對於refereceFrame

我嘗試過使用兩種方法來做到這一點:第一種方法是在argon.js中創建參考銫實體,第二種方法是創建一個帶有geoseose的a-frame實體,然後從a-框架實體的組件列表。我使用argon.js進行所有後續轉換。

在兩種方法中,我有成功創建參考銫實體,並且它出現(我,至少)該轉換銫實體包括參考實體,因爲它們的參考幀。然而,被轉換實體的實體拋物線仍然是0,0,0。我的期望是參考實體是0,0,0,並且被轉換的實體將具有相對於該實體的局部座標(例如4,8,10) 。此外,在每種情況下,實體的poseStatus爲0,但argon.js文檔僅列出了KNOWN = 1,FOUND = 2和LOST = 4的可能性。

我已經在下面包含了我的代碼,檢查員的一些反饋。返回的對象非常大,所以我只包含我認爲相關的內容,但請告訴我是否還有其他屬性。還請注意,代碼包含上面列出的兩個選項,第二個選項已註釋掉。

對於一些歷史看:從檢查

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

Argon.js: Error: A frame state has not yet been received

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Hello world</title> 
    <script src="/socket.io/socket.io.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/geolocator/2.1.0/geolocator.js"></script> 
    <script src="arframe/main/resources/js/aframe.js"></script> 
    <script src="arframe/main/resources/js/argon.min.js"></script> 
    <script src="arframe/main/build.js"></script> 
    <script src="arframe/main/resources/js/CSS3DArgonRenderer.js"></script> 
    <script src="arframe/main/resources/js/CSS3DArgonHUD.js"></script> 
    <script src="arframe/main/resources/js/aframe-look-at-component.js"></script> 
    </head> 
    <body> 

<h1>Hello world</h1> 

<ar-scene> 
    <!--OPTION 2--> 
    <!-- <a-entity id='madRefFrame' referenceframe='lla: -84.31169 33.756128'></a-entity> --> 
</ar-scene> 

<script> 

    // OPTION 1 
    var app = Argon.init(); 

    // OPTION 2 
    //var scene = document.querySelector('ar-scene'); 
    //var app = scene.argonApp; 

    var Cesium = Argon.Cesium; 
    var Cartesian3 = Cesium.Cartesian3; 
    var ConstantPositionProperty = Cesium.ConstantPositionProperty; 
    var ReferenceFrame = Cesium.ReferenceFrame; 
    var ReferenceEntity = Cesium.ReferenceEntity; 

    app.context.setDefaultReferenceFrame(app.context.localOriginEastUpSouth); 

    app.updateEvent.addEventListener(function (frame) { 

    if (Argon.PoseStatus.KNOWN) { 

     // OPTION 1 
     var madRefData = { lla : { x : -84.31169, y : 33.756128, z : 299 }}; 
     var madRef = Cartesian3.fromDegrees(madRefData.lla.x, madRefData.lla.y, madRefData.lla.z); 
     var options = { position: new ConstantPositionProperty(madRef, ReferenceFrame.FIXED), 
         orientation: Cesium.Quaternion.IDENTITY 
        }; 
     var madRefEntity = new Cesium.Entity(options); 

     console.log('madRefEntity'); 
     console.log(madRefEntity); 

     var madRefEntityPose = app.context.getEntityPose(madRefEntity); 

     console.log('madRefEntityPose'); 
     console.log(madRefEntityPose); 

     // OPTION 2 
     // var madRefEL = document.querySelector('#madRefFrame'); 
     // var madRefFrame = madRefEL.components['referenceframe']; 
     // var madRefEntity = madRefFrame.cesiumEntity; 
     // 
     // console.log('madRefEntity'); 
     // console.log(madRefEntity); 
     // 
     // var madRefEntityPose = app.context.getEntityPose(madP1Entity); 
     // 
     // console.log('madRefEntityPose'); 
     // console.log(madRefEntityPose); 

     // USED IN OPTIONS 1 AND 2 
     var madP1Data = { lla : { x : -84.31169, y : 33.755602, z : 297 }}; 
     var madP1Ref = Cartesian3.fromDegrees(madP1Data.lla.x, madP1Data.lla.y, madP1Data.lla.z); 
     var options = { position: new ConstantPositionProperty(madP1Ref, madRefEntity), 
         orientation: Cesium.Quaternion.IDENTITY 
        }; 
     var madP1Entity = new Cesium.Entity(options); 

     console.log('madP1Entity'); 
     console.log(madP1Entity); 

     var madP1EntityPose = app.context.getEntityPose(madP1Entity); 

     console.log('madP1EntityPose'); 
     console.log(madP1EntityPose); 

    } else { 
     // if we don't know the user pose we can't do anything 
     console.log("we don't know."); 
     return; 
    }; 

    }); 

</script> 
</body> 
</html> 

反饋:

A-Frame Version: 0.3.2 
three Version: ^0.76.1 
WebVR Polyfill Version: 0.9.15 
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]} 
THREE.CSS3DArgonRenderer 76CSS3D 
THREE.CSS3DArgonHUD 76CSS3D 
THREE.WebGLRenderer 76 
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]} 
reference frame changed to FOUND 

madRefEntity 
Object { _availability: undefined, 
     _id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008", 
     // METHOD 2 
     // _id: "madRefFrame" 
     _parent: undefined, 
     _propertyNames: Array[19], 
     ... 
     _position:Object 
     _definitionChanged:Object 
     _referenceFrame:0 
     _value:Object 
      x:526169.6230387943 
      y:-5282445.040716821 
      z:3524154.8442182266 
      // METHOD 2 
      //x:526144.9834483624 
      //y:-5282197.673182507 
      //z:3523988.702129788 
     ... 
    } 

madRefEntityPose 
Object { position : { x: 0, y: 0, z: 0 }, 
     orientation: { w: 1, x: 0, y: 0, z: 0 }, 
     time: {dayNumber: 2457689, secondsOfDay : 81280.139927485}, 
     poseStatus: 0 } 

madRefP1Entity 
Object { _availability: undefined, 
     _id: "9ded96ab-961c-4ba3-b766-8c37e919877f", 
     ... 
     _parent: undefined, 
     _position: object 
     _referenceFrame: object 
     _id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008", 
     // METHOD 2 
     // _id: "madRefFrame" 
     _orientation: object 
      _value: Object 
      _w: 1, 
      _x: 0, 
      _y: 0 
      _z: 0 
     ... 
     _position: Object 
      _value:Object 
      x:526169.6230387943 
      y:-5282445.040716821 
      z:3524154.8442182266 
      // METHOD 2 
      //x:526144.9834483624 
      //y:-5282197.673182507 
      //z:3523988.702129788 
      ... 
     ... 
     ... 
     _value:Object 
     x:526172.6715934229 
     y:-5282475.646478866 
     z:3524105.2236363157 
     ... 
    } 

madRefEntityPose 
madRefEntityPose = { position : { x: 0, y: 0, z: 0 }, 
        orientation: { w: 1, x: 0, y: 0, z: 0 }, 
        time: {dayNumber: 2457689, secondsOfDay : 81281.12722016001}, 
        poseStatus: 0 } 

回答

1

據我所知,問題是,雖然桌面瀏覽器將提供一個位置,因爲它不會提供方向,所以無法獲得完整的3D姿勢。因此,用戶實體是針對任意參考幀定義的。未來的版本將假定一個方向不可用時。

編輯:問題的性質的錯誤。

+1

我不確定我會將它稱爲「錯誤」,而是按照設計工作:沒有方向和位置,您沒有完整的相機姿勢。但是,由於大多數桌面瀏覽器都沒有世界取向,我們正在改變事物以默認使用標識方向。我們也改變了桌面上的現實,以支持點擊拖動旋轉(如許多桌面3D應用程序),以便您可以使用鼠標環視四周。 –

+0

我真誠的道歉!回覆編輯。 – crld

1

一些簡單的事情,首先。要回答關於Argon.PoseStatus的問題,它是一個位掩碼,所以0隱含地是「以上都不是」(所以不知道,不只是被發現或丟失)。 KNOWN在知道姿勢時設置,當狀態剛好在已知和未知之間改變時設置LOST或FOUND。

因此,你行

if (Argon.PoseStatus.KNOWN) { 

需要改變到

if (userPose.poseStatus & Argon.PoseStatus.KNOWN) { 

如果你想確保我們知道用戶的位置,如果你想要做的事情,你需要本地座標。

也就是說,madRefEntityPose很可能沒有被計算(它的poseStatus爲0),因爲用戶的位置尚未確定。對於這兩個選項。現在

,有關代碼。選項1爲您提供FIXED座標中的實體(這些大數可能是正確的,它們是地球表面上那個點的位置的數值,使用地球的標準橢圓近似作爲高程0)。如果用戶的姿勢是衆所周知的,我期望poseStatusKNOWN,以及positionorientation值要的東西不爲零。

選項2有點奇怪。您將大數字視爲實體的位置,但後來表示它們正在前一個實體的座標中表示。這意味着你可能會告訴它將第二個實體放在外太空中,距離等於距離地球中心的距離......

我記得你的目標是獲得第二個姿勢點相對於第一個。要做到這一點,你需要

  • 等到用戶的姿勢被稱爲
  • 獲得本地座標兩個點的姿勢(如你正在做的選項1)
  • 減去第一(或取一個你希望作爲你的「本地原點」)從第二個(和從後面的那個)給你小的基於第一個點的後續點的偏移量(將其分配給madP1Ref)。
  • 使用這些小型儀表(現在在madP1Ref)創建一個實體(如選項2),就像您在那裏做的一樣。
相關問題