vue中使用Cesium引用外部做好的模型。(glb/gltf格式)文件可以放在线上或者public文件夹里

这篇博客介绍了如何在Vue CLI 3项目中集成Cesium库,并展示3D模型。首先通过npm安装cesium,然后在main.js中引入并挂载到Vue原型上。接着配置vue.config.js允许加载glb/gltf格式的模型文件。在组件中,通过import导入模型文件,并在模板中创建交互式的模型菜单,实现模型的切换。同时,调整地图源为高德地图,并隐藏版权信息。

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

1、npm i cesium -D

 

2、main.js中引用

import * as Cesium from "cesium/Cesium";

import widget from "cesium/Widgets/widgets.css";

// 定义为全局变量,以便调用

Vue.prototype.cesium = Cesium;

Vue.prototype.widgets = widget;

3、将自己制作好的glb/gltf格式的文件放在public->static文件夹中

 4、vuecli3中在vue.config.js文件的rules中加文件引入类型(不加会报错)

rules: [

                {

                        test: /\.(glb)$/,

                        loader: 'url-loader'

                }

],

 5、使用import方式import modelFile from '../../public/static/CesiumBalloon.glb'引入文件

 以下是样例:

<template>

<div id="container" class="box">

<div id="cesiumContainer">

<div class="modelMenu">

<div v-for="(item,index) in modelList" :key='index' class="modelItem" @click="changeModels(item.url)">

{{item.title}}

</div>

</div>

</div>

</div>

</template>

<script>

import modelFile from '../../public/static/CesiumBalloon.glb'

export default {

data() {

return {

url: modelFile,

modelList : [

{

title : 'CesiumAir',

url : modelFile

},

{

title : 'CesiumBalloon',

url : modelFile

},

{

title : 'CesiumMan',

url : modelFile

},

{

title : 'CesiumMilkTruck',

url :modelFile

},

{

title : 'GroundVehicle',

url : modelFile

},

{

title : 'Pawns',

url : modelFile

},

{

title : 'ShadowTester',

url : modelFile

},

{

title : 'WoodTower',

url : modelFile

},

],

Cesium : '',

viewer : ''

};

},

mounted() {

this.Cesium = this.cesium;

this.viewer = new this.Cesium.Viewer("cesiumContainer", {

baseLayerPicker: true, // 影像切换

animation: false, //是否显示动画控件

timeline: false, //是否显示时间线控件

infoBox: false, //是否显示点击要素之后显示的信息

geocoder: false, //是否显示地名查找控件

navigationHelpButton: false, //是否显示帮助信息控件

// terrainProvider: new Cesium.CesiumTerrainProvider({ // 加载地形信息,注释掉不加载天地图矢量图就可以显示天地图的地市信息

// url: 'https://www.supermapol.com/realspace/services/3D-stk_terrain/rest/realspace/datas/info/data/path',

// requestVertexNormals: true

// }),

});

this.init();

},

methods: {

changeModels(url){

this.url = url

this.init()

},

init() {

let Cesium = this.Cesium;

var viewer = this.viewer

//地图源换成高德

viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({

url : 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}'

}))

this.createModel(this.url, 5000.0, viewer, Cesium);

viewer._cesiumWidget._creditContainer.style.display = "none"; // 隐藏版权

},

createModel(url, height, viewer, Cesium) {

viewer.entities.removeAll();

var position = Cesium.Cartesian3.fromDegrees(120.15, 30.28, height);

var heading = Cesium.Math.toRadians(135);

var pitch = 0;

var roll = 0;

var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);

var orientation = Cesium.Transforms.headingPitchRollQuaternion(

position,

hpr

);

var entity = viewer.entities.add({

name: url,

position: position,

orientation: orientation,

model: {

uri: url,

minimumPixelSize: 128,

maximumScale: 20000,

},

});

viewer.trackedEntity = entity;

},

},

};

</script>

<style lang='less' scoped>

html,

body,

#cesiumContainer {

width: 100%;

height: 100%;

margin: 0;

padding: 0;

overflow: hidden;

position: relative;

}

.modelMenu{

position: absolute;

left: 20px;

top: 20px;

width: 100px;

text-align: center;

height: 500px;

z-index: 99;

color: aqua;

font-weight: bold;

font-size: 18px;

line-height: 40px;

text-align: center;

}

.modelItem{

cursor: pointer;

}

</style>

 

 

 

 

