learning_cesium/模型调整.html

491 lines
22 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>