Cesium模型漫游过程中姿态动态调整

这篇具有很好参考价值的文章主要介绍了Cesium模型漫游过程中姿态动态调整。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、功能设计

模型漫游过程中姿态动态调整有两种情况:

1)速度沿默认方向-运动过程中的姿态动态调节

2)沿速度矢量方向-运动过程中姿态的动态调节

二、对数据和服务的要求

gltf数据

三、接口设计

通过修改AnimationTool上的modelHeading,modelPitch,modelRoll来进行姿态动态调节


//新建一个AnimationTool对象
var animation = new Cesium.AnimationTool(viewer, {               
//修改模型的方位角
modelHeading = 20;
//修改模型的俯仰角
modelPitch=10;
//修改模型的倾斜角
modelRoll=10;
},
3.1.速度沿默认方向-运动过程中的姿态动态调节
cesium漫游,Cesium,WebGIS,GIS,javascript,前端,html,矩阵,线性代数,Powered by 金山文档
3.2.沿速度矢量方向-运动过程中姿态的动态调节
cesium漫游,Cesium,WebGIS,GIS,javascript,前端,html,矩阵,线性代数,Powered by 金山文档

四、算法逻辑设计

在兼容设置 模型是否朝速度矢量方向(文档跳转)的基础上,提供在沿默认方向和沿速度矢量方向两种运动模式下的模型姿态动态调整。

两种模式的实现均是外部传入模型的heading,pitch,roll参数,内部通过访问器获取,通过一系列计算得到确切的方向值,赋值给当前模型的orientation 属性 ,实现模型朝向的动态修改

4.1.速度沿默认方向-运动过程中的姿态动态调节

1.基于当前模型的位置和外部提供的模型heading,pitch,roll参数,计算hpr最终得到朝向参数;


//模型默认状态下,计算其朝向四元数
function getDefaultQuaternion(position, rotateX, rotateY, rotateZ) {
    //三个角转弧度
    let heading = CMath.toRadians(rotateZ);
    let pitch = CMath.toRadians(rotateY);
    let roll = CMath.toRadians(rotateX);
    //通过方位角,俯仰角和倾斜角得到hpr参数
    let hpr = new HeadingPitchRoll(heading, pitch, roll);
    //基于模型当前位置和hpr得到朝向
    let orientation = Transforms.headingPitchRollQuaternion(position, hpr);
    return orientation;
}

2.获取当前模型的位置


//获得当前时间模型所在的位置
var curPosition = Property.getValueOrUndefined(this._animationModel.position, this._viewer.clock.currentTime, curPosition);

3.得到朝向并赋给当前模型使生效


 this._animationModel.orientation = getDefaultQuaternion(curPosition, this._modelRoll, this._modelPitch, this._modelHeading);
4.2.沿速度矢量方向-运动过程中姿态的动态调节

根据模型的速度信息、位置信息,建立模型本体坐标系,进而获取站心坐标系到模型坐标系的旋转矩阵,根据这个旋转矩阵获取欧拉角,最后再用模型的当前位置和欧拉角获得朝向四元数。

1.计算站心坐标系到模型坐标系的旋转矩阵


//速度归一化
let normal = Cartesian3.normalize(Velocity, new Cartesian3());
//计算模型坐标系的旋转矩阵
let satRotationMatrix = Transforms.rotationMatrixFromPositionVelocity(position, normal, Ellipsoid.WGS84);
//模型坐标系到地面坐标系旋转平移矩阵
let m = Matrix4.fromRotationTranslation(satRotationMatrix, position);
//站心坐标系到地固坐标系的旋转平移矩阵
let m1 = Transforms.eastNorthUpToFixedFrame(position, Ellipsoid.WGS84, new Matrix4());
//站心坐标系到模型坐标系的旋转平移矩阵
let m3 = Matrix4.multiply(Matrix4.inverse(m1, new Matrix4()), m, new Matrix4());

2.计算模型姿态旋转矩阵


rotateX = rotateX || 0;
rotateY = rotateY || 0;
rotateZ = rotateZ || 0;
let heading = rotateZ,
    pitch = rotateY,
    roll = rotateX;
let postureHpr = new HeadingPitchRoll(CMath.toRadians(heading), CMath.toRadians(pitch), CMath.toRadians(roll));
let postureMatrix = Matrix3.fromHeadingPitchRoll(postureHpr);

3.得到最终的旋转矩阵来计算朝向


//3.最终的旋转矩阵
let mat3 = Matrix4.getMatrix3(m3, new Matrix3());
let finalMatrix = Matrix3.multiply(mat3, postureMatrix, new Matrix3());
let quaternion1 = Quaternion.fromRotationMatrix(finalMatrix);
let hpr = HeadingPitchRoll.fromQuaternion(quaternion1);
let q2 = Transforms.headingPitchRollQuaternion(position, hpr);
return q2;

4.获取当前模型的位置


//获得当前时间模型所在的位置
var curPosition = Property.getValueOrUndefined(this._animationModel.position, this._viewer.clock.currentTime, curPosition);
5.获取速度向量
/获得当前时刻的速度向量
this._animationModel.velocityVector = new VelocityVectorProperty(this._animationModel.position, true);
var curVelocityVector = this._animationModel.velocityVector.getValue(this._viewer.clock.currentTime, new Cartesian3());
4.赋值给当前模型使生效
this._animationModel.orientation = getVelocityQuaternion(curPosition, curVelocityVector, this._modelRoll, this._modelPitch, this._modelHeading);

知识补充:

地固坐标系:也叫地心地固直角坐标系。其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿过赤道和90度经度。

cesium漫游,Cesium,WebGIS,GIS,javascript,前端,html,矩阵,线性代数,Powered by 金山文档

站心坐标系站心坐标系以用户所在位置P为坐标原点。

坐标系定义为: X轴:指向东边 Y轴:指向北边 Z轴:指向天顶,飞行器的偏航、俯仰、滚转即是以站心直角坐标系为参考

模型坐标系:模型坐标系以物体的中心为坐标原点,物体旋转、平移等操作都是围绕局部坐标系进行的。这时当物体模型进行旋转、平移等操作时,局部坐标系也执行相应的旋转、平移等操作。局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置至始至终是不变的,假想出这个坐标系的目的主要是为了正向理解对三维场景中物体执行的平移和旋转操作。使用局部坐标系理解模型变换时,所有的变换操作直接作用与局部坐标系,由于局部坐标系与物体的相对位置不变,因此对局部坐标系进行平移、旋转和缩放时,物体在场景中位置和形状也会发生相应的变化。

欧拉角:用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。

在这里,坐标系可以是世界坐标系,也可以是物体坐标系,旋转顺序也是任意的,可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种。

所以说欧拉角多种多样。欧拉角可分为两种情况:

1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

五、遗留问题

六、参考链接

【1】【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向

【2】Cesium设置模型朝向速度矢量方向文章来源地址https://www.toymoban.com/news/detail-635450.html

到了这里,关于Cesium模型漫游过程中姿态动态调整的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium示例程序学习和讲解(4)-调整3DTiles模型高度

    本节主要讲解的内容? 在三维场景中如何加载3dtiles模型,如何调整模型在场景中的高度 涉及的主要接口有? Cesium3DTileset、HeadingPitchRange、Cartographic、Matrix4 介绍下HeadingPitchRange接口接相关参数介绍? 当使用Cesium框架进行三维场景渲染时,常常需要在场景中创建相机视图。而

    2024年02月10日
    浏览(30)
  • Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转

    某个项目需求,在操作直升机模型的时候,希望直升机机翼和尾翼旋转起来。 机翼旋转比较容易,找到组件名称,按照之前的 《Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作》设置即可实现。 但是在设置尾翼的时候,出现问题,这里记录一下问题以及解决方法。 本

    2024年02月15日
    浏览(49)
  • cesium绘制路线,实现三维漫游

    1.鼠标点击添加点和线 2.右键结束绘制时,计算折线中心点和绘制方向;折线中心点可以替换为模型中心点,这样就会看着这个点飞行;计算方向主要是判断绘制的顺序是顺时针绘制的还是逆时针绘制的 3.点击飞行 pitch默认为-5 setExtentTime: 在viewer的clock中设置时间间隔,flytime默认为

    2024年02月05日
    浏览(25)
  • CesiumJS使用详细,在vue中使用Cesium.js(WebGIS中的Cesium地图可视化应用)

    简述:Cesium是一种基于WebGL开源的虚拟地球技术,可以用于构建高性能、跨平台的三维地球应用程序,它支持多种数据格式和地图服务,可以实现地球表面的高精度渲染、地形分析、数据可视化等功能。Cesium还提供了丰富的API和插件,方便开发者进行二次开发和定制化,且可

    2024年02月10日
    浏览(31)
  • 迈向三维:vue3+Cesium.js三维WebGIS项目实战

    写在前面:随着市场对数字孪生的需求日益增多,对于前端从业者的能力从对框架vue、react的要求,逐步扩展到2D、3D空间的交互,为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。本文将记录WebGIS的学习之旅,从实战项目入门,挖掘Cesium.js API,并逐步丰富项目

    2024年04月24日
    浏览(50)
  • 【WebGIS实例】(10)Cesium开场效果(场景、相机旋转,自定义图片底图)

    漫游效果视频: 【WebGIS实例】(10)Cesium开场效果(场景、相机 点击鼠标后将停止旋转并正常加载影像底图: 可以直接看代码,注释写得应该比较清楚了: 调用: 刚进入时就是直接加载这种图片作为SingleTileImageryProvider的,因为这样能够很快得加载出完整效果,而且不会像

    2024年02月12日
    浏览(29)
  • Cesium 3Dtiles偏移调整

    Cesium 3Dtiles偏移调整可以通过以下步骤进行: 根据前后经纬度和高度计算变换矩阵-平移矩阵: step1: 根据tileset的边界球体中心点的笛卡尔坐标得到经纬度坐标。 step2: 根据经纬度和高度0,得到地面笛卡尔坐标。 step3: 根据经纬度和需要的高度,得到偏移后的笛卡尔坐标。 st

    2024年01月25日
    浏览(32)
  • Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

    之前由于误解遇到一个特殊的需求: 想要把三维球上叠加倾斜摄影进行自由放大缩小,跟随地图的缩放进行缩放。 后来经过搜索、尝试,终于实现了需求。 但是,后来发现是误解需求了,甲方只是需要放大缩小地图,不需要改变倾斜摄影的比例。 不过也算是学习了一个功能

    2024年02月12日
    浏览(29)
  • 【Cesium】调整3DTile/tileset的位置到某个经纬度/某个地点/城市

    前提: 模型本身有地理位置信息,模型本身就能显示在地球表面了(而不是在地表下的球心或其他奇奇怪怪的位置) 以下是将tileset的位置调整到北京(在WGS84坐标系下)的正确代码: 在以上代码中,我们首先获取tileset的中心点坐标,并将其转换为WGS84坐标系下的经纬度。然后,我

    2024年02月12日
    浏览(31)
  • cesium源码编译调试及调用全过程

    完整记录一次cesium源码从下载、打包、调用、调试的全过程。 本文使用软件或API版本: VSCode Node:12.18.3 cesium版本:1.94 总体步骤: 下载源码 执行npm install和npm start启动web服务 打包源码(npm run combine打包前可以先将申请到的cesium的token更改到ion.js文件中的默认值中) 运行测试

    2023年04月21日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包