potree使用感悟

potree简单小案例

potree 官网地址
PotreeConverter
这里就不多介绍这potree了,想使用的同学可直接去官网查询,这边主要介绍的是个人的一些使用感悟

加载自己的点云

1.首先必须下载好PotreeConverter
2.使用的点云格式如果是.las文件格式那么版本不能低于1.2,如果说想查看.las文件版本可通过CloudCompare软件(也可以通过它去更改文件格式)查询
3.进入PotreeConverter文件夹(下面是个示例)

./PotreeConverter.exe C:/pointclouds/data.las -o G:/pointclouds/data_converted

结果为:
img
4.将data_converted文件夹放入potree文件的pointclouds文件夹中(可以点开metadata.json文件看是否转换成功,如果全为NULL,可能需要您自己找下问题所在)
5.(我这里使用的viewer.html,也可以使用其他文件)将viewer.html中这段代码改掉

// before
Potree.loadPointCloud("../pointclouds/vol_total/cloud.js", "sigeom.sa", e => {
			...
		});
		
// after
Potree.loadPointCloud("../pointclouds/data_converted/metadata.json", "sigeom.sa", e => {
			...
		});

6.启动potree(github上有启动方法)打开这个网址http://localhost:1234/examples/viewer.html即可显示自己的点云图像

显示地图所在位置

img
如果使用自己的点云这个地图一般是没有的,如果想要使用potree自带的地图图标那么你需要更改metadata.json 文件中的
img
官方例子:

    "projection": "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",

上面使用的投影方法可以不用去了解,个人例子:

	"projection": "+proj=somerc +lat_0=你想要的纬度 +lon_0=你想要的经度 +k_0=1 +X_0=0 +y_0=0 +units=m",

这样子就能显示了

场景切换

官方给出了场景切换的html案例(annotations.html)如果看懂了这个文件可自行更改,下面只是一些个人使用案例
先看成品:
img
(这里使用的是自己的场景,还有一些介绍没改,所以有点乱,见谅)

1.找到想要切换场景的地方获取局部坐标位置
img
2.这里可以看到我标注了两个点位,这里简单介绍一下(-8.68,-1.33,-0.90)是我们看向的点之后用来做标记的,就好比上面的Meeting Room这些点,另外一个点(-11.77,0.28,1.41)是摄像机点位,也就是我们从这个点朝着(-8.68,-1.33,-0.90)看
3.更改代码(下面仅有两个标注)

let scene = new Potree.Scene();
		// Load and add point cloud to scene
		Potree.loadPointCloud("../pointclouds/data_converted/metadata.json", "sigeom.sa", e => {
			let scene = viewer.scene;
			let pointcloud = e.pointcloud;

			// scene.view.position.set(590030, 231767, 1007);
			// scene.view.lookAt(new THREE.Vector3(589844, 231376, 710));

			let material = pointcloud.material;
			material.size = 1;
			material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
			material.shape = Potree.PointShape.SQUARE;

			scene.addPointCloud(pointcloud);

			viewer.fitToScreen();
			// scene.view.setView(
			// 	[589974.341, 231698.397, 986.146],
			// 	[589851.587, 231428.213, 715.634],
			// );
			{
				
				{
					let aAbout2 = new Potree.Annotation({
						position: [-1.48,3.25,-0.11],//这里填的是(-8.68,-1.33,-0.90)
						"cameraPosition": [1.76,-1.40,2.32],//这里填的是(-11.77,0.28,1.41)
						"cameraTarget": [-1.48,3.25,-0.11],//这里填的是(-8.68,-1.33,-0.90)
						"title": "Meeting Room",//这里是标注点的名字
						"description": `
                        //这里写的是对这个点的描述
						`
					});
					scene.annotations.add(aAbout2);
				}
               	{
					let aAbout3 = new Potree.Annotation({
						position: [-2.82,-2.68,-0.88],
						"cameraPosition": [-12.7,0.38,0.19],
						"cameraTarget": [-2.82,-2.68,-0.88],
						"title": "corridor",
						"description": `
						`
					});
					scene.annotations.add(aAbout3);
				}
			}

导航栏的改动

这里最终的结果是第一版的demo,主要告诉的是大家哪里改动,因为本人也就三天速成了一下,并不会太多的JavaScript知识,所以见谅。
img

开局自动显示小地图

在potree.js文件中
//before
let imgMapToggle = document.createElement('img');
				imgMapToggle.src = new URL(Potree.resourcePath + '/icons/map_icon.png').href;
				imgMapToggle.style.display = 'none';
				imgMapToggle.id = 'potree_map_toggle';
//after
let imgMapToggle = document.createElement('img');
				imgMapToggle.src = new URL(Potree.resourcePath + '/icons/map_icon.png').href;
				imgMapToggle.style.display = 'none';
				imgMapToggle.onclick = e => { this.toggleMap(); };
				imgMapToggle.id = 'potree_map_toggle';

更改小地图位置

这里主要是小地图位置的更改,代码在protree.js这里,自行ctrl+F查找一下

if ($(domElement).find('#potree_map').length === 0) {
					let potreeMap = $(`
					<div id="potree_map" class="mapBox" style="position: absolute; left: 850px; top: 380px; width: 400px; height: 400px; display: none">
						<div id="potree_map_header" style="position: absolute; width: 100%; height: 25px; top: 0px; background-color: rgba(0,0,0,0.5); z-index: 1000; border-top-left-radius: 3px; border-top-right-radius: 3px;">
						</div>
						<div id="potree_map_content" class="map" style="position: absolute; z-index: 100; top: 25px; width: 100%; height: calc(100% - 25px); border: 2px solid rgba(0,0,0,0.5); box-sizing: border-box;"></div>
					</div>
				`);

导航栏按钮触发(在html文件中改)

我这里介绍的是第一版demo,不是特别好,之后肯定也不是用这个了,所以我就大概介绍一下

按钮设置
<div class="sidebar-cell">
					<button id='1'>appearance
					</button>
				</div>

点击触发
$("#1").click(function () {
			var menu = $("#menu_appearance").next();
			let renderArea2 = $('#potree_sidebar_container')
			let renderArea = $('#potree_render_area');
			let isVisible = renderArea.css('left') !== '0px';
			if (menu.is(":visible") && isVisible) {
				menu.hide();
				//renderArea2.css('left','0px');
				renderArea.css('left', '0px');
				renderArea2.css('left', '0px');

			}
			else {
				menu.show();
				renderArea2.css('left', '23px');

				renderArea.css('left', '323px');
			}        
posted @   NoAcalculia  阅读(957)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示