是否可以从一个Cesium.Ray和一个Cesium.HeadingPitchRoll创建一个Cesium.HeadingPitchRoll
如果是这样的话,我们会怎么做呢?
编辑1:
const hpr = Cesium.HeadingPitchRoll.fromDegrees(0, 0, 0)
const matrix3 = Cesium.Matrix3.fromHeadingPitchRoll(hpr)
// The UNIT_X vector is "forward" in Cesium. We'll multiply the rotation
// matrix by that unit vector, to get our direction vector.
const direction = Cesium.Matrix3.multiplyByVector(
matrix3,
Cesium.Cartesian3.UNIT_X,
new Cesium.Cartesian3()
)
const origin = Cesium.Cartesian3.fromDegrees(i.longitude, i.latitude, i.altitude)
// Now we can construct the Ray.
const ray = new Cesium.Ray(origin, direction)
const finalPoint = Cesium.Ray.getPoint(ray, i.altitude)
const e = map.viewer.entities.add({
name: i.id,
polyline: {
positions: [origin, finalPoint],
width: 4,
arcType: Cesium.ArcType.NONE,
material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.RED),
},
})当HPR设置为(0,0,0)时,结果是:

当音高为0时,我会期望光线与地平线平行,而不是像+45度那样。
发布于 2021-03-27 16:03:46
是的,这是可能的。这两种对象包含不同类型的信息,因此请注意,在转换过程中不要丢失数据。
Ray有一个origin (笛卡尔位置)和一个direction,它只是一个单位向量,与一个完全的方向不一样。HeadingPitchRoll是一个全方位的方向。航向和俯仰一起工作,以确定一个特定的“前进”方向,而滚动表示围绕该方向矢量的旋转。此滚轮旋转不影响方向,因此不会对光线产生影响。下面是代码:
// A Cesium Ray consists of an "origin" and a "direction".
// The origin is just a Cartesian3 from anywhere.
var origin = new Cesium.Cartesian3(1.0, 2.0, 3.0);
// For this question, "direction" comes from a HeadingPitchRoll.
// Let's establish an HPR here.
var heading = Cesium.Math.toRadians(0); // YOUR VALUE HERE
var pitch = Cesium.Math.toRadians(0); // YOUR VALUE HERE
var roll = Cesium.Math.toRadians(0); // This one does nothing.
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
// Next we need a direction vector from the HPR. We'll use
// a rotation matrix (3x3) to do the conversion.
var matrix3 = Cesium.Matrix3.fromHeadingPitchRoll(hpr);
// The UNIT_X vector is "forward" in Cesium. We'll multiply the rotation
// matrix by that unit vector, to get our direction vector.
var direction = Cesium.Matrix3.multiplyByVector(matrix3, Cesium.Cartesian3.UNIT_X,
new Cesium.Cartesian3());
// Now we can construct the Ray.
var ray = new Cesium.Ray(origin, direction);
console.log('Ray: ' + JSON.stringify(ray));如果您在这里显示的默认零标题/螺距下运行此操作,您将再次获得单元X向量:
雷:{“原点”:{“x”:1,"y":2,"z":3},“方向”:{“x”:1,"y":0,“z”:0}
但如果你把音高设为45度:
var heading = Cesium.Math.toRadians(0);
var pitch = Cesium.Math.toRadians(45);你会看到X方向朝+Z方向倾斜。
射线:{“原点”:{“x”:1,"y":2,"z":3},“方向”:{“x”:0.7071067811865476,"y":0,“z”:0.7071067811865475}
正航向将X矢量旋转到-Y (顺时针方向,如上面+Z所示)。
var heading = Cesium.Math.toRadians(45);
var pitch = Cesium.Math.toRadians(0);射线:{“原点”:{“x”:1,"y":2,"z":3},“方向”:{“x”:0.7071067811865476,"y":-0.7071067811865475,“z”:0}
编辑:这个问题被修改了一点。该射线的方向需要在地球中心的固定框架,而不是局部向上的框架,为预期的用途。
这里有一个更长的演示,展示了如何处理这个问题。你也可以在沙堡上做观看现场演示。
var viewer = new Cesium.Viewer("cesiumContainer");
const i = {
id: 'test',
longitude: -79,
latitude: 40,
altitude: 500
};
// Create the origin and hpr.
const origin = Cesium.Cartesian3.fromDegrees(i.longitude, i.latitude, i.altitude)
let hpr = Cesium.HeadingPitchRoll.fromDegrees(0, 0, 0)
// Cesium uses East-North-Up axes, where East is zero. If you want North == Zero,
// you must subtract 90 degrees' worth of radians (pi/2).
hpr.heading -= Cesium.Math.PI_OVER_TWO
// We'll get the orientation, which is a quaternion. This is specific to the
// location on the planet. Also it comes in handy later for the 3D model vis.
const orientation = Cesium.Transforms.headingPitchRollQuaternion(origin, hpr);
// Get a Matrix3 version of that Quaternion.
const matrix3 = Cesium.Matrix3.fromQuaternion(orientation);
// The UNIT_X vector is "forward" in Cesium. We'll multiply the rotation
// matrix by that unit vector, to get our direction vector.
const direction = Cesium.Matrix3.multiplyByVector(
matrix3,
Cesium.Cartesian3.UNIT_X,
new Cesium.Cartesian3()
)
// Now we can construct the Ray.
const ray = new Cesium.Ray(origin, direction)
const finalPoint = Cesium.Ray.getPoint(ray, i.altitude)
const e = viewer.entities.add({
name: i.id,
polyline: {
positions: [origin, finalPoint],
width: 4,
arcType: Cesium.ArcType.NONE,
material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.RED),
},
})
// Optionally, show an aircraft model with this HPR.
const m = viewer.entities.add({
position: origin,
orientation: orientation,
model: {
uri: "../SampleData/models/CesiumAir/Cesium_Air.glb",
minimumPixelSize: 64,
}
})
viewer.zoomTo(e)https://stackoverflow.com/questions/66777046
复制相似问题