learning_cesium/模型调整.html

491 lines
22 KiB
HTML
Raw Permalink Normal View History

2024-03-19 18:06:25 +08:00
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Use correct character set. -->
<meta charset="utf-8" />
<!-- Tell IE to use the latest, best version. -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
/>
<title>Learning Cesium!</title>
<script src="./Build/Cesium/Cesium.js"></script>
<!-- 引入样式 -->
<link rel="stylesheet" href="./js/elementui/index.css" />
<!-- import Vue before Element -->
<script src="./js/vue2710.js"></script>
<!-- import JavaScript -->
<script src="./js/elementui/index.js"></script>
<style>
@import url(./Build/Cesium/Widgets/widgets.css);
html,
body,
#app,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
#controler-panel{
position: absolute;
top: 90px;
left: 100px;
background: rgba(0,0,0,0.3);
color: white;
padding: 15px;
}
.block{
display: flex;
justify-content: space-between;
align-items: center;
}
.slider{
width: 400px;
display: inline-block;
}
</style>
</head>
<body>
<div id="app">
<div id="cesiumContainer"></div>
<div id="controler-panel">
<el-select v-model="value" placeholder="请选择" @change="changeModel">
<el-option
v-for="item in models"
:key="item.name"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
<div class="block">
<span class="demonstration">模型位置-X</span>
<el-slider class="slider" v-model="x" @change="changePos" :max="7000000" :min="-7000000" :step="0.0001" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型位置-Y</span>
<el-slider class="slider" v-model="y" @change="changePos" :max="7000000" :min="-7000000" :step="0.0001" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型位置-Z</span>
<el-slider class="slider" v-model="z" @change="changePos" show-input-controls :input-size="'mini'" :step="0.1" :max="7000000" :min="-7000000" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型姿态-Heading</span>
<el-slider class="slider" v-model="heading" :max="7000000" @change="changeRoate" :min="-7000000" :step="0.1" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型姿态-Pitch</span>
<el-slider class="slider" v-model="pitch" :max="7000000" @change="changeRoate" :min="-7000000" :step="1" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型姿态-Roll</span>
<el-slider class="slider" v-model="roll" :max="7000000" @change="changeRoate" :min="-7000000" :step="1" show-input></el-slider>
</div>
<div class="block">
<span class="demonstration">模型大小-scale</span>
<el-slider class="slider" v-model="scale" :max="7000000" @change="changeScale" :min="-7000000" :step="0.1" show-input></el-slider>
</div>
</div>
</div>
<script>
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
new Vue({
el:"#app",
data(){
return {
x:0,
y:0,
z:0,
heading:0,
pitch:0,
roll:0,
scale:0,
models:[
{name:"白河水库",uri:"./data/Custom/baihe.glb",lon:111.59417,lat:30.733737,height:-10,heading:89.5,scale:1800},
{name:"白河水电站",uri:"./data/Custom/白河水电站.glb",lon:110.019616,lat:32.874257,height:0,heading:-3,scale:1.6},
{name:"崔家营航电枢纽大坝",uri:"./data/Custom/崔家营航电枢纽大坝1.1.glb",lon:112.163566,lat:31.956524,height:0,heading:96.6,scale:9.6},
{name:"兴隆水利枢纽大坝",uri:"./data/Custom/兴隆水利枢纽大坝.glb",lon:112.673178,lat:30.599353,height:0,heading:89.3,scale:31},
{name:"陶岔渠首",uri:"./data/Custom/陶岔渠首2.glb",lon:111.70915,lat:32.67431,height:18,heading:-47.3,scale:47},
{name:"丹江口水库大坝",uri:"./data/Custom/丹江口水库大坝.glb",lon:111.48912,lat:32.55599,height:0,heading:-270,scale:0.7},
{name:"黄龙滩水力发电厂2.0",uri:"./data/Custom/黄龙滩水力发电厂2.0.glb",lon:110.52266 , lat:32.67627,height:0,heading:-60,scale:8.4},
{name:"雅口航运枢纽大坝",uri:"./data/Custom/雅口航运枢纽大坝.glb",lon:112.37811, lat:31.66334 ,height:0,heading:88,scale:3.45},
],
value:"",
}
},
methods:{
changeModel(name){
let item = this.models.filter(item=>item.name == name)[0]
this.addModel(
item.uri,
item.lon,
item.lat,
item.height,
item.heading,
item.scale
)
},
initViewer(){
var viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: false, //位置查找
homeButton: false, //视图返回初始位置
sceneModePicker: true, //视角选择器
// baseLayerPicker:false,//底图选择器
navigationHelpButton: false, //导航帮助按钮
animation: false, //动画控制器
// creditContainer:"credit",//版权显示
timeline: false, //时间线
fullscreenButton: false, //全屏控件
vrButton: false,
infoBox:false,
selectionIndicator:false,
terrainProvider: Cesium.createWorldTerrain({
requestVertexNormal: true, //添加地形光照
requestWaterMask: true, //添加水面波浪效果
}),
});
this.viewer = viewer;
let imageryLayers = viewer.imageryLayers;
// imageryLayers.removeAll();
// 叠加影像服务
var token = "bf156eb3c72350d62b008dc8a4ae1016";
// 服务域名
var tdtUrl = "https://t{s}.tianditu.gov.cn/";
// 服务负载子域,天地图地图服务二级域名包括t0-t7可以随机选择使用如http://t2.tianditu.gov.cn/vec_c/wmts?tk=您的密钥
var subdomains = ["0", "1", "2", "3", "4", "5", "6", "7"];
var imgMap = new Cesium.UrlTemplateImageryProvider({
url: tdtUrl + "DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + token,
subdomains: subdomains,
tilingScheme: new Cesium.WebMercatorTilingScheme(),
maximumLevel: 18,
});
// viewer.imageryLayers.addImageryProvider(imgMap);
// 叠加国界服务
// var iboMap = new Cesium.UrlTemplateImageryProvider({
// url: tdtUrl + "DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=" + token,
// subdomains: subdomains,
// tilingScheme: new Cesium.WebMercatorTilingScheme(),
// maximumLevel: 10,
// });
// viewer.imageryLayers.addImageryProvider(iboMap);
viewer.scene.globe.depthTestAgainstTerrain = false;
// this.addCuiModel();
// this.addBaiHeModel();
// this.addXinglongModel();
// this.addTaoChaModel();
// this.addDanJiangKouModel();
this.initEvent();
},
addModel(uri,lon,lat,height,heading,scale){
let that = this;
const position = Cesium.Cartesian3.fromDegrees(lon,lat,height);
const hpr = new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(heading),
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(0)
);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : uri,
scale:scale
}
});
window.baihe = entity
this.viewer.zoomTo(entity)
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = heading
that.scale = scale
},
addCuiModel(){
let that = this;
const position = Cesium.Cartesian3.fromDegrees(112.163566,31.956524,0);
const heading = Cesium.Math.toRadians(96.6);
const pitch = Cesium.Math.toRadians(0);
const roll = 0;
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : './data/Custom/崔家营航电枢纽大坝1.1.glb',
scale:9.6
}
});
window.baihe = entity
this.viewer.zoomTo(entity)
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = 96.6
that.scale = 9.6
},
addBaiHeModel(){
let that = this;
const position = Cesium.Cartesian3.fromDegrees(110.019616 ,32.874257,0);
const heading = Cesium.Math.toRadians(-3);
const pitch = Cesium.Math.toRadians(0);
const roll = 0;
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : './data/Custom/白河水电站.glb',
scale:1.6
}
});
this.viewer.zoomTo(entity)
window.baihe = entity;
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = -3
that.scale = 1.6
},
addXinglongModel(){
let that = this;
const position = Cesium.Cartesian3.fromDegrees(112.673178,30.599353,0);
const heading = Cesium.Math.toRadians(89.3);
const pitch = Cesium.Math.toRadians(0);
const roll = 0;
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : './data/Custom/兴隆水利枢纽大坝.glb',
scale:31
}
});
this.viewer.zoomTo(entity)
window.baihe = entity;
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = 89.3
that.scale = 31
},
addTaoChaModel(){
let that = this;
// const position = Cesium.Cartesian3.fromDegrees(111.70915 , 32.67431,18);
const position = Cesium.Cartesian3.fromDegrees(111.70915 , 32.67431,150);
const heading = Cesium.Math.toRadians(-47.3);
const pitch = Cesium.Math.toRadians(0);
const roll = 0;
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : './data/Custom/陶岔渠首2.glb',
scale:47
}
});
this.viewer.zoomTo(entity)
window.baihe = entity;
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = -47.3
that.scale = 47
},
addDanJiangKouModel(){
let that = this;
// const position = Cesium.Cartesian3.fromDegrees(111.70915 , 32.67431,18);
const position = Cesium.Cartesian3.fromDegrees(111.48912 , 32.55599,0);
const heading = Cesium.Math.toRadians(-270);
const pitch = Cesium.Math.toRadians(0);
const roll = 0;
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
var entity = this.viewer.entities.add({
position : position,
orientation: orientation,
model : {
uri : './data/Custom/丹江口水库大坝.glb',
scale:0.7
}
});
this.viewer.zoomTo(entity)
let cartesian3 = entity.position.getValue()
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var height_String = cartographic.height.toFixed(6);
window.baihe = entity;
that.x = Number(log_String);
that.y = Number(lat_String);
that.z = Number(height_String);
that.heading = -270
that.scale = 0.7
},
changeScale(){
baihe.model.scale = new Cesium.CallbackProperty(()=>{
return this.scale
}, false)
},
changePos(){
baihe.position = new Cesium.CallbackProperty(()=>{
return Cesium.Cartesian3.fromDegrees(this.x ,this.y,this.z)
}, false)
},
changeRoate(){
const origin = baihe.position.getValue()
const heading = Cesium.Math.toRadians(this.heading)
const pitch = Cesium.Math.toRadians(this.pitch)
const roll = Cesium.Math.toRadians(this.roll)
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll)
const orientation = Cesium.Transforms.headingPitchRollQuaternion(origin, hpr)
baihe.orientation = orientation
},
initEvent(){
let that = this;
let handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
handler.setInputAction(function (movement) {
//捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
var cartesian3 = that.viewer.camera.pickEllipsoid(movement.position);
if (cartesian3) {
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = that.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var alti_String = (that.viewer.camera.positionCartographic.height / 1000).toFixed(2);
// vm.lng = log_String;
// vm.lat = lat_String;
// vm.alti = alti_String;
console.log(log_String,lat_String)
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
},
mounted(){
this.initViewer();
}
})
/**
* 加载3D模型
*
* 基于glTF的三维模型模型的位置和方向由包含的实体决定。
* Cesium 包括对glTF geometry、材质 materials、动画 animations 和皮肤 skinning 的支持。目前不支持 Cameras和灯光 ligts。
*
* 主要属性:
* uri
*
*/
// const position = Cesium.Cartesian3.fromDegrees(111.594170, 30.733737,100);
// const heading = Cesium.Math.toRadians(90);
// const pitch = Cesium.Math.toRadians(0);
// const roll = 0;
// const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
// const orientation = Cesium.Transforms.headingPitchRollQuaternion(
// position,
// hpr
// );
// var entity = viewer.entities.add({
// position : position,
// orientation: orientation,
// model : {
// uri : './data/Custom/baihe.glb',
// scale:1800
// }
// });
// viewer.zoomTo(entity)
</script>
</body>
</html>