【问题标题】:How to correctly use unitQuaternion czml property in Cesium如何在 Cesium 中正确使用 unitQuaternion czml 属性
【发布时间】:2014-01-24 17:25:28
【问题描述】:

我使用 Cesium 的 gltf 分支,我想显示飞机的 3d 模型。为此,我创建了加载并添加到数据源的 czmlDataSource。

问题是我不知道如何计算方向四元数以使平面在给定的纬度、经度、纬度处与地面平行,默认情况下朝北(然后影响它们的航向,最终影响俯仰和滚动)。

这是我计算实际四元数的方法,但 3d 模型的方向不正确(而且我不知道如何更改航向、俯仰、滚动):

    var geoPosition = new Cesium.Cartographic(Cesium.Math.toRadians(inputPosition.lon), Cesium.Math.toRadians(inputPosition.lat), inputPosition.alt);
    var cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(geoPosition);

    var euler = [cartesianPosition.x, cartesianPosition.y, cartesianPosition.z];
    var qx = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_X, euler[0]);
    var qy = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Y, euler[1]);
    var qz = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z, euler[2]);
    var qt = Cesium.Quaternion.multiply(qz, qy);
    var q = Cesium.Quaternion.multiply(qt, qx);
    Cesium.Quaternion.normalize(q, q);

var czmlSrc = [{
       "orientation": {
            "epoch": "2012-08-04T16:00:00Z",
            "interpolationAlgorithm": "LINEAR",
            "interpolationDegree": 1,
            "unitQuaternion": [0, q.x,q.y,q.z,q.w,
                            3600, q.x,q.y,q.z,q.w]
        }
   }];

【问题讨论】:

    标签: cesium czml


    【解决方案1】:

    与 Cesium 的约定相比,CZML 目前具有“向后”的方向。因此,如果您使用 CZML,您实际上需要方向的共轭。我们计划在几个月内在 CZML 的主要更新中修复此问题,但不希望使用当前格式破坏所有现有文档。当我们进行更新时,计划是尝试以向后兼容的方式进行,因此现有的 CZML 仍然可以工作。

    【讨论】:

      【解决方案2】:
      var C3 = Cesium.Cartesian3
      var Q  = Cesium.Quaternion
      // radians everywhere
      var q  =      Q.fromAxisAngle(C3.UNIT_X, -o.pitch              ) // or maybe roll first?
      Q.multiply(q, Q.fromAxisAngle(C3.UNIT_Y, -o.roll               ), q)
      Q.multiply(q, Q.fromAxisAngle(C3.UNIT_Z,  o.heading - Math.PI/2), q)
      Q.multiply(q, Q.fromAxisAngle(C3.UNIT_Y,  o.lat     - Math.PI/2), q)
      Q.multiply(q, Q.fromAxisAngle(C3.UNIT_Z, -o.lon                ), q)
      Q.conjugate(q, q)
      
      czml.process([{
          position   : { cartographicRadians: [o.lon, o.lat, 0] }
        , orientation: { unitQuaternion: [q.x, q.y, q.z, q.w] }
        , model      : { gltf: model.key + '.gltf' }
      }])
      

      这里有很多计算。不知道是否可以优化以及如何优化。

      【讨论】:

        猜你喜欢
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多