首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Cesium.Ray和Cesium.Cartesian3创建Cesium.HeadingPitchRoll

从Cesium.Ray和Cesium.Cartesian3创建Cesium.HeadingPitchRoll
EN

Stack Overflow用户
提问于 2021-03-24 08:10:54
回答 1查看 539关注 0票数 2

是否可以从一个Cesium.Ray和一个Cesium.HeadingPitchRoll创建一个Cesium.HeadingPitchRoll

如果是这样的话,我们会怎么做呢?

编辑1:

代码语言:javascript
复制
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度那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-27 16:03:46

是的,这是可能的。这两种对象包含不同类型的信息,因此请注意,在转换过程中不要丢失数据。

  • 一个Ray有一个origin (笛卡尔位置)和一个direction,它只是一个单位向量,与一个完全的方向不一样。
  • HeadingPitchRoll是一个全方位的方向。航向和俯仰一起工作,以确定一个特定的“前进”方向,而滚动表示围绕该方向矢量的旋转。此滚轮旋转不影响方向,因此不会对光线产生影响。

下面是代码:

代码语言:javascript
复制
// 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度:

代码语言:javascript
复制
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所示)。

代码语言:javascript
复制
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}

编辑:这个问题被修改了一点。该射线的方向需要在地球中心的固定框架,而不是局部向上的框架,为预期的用途。

这里有一个更长的演示,展示了如何处理这个问题。你也可以在沙堡上做观看现场演示

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66777046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档