在 vue 中使用铯 - 铯加载模型
最编程
2024-04-26 11:12:21
...
一 前言
上一节我们完成了vue中使用Cesium的第一步,本节将继续介绍Cesium关于模型加载的一些尝试。在本节分别做了三种尝试(加载cesium官网仓库的纽约模型,加载本地的gltf模型,加载采集的3DTiles数据)
二 加载New York City 3D Buildings
想要加载官网仓库的New York City 3D Buildings模型,你需要先去注册账号,并在项目中填写你的token同时将New York City 3D Buildings 加入到你自己的仓库中,然后通过id进行模型调用,具体操作上节已经说过,此处我们直接使用。
在仓库中我们可以看到New York City 3D Buildings id 为 75343,接下来定义加载方法,直接使用。
loadBuliding(){
//此处不想使用默认的谷歌地图影像,所以使用此url指定ArcGIS的在线影像地图
let url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer";
let geogle = new Cesium.ArcGisMapServerImageryProvider({url:url});
//此处填写你在cesium注册的token
Cesium.Ion.defaultAccessToken='你的token';
this.viewer= new Cesium.Viewer('cesiumContainer',{
baseLayerPicker: false, //是否显示图层选择控件
selectionIndicator: false,
// geocoder: false, //是否显示地名查找控件
// sceneModePicker: false, //是否显示投影方式控件
// navigationHelpButton: false, //是否显示帮助信息控件
// homeButton: false, //是否显示Home按钮
// fullscreenButton: false, //是否显示全屏按钮
// timeline:false, //时间轴控件
// animation:false, //动画控件
imageryProvider:geogle,
// terrainProvider:new Cesium.createWorldTerrain({
// requestVertexNormals:true,
// requestWaterMask:true
// }),
});
//用来设置相机的观看方向
let initialPosition = Cesium.Cartesian3.fromDegrees(
-74.01881302800248,
40.69114333714821,
-20
);
//设置相机镜头对准的方法
let initialOrientation = new Cesium.HeadingPitchRoll.fromDegrees(
21.27879878293835,
-21.34390550872461,
0.0716951918898415
);
this.viewer.camera.setView({
destination: initialPosition,
orientation: initialOrientation,
endTransform: Cesium.Matrix4.IDENTITY,
});
//通过id进行加载 此处New York City 3D Buildings 为 75343
let city= new Cesium.Cesium3DTileset({url:Cesium.IonResource.fromAssetId(75343)});
this.viewer.scene.primitives.add(city);
//使不同高度展现不同颜色
let heightStyle = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${Height} >= 300", "rgba(45, 0, 75, 0.5)"],
["${Height} >= 200", "rgb(102, 71, 151)"],
["${Height} >= 100", "rgb(170, 162, 204)"],
["${Height} >= 50", "rgb(224, 226, 238)"],
["${Height} >= 25", "rgb(252, 230, 200)"],
["${Height} >= 10", "rgb(248, 176, 87)"],
["${Height} >= 5", "rgb(198, 106, 11)"],
["true", "rgb(127, 59, 8)"],
],
},
});
city.style = heightStyle;
},
效果如下:
三 加载gltf模型
loadGlTF(){
this.viewer = new Cesium.Viewer("cesiumContainer", {
animation: false, //是否创建动画小器件,左下角仪表
baseLayerPicker: false, //是否显示图层选择器
fullscreenButton: false, //是否显示全屏按钮
geocoder: false, //是否显示geocoder小器件,右上角查询按钮
homeButton: false, //是否显示Home按钮
infoBox: false, //是否显示信息框
sceneModePicker: true, //是否显示3D/2D选择器,与scene3DOnly不能同时为true
selectionIndicator: false, //是否显示选取指示器组件
timeline: false, //是否显示时间轴
navigationHelpButton: false, //是否显示右上角的帮助按钮
scene3DOnly: false, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
terrainProvider:new Cesium.createWorldTerrain({
requestVertexNormals:true,
requestWaterMask:true
}),
});
let scene = this.viewer.scene;
//关键代码
let modelMatrix = new Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3.fromDegrees(113.40, 34.32, 6.0));//gltf数据加载位置(自定义)
let model = scene.primitives.add(new Cesium.Model.fromGltf({
url: './scene.gltf', //gltf文件的URL
modelMatrix: modelMatrix,
scale: 1400.0 //放大倍数
}));
this.viewer.camera.setView({
destination: new Cesium.Cartesian3.fromDegrees(113.40, 34.32, 2500.0), //相机飞入点
orientation:{
heading: Cesium.Math.toRadians(90.0), //左右摆头
pitch: Cesium.Math.toRadians(-40), //上下抬头
roll:0.0
}
});
// 限制相机的高度最小值
// this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 2500;
// 设置相机缩小时的速率
//this.viewer.scene.screenSpaceCameraController._minimumZoomRate = 30000; // 设置相机缩小时的速率
},
效果如下:
四 加载采集的3DTiles数据
首页你需要有一组3DTiles数据,并且将数据整体放到服务上以至于可以通过url进行访问(以json文件为入口,进行读取加载)
init3DTilesJson(){
let url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer";
let geogle = new Cesium.ArcGisMapServerImageryProvider({url:url});
Cesium.Ion.defaultAccessToken='你的token
this.viewer = new Cesium.Viewer('cesiumContainer',{
imageryProvider:geogle,
baseLayerPicker: false, //是否显示图层选择控件
selectionIndicator: false,
geocoder: false, //是否显示地名查找控件
sceneModePicker: false, //是否显示投影方式控件
navigationHelpButton: false, //是否显示帮助信息控件
homeButton: false, //是否显示Home按钮
fullscreenButton: false, //是否显示全屏按钮
timeline:false, //时间轴控件
animation:false, //动画控件
terrainProvider:new Cesium.createWorldTerrain({
requestVertexNormals:true,
requestWaterMask:true
}),
});
//开启地下可视化调整高度
// this.viewer.scene.screenSpaceCameraController.enableCollisionDetection = false;
// this.viewer.scene.globe.translucency.enabled=true;
// this.viewer.scene.globe.depthTestAgainstTerrain = true;
//相机最低高度
// this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 200;
//相机最高高度
// this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 800;
// 设置相机缩小时的速率
//this.viewer.scene.screenSpaceCameraController._minimumZoomRate = 30000; // 设置相机缩小时的速率
//隐藏地球
this.viewer.scene.globe.show = false;
//隐藏logo
this.viewer.cesiumWidget.creditContainer.style.display = "none";
//监听渲染,调整模型位置大小
let palaceTileset= new Cesium.Cesium3DTileset({url:'你的3DTiles文件'})
palaceTileset.readyPromise.then(palaceTileset=>{
//添加到场景
this.viewer.scene.primitives.add(palaceTileset);
let longitude = 121.502325; //模型需要改变的经度(自定义,任意值)
let latitude = 31.238165; //模型需要改变的纬度(自定义,任意值)
let heightOffset = 10; //模型需要改变的高度(根据3DTiles调整,此次调整为10)
//获取3Dtlies的bounds范围
let boundingSphere = palaceTileset.boundingSphere;
//获取3Dtlies的范围中心点的弧度
let cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
//定义3Dtlies改变之后中心点的弧度
let offsetvalue = Cesium.Cartographic.fromDegrees(longitude, latitude, heightOffset);
//模型本身的位置
let surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
//模型改变的位置
let offset = Cesium.Cartesian3.fromRadians(offsetvalue.longitude, offsetvalue.latitude, heightOffset);
//定义模型的改变状态
let translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
//修改模型的位置
palaceTileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
//异步设置摄像机以查看提供的一个或多个实体或数据源。
this.viewer.zoomTo(palaceTileset, new Cesium.HeadingPitchRange(0.5, -0.2, palaceTileset.boundingSphere.radius * 1.0));
})
},
效果如下:
此处需要注意的是:
- 背景为星空黑色是因为我把地球隐藏了。
- 当地球未被隐藏的时候你可能在地球表面找不到你的模型,大概率是因为高度没有设置对,模型在地下。这时候你需要开启地下可视化来调整模型高度(heightOffset)
- 一个完整的3DTiles文件格式如下
使用时的url应该是如下格式:http://xxxxxxxx:xx/xxx.json 以json文件为入口
上一篇: Jenkins 简述及其设置
推荐阅读
-
在 vue 中使用铯 - 铯加载模型
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
[vue-cesium] 在 vue 上使用铯来开发 3D 地图 (I)
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
在Vue中使用three.js加载各种3D模型文件(包括glb、gltf、FBX和json)