cesium——2D模式下拖动黑影问题

最近项目中遇到了一个问题,切换到2D模式下的时候,球上的点、线、图片、模型等,拖动时偶尔会出现黑影,放个对比图感受一下,下图分别是正常显示和拖动黑影两种情况。
正常显示
拖动黑影
操作了几次发现了问题所在,左右拖动会发现有多个世界,每次出现世界边界的时候就会出现拖影的问题。之后去查了api发现了mapMode2D属性,该属性有两个取值

  1. Cesium.MapMode2D.INFINITE_SCROLL
    The 2D map can be scrolled infinitely in the horizontal direction.(二维地图可以在水平方向上无限滚动)
  2. Cesium.MapMode2D.ROTATE
    The 2D map can be rotated about the z axis.(二维地图可以围绕z轴旋转)

其中,Cesium.MapMode2D.INFINITE_SCROLL为默认值,即我们看到的多个世界,可以无限拖动。当mapMode2D的属性值改为Cesium.MapMode2D.ROTATE后,不再出现多个世界,也不会有拖影了。

总结
为防止出现拖影,可以在初始化时设置mapMode2D属性值为Cesium.MapMode2D.ROTATE,虽然我也不明白为什么会这样,但是设置之后问题真的不存在了。

var viewer = new Cesium.Viewer( 'cesiumContainer', {
	sceneModePicker : true,
	mapMode2D: Cesium.MapMode2D.ROTATE
}
<think>好的,我需要帮助用户获取一个在Vite项目中使用Vue3和Setup语法,结合Cesium2D模式实现飞机舰船轨迹效果的完整示例代码。首先,我需要整合用户提供的引用内容中的相关信息,并确保符合系统级指令的要求。 首先,根据引用[4]和引用[5],用户提到了使用Vite创建Vue3项目的步骤,包括初始化项目、安装依赖以及路由配置。因此,示例代码应该从项目创建开始,确保用户能正确设置环境。此外,引用[2]提到了Cesium的访问令牌设置,这在初始化Cesium时是必需的,所以代码中需要包含这部分内容。 接下来,引用[3]讨论了Vue3的自定义v-model,但用户的问题主要涉及Cesium的集成,所以这部分可能暂时用不上,但需要注意组件化的结构。引用[1]提到的vite-plugin-vue-setup-extend插件可以帮助简化组件的name定义,虽然用户示例中没有明确要求,但可能对项目结构有帮助,可以建议用户安装该插件以便更好地管理组件名称。 用户需要的是2D模式下的轨迹效果,因此需要配置Cesium的Viewer为2D模式。查阅Cesium文档,初始化Viewer时设置imageryProvider为createWorldImagery,并调整sceneMode为SCENE2D。同时,需要添加实体(如飞机和舰船)并更新它们的位置以形成轨迹。 在Vue3的setup语法中,应该使用生命周期钩子onMounted来初始化Cesium Viewer,并在onUnmounted中进行清理,防止内存泄漏。引用[4]中提到了setup函数的使用,所以代码示例需要展示如何在setup中处理响应式数据和生命周期。 数据方面,需要使用reactive或ref来存储实体和位置信息。例如,定义一个shipPositions数组来存储舰船的位置,并使用定时器或动画帧来更新位置,模拟移动轨迹。同样,飞机的位置也需要类似的处理。 需要注意Cesium的加载可能需要异步处理,因此使用Cesium的readyPromise来确保Viewer完全加载后再添加实体。此外,轨迹线可以使用Polyline实体,设置材质和宽度,而动态图标可以使用CustomDataSource来管理,方便更新位置。 最后,代码示例需要包含必要的HTML结构,比如在模板中包含一个带有id的div作为Cesium的容器,并应用样式以确保正确显示。同时,要提醒用户替换为自己的Cesium访问令牌,并安装相关依赖。 总结步骤:创建Vite项目,安装Vue3、Cesium和相关插件;配置Cesium Viewer为2D模式;在setup中使用生命周期钩子初始化和清理;创建实体并动态更新位置;处理响应式数据;提供完整的组件代码和模板结构。同时,生成相关问题以帮助用户深入理解。</think>以下是一个基于Vite+Vue3+Setup语法实现Cesium 2D模式轨迹效果的完整示例: ```vue <!-- CesiumTrajectory.vue --> <script setup> import { onMounted, onUnmounted, reactive } from 'vue' import * as Cesium from 'cesium' // Cesium访问令牌配置[^2] Cesium.Ion.defaultAccessToken = 'YOUR_ACCESS_TOKEN' const state = reactive({ viewer: null, shipPositions: [], aircraftPosition: null }) // 初始化Cesium Viewer const initViewer = () => { state.viewer = new Cesium.Viewer('cesiumContainer', { sceneMode: Cesium.SceneMode.SCENE2D, // 强制2D模式 baseLayerPicker: false, imageryProvider: new Cesium.createWorldImagery() }) } // 创建舰船轨迹 const createShipTrajectory = () => { const shipDataSource = new Cesium.CustomDataSource('ships') state.viewer.dataSources.add(shipDataSource) // 初始化舰船位置 const initialPosition = Cesium.Cartesian3.fromDegrees(-75.0, 40.0) const shipEntity = shipDataSource.entities.add({ position: initialPosition, billboard: { image: require('./ship-icon.png'), width: 50, height: 50 } }) // 更新位置模拟移动 setInterval(() => { const newPosition = Cesium.Cartesian3.add( shipEntity.position.getValue(Cesium.JulianDate.now()), new Cesium.Cartesian3(1000, 0, 0), new Cesium.Cartesian3() ) shipEntity.position = newPosition state.shipPositions.push(newPosition) }, 1000) } // 创建飞机轨迹 const createAircraftPath = () => { const polyline = state.viewer.entities.add({ polyline: { positions: new Cesium.CallbackProperty(() => state.aircraftPosition, false), width: 4, material: Cesium.Color.RED } }) } onMounted(() => { initViewer() state.viewer.readyPromise.then(() => { createShipTrajectory() createAircraftPath() }) }) onUnmounted(() => { if (state.viewer) { state.viewer.destroy() } }) </script> <template> <div id="cesiumContainer" class="full-screen"></div> </template> <style scoped> .full-screen { width: 100vw; height: 100vh; margin: 0; padding: 0; overflow: hidden; } </style> ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值