0

我正在尝试使用 argon.js 将 lla 坐标从预定义的参考系转换为本地坐标。向我推荐的方法(据我所知)要求我从一组 lla 中创建一个 cesium 实体,然后在使用其他 lla 创建后续 cesium 实体时使用该 ceisum 实体作为参考。

我尝试使用两种方法来做到这一点:第一种方法是在 argon.js 中创建参考 cesium 实体,第二种方法是创建一个带有 geopose 的 a-frame 实体,然后从 a-frame 实体的列表中获取 cesium 实体成分。我使用 argon.js 进行所有后续转换。

在这两种方法中,我都成功地创建了参考铯实体,并且(至少在我看来)转换后的铯实体包括参考实体作为它们的参考框架。但是,转换后的实体的 entityPose 仍然是 0,0,0。我的期望是参考实体将是 0,0,0,并且转换后的实体将具有相对于它的局部坐标(例如 4,8,10) . 此外,在每种情况下,实体的poseStatus 为0,但argon.js 文档仅列出了KNOWN = 1、FOUND = 2 和LOST = 4 的可能性。

我在下面包含了我的代码,以及检查员的一些反馈。返回的对象非常大,所以我只包含了我认为相关的内容,但如果我应该包含其他属性,请告诉我。另请注意,代码包含我上面列出的两个选项,第二个选项被注释掉了。

有关一些历史,请参见:

使用地理坐标而不是笛卡尔在 Argon 和 A-Frame 中绘制

Argon.js:错误:尚未收到帧状态

<!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 }
4

2 回答 2

1

据我了解,问题在于,虽然桌面浏览器会给出位置,但由于它不会提供方向,因此无法获得完整的 3D 姿势。因此,用户实体是针对任意参考框架定义的。当一个版本不可用时,未来的版本将采用一个方向。

编辑:错误描述问题的性质。

于 2016-11-07T11:27:52.813 回答
1

一些简单的事情,首先。要回答您关于 的问题Argon.PoseStatus,它是一个位掩码,因此 0 隐含“以上都不是”(因此,不知道,不只是被发现或丢失)。当姿势已知时设置 KNOWN,当状态刚刚在 KNOWN 和 not KNOWN 之间改变时设置 LOST 或 FOUND。

因此,你的线

if (Argon.PoseStatus.KNOWN) {

需要更改为

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

如果你想确保我们知道用户所在的位置,如果你想在本地坐标中做事,你需要这个。

也就是说,madRefEntityPose可能没有被计算(它poseStatus是 0),因为尚未确定用户的位置。对于这两种选择。

现在,关于代码。选项 1 为您提供 FIXED 坐标中的实体(这些大数字可能是正确的,它们是以米为单位的该点在地球表面上的位置值,使用地球的标准椭圆近似作为高程 0)。如果用户的姿势是已知的,我希望poseStatus是,并且和KNOWN的值是非零值。positionorientation

选项2有点奇怪。您将大数字作为实体的位置,然后说它们以前一个实体的坐标表示。这意味着您可能会告诉它将第二个实体定位在外层空间中,其距离等于距地球中心的距离...

我记得你的目标是获得第二点相对于第一点的姿势。为此,您需要

  • 等到知道用户的姿势
  • 获取本地坐标中两个点的姿势(就像您对选项 1 所做的那样)
  • 从第二个(以及后续点)中减去第一个(或您想要作为“本地原点”的任何一个),从而为您提供后续点与第一个点的基于米的小偏移(将其分配给madP1Ref)。
  • madP1Ref就像你在那里做的那样,使用那些小仪表(现在在 中)创建一个实体(如选项 2 中) 。
于 2016-10-30T16:44:21.727 回答