四边形的行进立方体 - Three.js

时间:2018-05-12 07:57:40

标签: javascript 3d three.js marching-cubes

我尝试使用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;似乎也在扩大,这很有趣。

enter image description here

许多其他配置与预期结果不匹配。哪种方法使用THREE.MarchingCubes

1 个答案:

答案 0 :(得分:1)

使用THREE.MarchingCubes:

  • 通过<script src="https://threejs.org/examples/js/MarchingCubes.js"></script>

  • 添加MarchingCubes.js
  • 通过V = new THREE.MarchingCubes( R, material )

  • 分配分辨率为R的体积,该体积为分辨率为R x R x R的体素立方体
  • 填写体素值,这是浮点值的线性数组。位置[X,Y,Z]处的体素的索引是(X +(Y * R)+(Z * R * R))。通过V.field[ i + j*R + k*R*R ] = f

  • 设置值
  • 设置isolation值。显示的体积将是小于该值的所有体素,因此这可以全称为等值面。通过V.isolation = s设置值。

您的代码似乎正常运行。增加a11确实会降低x维度中的音量。

enter image description here

我唯一注意到的是代码将a12a13以及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中都显得有些麻烦。关闭平面着色可以解决问题。