我尝试使用March.js的Marching Cubes库来实现显示不同类型space quadrics的applet,以呈现隐式曲面。虽然出现的形状不正确,但我想我没有根据需要实现THREE.MarchingCubes
的属性。 applet的核心有以下代码
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);
}
}
}
但可以检查完整代码here。我认为field
属性必须用函数的值填充,但这可能不是正确的方法。例如,当a11
变大时会出现奇怪的效果,这会扩大椭圆体而不是缩小椭圆体;行进的立方体网格&#39;似乎也在扩大,这很有趣。
许多其他配置与预期结果不匹配。哪种方法使用THREE.MarchingCubes
?
答案 0 :(得分:1)
使用THREE.MarchingCubes:
通过<script src="https://threejs.org/examples/js/MarchingCubes.js"></script>
通过V = new THREE.MarchingCubes( R, material )
填写体素值,这是浮点值的线性数组。位置[X,Y,Z]处的体素的索引是(X +(Y * R)+(Z * R * R))。通过V.field[ i + j*R + k*R*R ] = f
设置isolation
值。显示的体积将是小于该值的所有体素,因此这可以全称为等值面。通过V.isolation = s
设置值。
您的代码似乎正常运行。增加a11确实会降低x维度中的音量。
我唯一注意到的是代码将a12
和a13
以及a23
乘以2.如果二次方程式表示为:
Ax ^ 2 + By ^ 2 + Cz ^ 2 + Dxy + Exz + Fyz + Gz + Hy + Iz + J = 0
计算结果为: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
,那么它似乎无缘无故地将D E和F乘以2?
否则,自发布问题以来,您是否已经解决了一个错误?或者你能更具体地解决这个问题吗?
错误报告:bug report 14060 logged against three.js here。截至2018年5月,使用three.js版本r92,看起来Marching Cubes库正在(1)Windows和MacOS中的Firefox,(2)MacOS上的Safari中工作。它在Linux上的Firefox和任何系统上的Chrome中都显得有些麻烦。关闭平面着色可以解决问题。