javascript - 三.js计算STL文件网格体积
问题描述
我必须计算 STL 文件的体积,我成功地得到了模型的大小
var box = new THREE.Box3().setFromObject( mesh );
var sizes = box.getSize();
但我就是无法理解计算它的概念。我加载模型
var loader = new THREE.STLLoader();
loader.load(stlFileURL, function ( geometry ) {});
有人可以帮助我并指出正确的方向吗?我正在用javascript做。
解决方案
您可以使用我评论中的算法找到它。
在代码片段中,体积是在没有缩放的情况下计算的。
此外,我还添加了一个简单的检查,即算法通过查找空心圆柱体的体积来正确计算。当THREE.STLLoader()
返回一个非索引几何体时,我也将圆柱体的几何体转换为非索引几何体。
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.01, 1000);
camera.position.setScalar(20);
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(0x404040);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var controls = new THREE.OrbitControls(camera, renderer.domElement);
var loader = new THREE.STLLoader();
loader.load('https://threejs.org/examples/models/stl/binary/pr2_head_pan.stl', function(geometry) {
var mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({
color: 0xff00ff,
wireframe: true
}));
mesh.rotation.set(-Math.PI / 2, 0, 0);
mesh.scale.setScalar(100);
scene.add(mesh);
console.log("stl volume is " + getVolume(geometry));
});
// check with known volume:
var hollowCylinderGeom = new THREE.LatheBufferGeometry([
new THREE.Vector2(1, 0),
new THREE.Vector2(2, 0),
new THREE.Vector2(2, 2),
new THREE.Vector2(1, 2),
new THREE.Vector2(1, 0)
], 90).toNonIndexed();
console.log("pre-computed volume of a hollow cylinder (PI * (R^2 - r^2) * h): " + Math.PI * (Math.pow(2, 2) - Math.pow(1, 2)) * 2);
console.log("computed volume of a hollow cylinder: " + getVolume(hollowCylinderGeom));
function getVolume(geometry) {
let position = geometry.attributes.position;
let faces = position.count / 3;
let sum = 0;
let p1 = new THREE.Vector3(),
p2 = new THREE.Vector3(),
p3 = new THREE.Vector3();
for (let i = 0; i < faces; i++) {
p1.fromBufferAttribute(position, i * 3 + 0);
p2.fromBufferAttribute(position, i * 3 + 1);
p3.fromBufferAttribute(position, i * 3 + 2);
sum += signedVolumeOfTriangle(p1, p2, p3);
}
return sum;
}
function signedVolumeOfTriangle(p1, p2, p3) {
return p1.dot(p2.cross(p3)) / 6.0;
}
renderer.setAnimationLoop(() => {
renderer.render(scene, camera);
});
body {
overflow: hidden;
margin: 0;
}
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/loaders/STLLoader.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
推荐阅读
- git - 在 Groovyscript 中修剪来自 git diff 的路径
- javascript - Javascript 对对象值进行排序
- css - Vue在插入之前添加类,离开它
- spring - Spring Batch - FlatFileItemWriter 错误 14416:流已关闭
- docker - 如何在不丢失 docker 数据的情况下更新 prometheus 配置文件
- javascript - 网格中的画布位置不准确
- javascript - 为什么我的产品有这个功能是空的?
- yii2 - 操作重定向()不重置模型过滤器
- python - 使用python在discord上抓取数据
- applescript - Automator + Applescript - 错误“无法将“f”转换为类型别名。” - 文本替换