potree
potree
经过PotreeConverter的处理,可以把点云数据转换成bin、las、laz三种格式的二进制文件,然后我们就可以将这些文件加载至网页进行显示;
如何判断八叉树的子节点的visible是true还是false?
potree内部总共有四个机制进行判断,首先从整个Potree的window.requestAnimationFrame() 开始分析;
Potree.Viewer.loop函数的内部可以看到,调用了Potree.Viewer.update(),Potree.Viewer.update函数内部调用Potree.updatePointClouds()函数
接下来,我们根据源代码进行分析:
updateVisibilityStructures函数里面调用 let priorityQueue = new BinaryHeap(function(x){return 1 / x.weight;}); 是为了控制八叉树节点的加载顺序,根据weight的大小,weight越大优先级越高;
计算视椎体与该node的boundingBox之间的关系,如果box在frustum内返回true,否则返回false
let insideFrustum = frustum.intersectsBox(box);
最大显示八叉树的深度
let maxLevel = || Infinity;
获取该node的深度
let level = node.getLevel();
如果node在视椎体内,visible为ture,否则为false
let visible = insideFrustum;
如果已经显示的节点的所有点数目加上该node的点数目之和大于Potree设置的点数目边界值,visible为false,否则为true
visible = visible && !(numVisiblePoints node.getumPoints() > Potree.pointBudget);
如果该node的level大于Potree设置的maxLevel,visible为false,否则为true
visible = visible && level < maxLevel;
如果已有的点数与该node的点数之和大于Potree的点数上限,该循环直接跳出
if(numVisiblePoints node.getumPoints() > Potree.pointBudget){
break;
}
如果visible为false,则判断下一个node
if(!visible){
continue;
}
如果该node的visible为true,则对其子节点进行判断
获得子节点并进行循环
let child = children[i];
计算子节点的包围球
let sphere = child.getBoundingSphere();
计算相机与包围球心之间的距离
let distance = distanceTo(camObjPos);
let radius = sphere.radius;
将相机的视角从角度变成弧度
let fov = (camera.fov * Math.PI) / 180;
计算相机视角一半的倾斜度
let slope = (fov / 2);
计算像素在屏幕范围内,与距离之间的系数
let projFactor = (0.5 * renderer.) / (slope * distance);
计算包围球的半径在屏幕内实际的像素大小
let screenPixelRadius = radius * projFactor;
如果该子节点的包围球的半径在屏幕范围内的像素尺寸小于预先设置的minimumodePixelSize,那么该子节点不显示
if(screenPixelRadius < ){
continue;
}
以上这些就是判断一个八叉树的节点是否显示的所有因素;
转载于:.html
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
下一篇:方法编辑短信回复标记删除内嵌键盘
推荐阅读
留言与评论(共有 9 条评论) |
本站网友 泗泾二手房出售 | 18分钟前 发表 |
las | |
本站网友 商品价格查询 | 29分钟前 发表 |
potree 经过PotreeConverter的处理,可以把点云数据转换成bin | |
本站网友 白癜风患者 | 23分钟前 发表 |
las | |
本站网友 张丽玲 | 28分钟前 发表 |
las | |
本站网友 寝室设计 | 29分钟前 发表 |
las | |
本站网友 365t | 20分钟前 发表 |
.html | |
本站网友 香港找工作 | 2分钟前 发表 |
potree 经过PotreeConverter的处理,可以把点云数据转换成bin | |
本站网友 中国人寿保险股份有限公司上海市分公司 | 18分钟前 发表 |
laz三种格式的二进制文件,然后我们就可以将这些文件加载至网页进行显示; 如何判断八叉树的子节点的visible是true还是false? potree内部总共有四个机制进行判断,首先从整个Potree的window.requestAnimationFrame() 开始分析; Potree.Viewer.loop函数的内部可以看到,调用了Potree.Viewer.update(),Potree.Viewer.update函数内部调用Potree.updatePointClouds()函数 接下来,我们根据源代码进行分析: updateVisibilityStructures函数里面调用 let priorityQueue = new BinaryHeap(function(x){return 1 / x.weight;}); 是为了控制八叉树节点的加载顺序,根据weight的大小,weight越大优先级越高; 计算视椎体与该node的boundingBox之间的关系,如果box在frustum内返回true,否则返回false let insideFrustum = frustum.intersectsBox(box); 最大显示八叉树的深度let maxLevel = || Infinity; 获取该node的深度let level = node.getLevel(); 如果node在视椎体内,visible为ture,否则为falselet visible = insideFrustum; 如果已经显示的节点的所有点数目加上该node的点数目之和大于Potree设置的点数目边界值,visible为false,否则为truevisible = visible && !(numVisiblePoints node.getumPoints() > Potree.pointBudget); 如果该node的level大于Potree设置的maxLevel,visible为false,否则为truevisible = visible && level < maxLevel; 如果已有的点数与该node的点数之和大于Potree的点数上限,该循环直接跳出 if(numVisiblePoints node.getumPoints() > Potree.pointBudget){ break; } 如果visible为false,则判断下一个node if(!visible){ continue; } 如果该node的visible为true,则对其子节点进行判断 获得子节点并进行循环 let child = children[i]; 计算子节点的包围球 let sphere = child.getBoundingSphere(); 计算相机与包围球心之间的距离 let distance = distanceTo(camObjPos); let radius = sphere.radius; 将相机的视角从角度变成弧度 let fov = (camera.fov * Math.PI) / 180; 计算相机视角一半的倾斜度 let slope = (fov / 2); 计算像素在屏幕范围内,与距离之间的系数 let projFactor = (0.5 * renderer.) / (slope * distance); 计算包围球的半径在屏幕内实际的像素大小 let screenPixelRadius = radius * projFactor; 如果该子节点的包围球的半径在屏幕范围内的像素尺寸小于预先设置的minimumodePixelSize,那么该子节点不显示 if(screenPixelRadius < ){ continue; } 以上这些就是判断一个八叉树的节点是否显示的所有因素; 转载于 |