我尝试使用three.js 的Marching Cubes 库实现一个显示不同类型的空间二次曲线的小程序,以呈现隐式表面。虽然出现的形状不正确,我想我没有THREE.MarchingCubes
根据需要实现属性。小程序的核心有以下代码
quadricData = {
a11: 1,
a22: 1,
a33: 1,
a12: 0,
a13: 0,
a23: 0,
a1: 0,
a2: 0,
a3: 0,
a: -1
};
quadValue = function (data, x, y, z) {
return data.a11*x*x+
data.a22*y*y+
data.a33*z*z+
data.a12*2*x*y+
data.a13*2*x*z+
data.a23*2*y*z+
data.a1*x+
data.a2*y+
data.a3*z+
data.a;
}
var res = 50;
var material = new THREE.MeshPhongMaterial( {
color: '#1565C0', // blue 800
transparent: true,
opacity: 0.8,
side: THREE.DoubleSide,
flatShading: true
} );
quadric = new THREE.MarchingCubes( res, material );
quadric.isolation = 0;
for ( var k = 0 ; k < res ; k++ ) {
for ( var j = 0 ; j < res ; j++ ) {
for ( var i = 0 ; i < res ; i++ ) {
var x = 8*(i-res/2)/res;
var y = 8*(j-res/2)/res;
var z = 8*(k-res/2)/res;
quadric.field[ i + j*res + k*res*res ] = quadValue(quadricData,x,y,z);
}
}
}
但完整的代码可以在这里检查。我想field
属性必须用函数的值填充,但也许这不是正确的方法。例如,当a11
变大时会出现奇怪的效果,这会扩大椭圆体而不是缩小它;“行进立方体网格”似乎也在扩展,这有点有趣。
许多其他配置与预期结果不匹配。哪个是正确的使用方法THREE.MarchingCubes
?