cesium键盘控制模型

文章介绍了如何在React中封装Cesium库,实现实体模型(如F18.gltf)的动态添加,并通过监听键盘事件控制模型的位置(包括位置、旋转)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果:

由于对添加模型和更新位置api进行二次了封装,下面提供思路

1.添加模型

const person = reactive({
  modelTimer: null,
  position: {
    lon: 104.07274,
    lat: 30.57899,
    alt: 1200,
    heading: 0,
    pitch: 0,
    roll: 0,
  },
});  
window.swpcesium.addEntity.addModel({
    id: "model",
    position: person.position,
    config: {
      url: "./model/f18.gltf",
      minSize: 200,
      maxSize: 300,
    },
  });

2.监听键盘事件并更新模型位置

// 添加键盘监听事件
document.addEventListener("keydown", function (e) {
  switch (e.keyCode) {
    // 抬头
    case 38:
      person.position.pitch += 5;
      window.swpecesium.addEntity.transform({
        id: "model",
        position: person.position,
      });
      console.log(
### Cesium 中的运动控制实现 #### 使用键盘控制模型姿态变化 在Cesium中,可以通过监听键盘事件来改变3D模型的姿态。这涉及到设置场景中的相机视角以及修改模型自身的旋转和平移属性。 ```javascript // 初始化Cesium Viewer实例 var viewer = new Cesium.Viewer('cesiumContainer'); // 定义响应按键的方法 function handleKeyPress(event) { var scene = viewer.scene; switch (event.key) { case 'ArrowUp': // 向前移动 break; case 'ArrowDown': // 向后移动 break; case 'ArrowLeft': // 左转 model.rotation = Cesium.Math.toRadians(-90); break; case 'ArrowRight': // 右转 model.rotation = Cesium.Math.toRadians(90); break; default: console.log(`Pressed key ${event.key} is not mapped to any action.`); } } document.addEventListener('keydown', handleKeyPress, false); // 加载并配置要操作的3D模型 var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( Cesium.Cartesian3.fromDegrees(longitude, latitude, height) ); viewer.entities.add({ position : Cesium.Cartesian3.fromDegrees(longitude, latitude), model : { uri : './path/to/model.gltf', scale : 1.0, minimumPixelSize : 128, maximumScale : 20000, modelMatrix: modelMatrix } }); ``` 此代码片段展示了如何创建一个简单的键控机制来操控加载好的3D模型[^1]。 #### 控制3D模型上的点沿路径运动 为了使单个点沿着预定轨迹在3D模型表面滑动,可以利用`SampledPositionProperty`类定义动态位置,并将其应用于实体对象。 ```javascript // 创建一条样条曲线作为路径 var pathPositions = [ Cesium.Cartographic.fromDegrees(lonStart, latStart, altStart), ...intermediatePoints.map(p => Cesium.Cartographic.fromDegrees(...p)), Cesium.Cartographic.fromDegrees(lonEnd, latEnd, altEnd) ]; let property = new Cesium.SampledPositionProperty(); for(let i=0; i<pathPositions.length; ++i){ let time = startTime.plusSeconds(i * intervalInSeconds); property.addSample(time, Cesium.Ellipsoid.WGS84.cartographicToCartesian(pathPositions[i])); } // 将该属性绑定给目标实体 viewer.entities.add({ name : "Moving Point", availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({start : startTime, stop : endTime})]), position : property, point : { pixelSize : 5, color : Cesium.Color.RED }, }); // 开始播放动画 viewer.trackedEntity = entity; ``` 这段脚本说明了怎样让一个红色标记按照设定的时间间隔,在两个地理位置之间平滑过渡[^2]。 #### 移除时间轴并通过按钮管理运动状态 对于希望简化界面设计的应用程序来说,隐藏默认的时间线组件是有益处的;与此同时提供自定义UI元素用于触发特定动作也很重要。 ```javascript // 隐藏内置的时间轴栏 viewer.timeline.container.style.display = 'none'; // 添加HTML按钮以启动/暂停模拟过程 const playButton = document.createElement('button'); playButton.innerText = 'Play'; playButton.onclick = () => { if(viewer.clock.shouldAnimate === true){ viewer.clock.shouldAnimate = false; playButton.innerText = 'Resume'; }else{ viewer.clock.shouldAnimate = true; playButton.innerText = 'Pause'; } }; document.body.appendChild(playButton); ``` 上述示例解释了如何去掉不必要的GUI部件,并引入外部控制器以便更灵活地处理时空变换逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_63701303

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值