我使用Cesium的gltf分支,我想显示3d模型的平面。为此,我创建了我加载并添加到dataSources的czmlDataSource。
问题在于我无法弄清楚如何计算方向四元数以使平面与地面平行,在给定纬度,lon,alt默认为北方向(然后影响它们的航向,最终俯仰和滚动)。
这是我计算实际四元数的方法,但是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]
}
}];
答案 0 :(得分:6)
与Cesium的惯例相比,CZML目前具有“向后”的方向。因此,如果您正在使用CZML,您实际上需要方向的共轭。我们计划在几个月内在一个主要的CZML更新中修复此问题,但不希望用当前格式打破所有现有文档。当我们进行更新时,计划是尝试以向后兼容的方式执行,因此现有的CZML仍然有效。
答案 1 :(得分: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' }
}])
这里有很多计算方法。不知道是否以及如何优化这一点。