1、通过marching cubes 算法
Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等。
算法主要的思想是在三维离散数据场中通过线性插值来逼近等值面,具体如下:三维离散数据场中每个栅格单元作为一个体素,体素的每个顶点都存在对应的标量值。如果体素顶点上的值大于或等于等值面值,则定义该顶点位于等值面之外,标记为“0”;而如果体素顶点上的值小于等值面值,则定义该顶点位于等值面之内,标记为“1”。由于每个体素单元有8个顶点,那么共存在2^8 = 256种情形,下图是Marching Cubes算法的15种基本情形,其他241种情形可以通过这15种基本情形的旋转、映射等方式实现。
FYI:https://www.cnblogs.com/shushen/p/5542131.html
DEMO:基于Marching Cubes
https://stemkoski.github.io/Three.js/Marching-Cubes.html
https://stemkoski.github.io/Three.js/Metaballs.html
https://stemkoski.github.io/Three.js/Metabubbles.html
2、通过多个模型的交叉并生成新的模型
FYI:
https://github.com/chandlerprall/ThreeCSG
https://stemkoski.github.io/Three.js/CSG.html
用例
var sphere_geometry = new THREE.SphereGeometry( 2, 16, 16 );
var sphere_bsp = new ThreeBSP( sphere_geometry );
var cube_geometry = new THREE.CubeGeometry( 7, .5, 3 );
var cube_bsp = new ThreeBSP( cube_geometry );
var union_bsp = sphere_bsp.union( cube_bsp );
var result = union_bsp.toMesh( new THREE.MeshLambertMaterial({
shading: THREE.SmoothShading,
map: new THREE.TextureLoader().load('texture.png')
}));
result.geometry.computeVertexNormals();
scene.add( result );