cesium火箭发射,模型控制,模型动画,模型移动
创始人
2024-02-11 14:45:08

起因:最近想做模型的动画,结果上网查资料,看到网上好多对于模型控制的文章都有限制。决定还是自己研究下。欢迎大家一起探讨,评论留言。

效果

火箭

全部代码在最后

起步

  • 模型控制,第一步当然是需要一个合适的模型,去cesium官网实例中找到了一个合适的模型,并且还顺带了一些模型操作方法。
    在这里插入图片描述

  • 搜索关键字applyArticulations;模型地址;

  • 拿到模型迫不及待的想在自己自己的项目中加载出来

  • 加载方式有两种entityPrimitive, 我个人更喜欢第二种Primitive方式。

  • 对应的参数就不做解释了,文档中都有

let rocketPrimitive: Cesium.Model
let position = Cesium.Cartesian3.fromDegrees(104.200403, 30.396231, 600.0);
const hpRoll = new Cesium.HeadingPitchRoll();
const fixedFrameTransform = Cesium.Transforms.localFrameToFixedFrameGenerator("north", "west");
const rocketPrimitive = viewer.scene.primitives.add(Cesium.Model.fromGltf({url: "https://assets.agi.com/models/launchvehicle.glb",modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(position,hpRoll,Cesium.Ellipsoid.WGS84,fixedFrameTransform),minimumPixelSize: 128,}));

在这里插入图片描述

模型的组成

const articulations = model.sceneGraph._runtimeArticulations;官方的这段代码我用着报错,文档里面没有。也不知道啥问题

  • 直接将加载的模型打印出来看里面具体的结构

在这里插入图片描述

发现了nodes,模型里面的关节点,就是模型由哪些部分组成,官网文档中也明确的说了。画红线的那段话翻译出来就是"返回glTF中具有给定名称的节点。这用于修改用户定义动画的节点变换"
在这里插入图片描述

模型操作

  • 点火
 rocketPrimitive.setArticulationStage( //对应属性改变参数值'SRBFlames Size',1);rocketPrimitive.applyArticulations(); //使得修改的属性生效

在这里插入图片描述

  • 火箭点火后自然就要移动,添加模型的平滑移动,模型的平滑移动我之前的文章有。
  • 原理就是不停的移动模型位置,以及模型的姿态,只要移动的距离足够小看起来就是平滑的。
 Cesium.Transforms.headingPitchRollToFixedFrame(showPath[activeIndex], //当前坐标点Cesium.Cartesian3hpRoll,//姿态Cesium.Ellipsoid.WGS84,fixedFrameTransform,rocketPrimitive.modelMatrix //模型当前的世界矩阵);
  • 利用viewer.scene.preUpdate.addEventListener //下一帧渲染前回调

viewer.scene.preUpdate.addEventListener(keepRun)

  • keepRun 就是我们移动的函数
const keepRun = (scene: Cesium.Scene, time: number) => {if (activeIndex >= maxIndex) returnif (autoDirection && activeIndex > 0 && !showPath[activeIndex - 1].equals(showPath[activeIndex])) { //判断前后两个点是否一样,不一样就调整姿态const heading = Helper.getHeading(showPath[activeIndex - 1],showPath[activeIndex],);if (heading) hpRoll.heading = headingconst pitch = Helper.getPitch(showPath[activeIndex - 1],showPath[activeIndex])if (pitch) hpRoll.pitch = pitch}Cesium.Transforms.headingPitchRollToFixedFrame(showPath[activeIndex],hpRoll,Cesium.Ellipsoid.WGS84,fixedFrameTransform,rocketPrimitive.modelMatrix);activeIndex += 1
}

在这里插入图片描述

  • 可以平滑的移动了。

  • 当然火焰的生起也应当平滑,控制模型都需要平滑的操作,直接写个函数控制

function modelAnimationController(controller: typeModelAnimationController) {const { type, initVal, maxVal, fn, step, minVal } = controllerlet num = initVallet stopFrame: numberconst max = maxVal || 1const min = minVal || -99999const duration = step || 0.1const render = () => {num += durationrocketPrimitive.setArticulationStage(type,num);rocketPrimitive.applyArticulations();stopFrame = requestAnimationFrame(render)if (num > max || num <= min) {window.cancelAnimationFrame(stopFrame)fn && fn()}}render()
}
modelAnimationController({type: 'SRBFlames Size', initVal: 0, maxVal: 1, step: 0.05, fn: () => {viewer.scene.preUpdate.addEventListener(keepRun)}
})

在这里插入图片描述

剩下的都是重复的操作,以及反复调试修改达到最佳

  • 比如火焰喷射要有真实感
  • 火箭转向时 喷射头偏转,等等


相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...