<think>好的,我现在需要帮助用户在Vue项目中使用Cesium加载和显示Gltf模型。根据用户提供的引用资料,我需要先理清步骤,并解决可能遇到的问题。 首先,用户提到需要将Cesium集成到Vue项目中。引用1和引用3都提到了这一点,尤其是引用3提到需要将模型文件放在Public目录下。这可能涉及到Vue的静态资源处理,需要确认路径是否正确。 接下来是加载Gltf模型的具体代码。引用2给出了一个示例函数,使用Cesium.ModelInstanceCollection来加载模型,并指定了url路径。但用户可能需要注意模型文件的路径是否正确,比如在Vue中静态文件通常放在public目录下,所以url应该指向该位置,如引用3所述。 另外,用户可能会遇到模型不显示的问题,如引用4提到的报错、显示太黑或中心点不对。这可能涉及到模型材质问题、光照设置或定位错误。需要检查模型是否使用了正确的坐标系,以及是否添加了适当的光源。 还有,Cesium的初始化步骤是否正确?比如是否正确创建了viewer实例,并配置了所需的插件,如Cesium的Widgets样式和脚本。引用1和引用2都提到了需要引入Cesium的相关资源,可能需要检查HTML文件的配置。 最后,测试环节也很重要。用户可能需要调整模型的位置、缩放或方向,确保模型正确加载到场景中。同时,处理可能出现的控制台错误,如网络请求失败或Cesium的警告信息。 总结步骤应该是:安装Cesium库,配置Vue项目,初始化Cesium Viewer,加载模型,处理常见问题。需要一步步引导用户完成,并提醒可能遇到的坑,如路径错误、模型格式问题等。</think>以下是在 Vue 项目中集成 Cesium 并加载 GLTF/GLB 模型的完整步骤: ### 一、环境配置 1. **安装 Cesium 依赖** ```bash npm install cesium --save npm install @cesium/engine @cesium/widgets --save ``` 2. **配置 vue.config.js** ```javascript const path = require(&#39;path&#39;) const CopyWebpackPlugin = require(&#39;copy-webpack-plugin&#39;) module.exports = { configureWebpack: { plugins: [ new CopyWebpackPlugin({ patterns: [ { from: &#39;node_modules/cesium/Build/Cesium/Workers&#39;, to: &#39;Workers&#39; }, { from: &#39;node_modules/cesium/Build/Cesium/ThirdParty&#39;, to: &#39;ThirdParty&#39; }, { from: &#39;node_modules/cesium/Build/Cesium/Assets&#39;, to: &#39;Assets&#39; }, { from: &#39;node_modules/cesium/Build/Cesium/Widgets&#39;, to: &#39;Widgets&#39; } ] }) ] } } ``` ### 二、初始化 Cesium Viewer ```vue <template> <div id="cesium-container"></div> </template> <script> import * as Cesium from &#39;cesium&#39;; import &#39;cesium/Build/Cesium/Widgets/widgets.css&#39;; export default { mounted() { this.initViewer(); }, methods: { initViewer() { Cesium.Ion.defaultAccessToken = &#39;YOUR_ION_TOKEN&#39;; window.viewer = new Cesium.Viewer(&#39;cesium-container&#39;, { terrainProvider: Cesium.createWorldTerrain(), animation: false, baseLayerPicker: false }); } } } </script> ``` ### 三、加载 GLTF 模型 ```javascript function loadGltfModel(position) { const modelEntity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(...position), model: { uri: &#39;/static/models/ship.gltf&#39;, minimumPixelSize: 128, maximumScale: 20000 } }); viewer.flyTo(modelEntity); } ``` ### 四、常见问题处理 1. **模型路径问题** - 必须将模型文件放置在 `public/static/models/` 目录下[^3] - 使用绝对路径 `/static/models/xxx.gltf` 2. **模型显示异常** ```javascript // 调整材质光照 modelEntity.model.silhouetteColor = Cesium.Color.WHITE; modelEntity.model.silhouetteSize = 0; modelEntity.model.lightColor = new Cesium.Color(1.0, 1.0, 1.0, 1.0); ``` 3. **坐标定位校准** ```javascript // 添加坐标偏移调整 const offsetPosition = Cesium.Cartesian3.fromElements( originalPosition.x + 50, originalPosition.y - 30, originalPosition.z + 10 ); ``` ### 五、完整组件示例 ```vue <template> <div> <div id="cesium-container"></div> <button @click="loadShipModel">加载船舶模型</button> </div> </template> <script> export default { methods: { loadShipModel() { const longitude = 121.5; // 上海经度 const latitude = 31.2; // 上海纬度 const height = 500; // 海拔高度 const position = Cesium.Cartesian3.fromDegrees( longitude, latitude, height ); this.addModel(&#39;/static/models/ship.gltf&#39;, position); }, addModel(uri, position) { viewer.entities.removeAll(); const entity = viewer.entities.add({ position: position, model: { uri: uri, scale: 1.0, runAnimations: true } }); viewer.flyTo(entity); } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值