Javascript 二次曲面的行进立方体-Three.js

Javascript 二次曲面的行进立方体-Three.js,javascript,3d,three.js,marching-cubes,Javascript,3d,Three.js,Marching Cubes,我曾尝试使用three.js的Marching Cubes库实现一个小程序,显示不同类型的曲面,以渲染隐式曲面。但是出现的形状不正确,我想我没有根据需要实现THREE.marchingCube的属性。小程序的核心有以下代码 quadricData = { a11: 1, a22: 1, a33: 1, a12: 0, a13: 0, a2

我曾尝试使用three.js的Marching Cubes库实现一个小程序,显示不同类型的曲面,以渲染隐式曲面。但是出现的形状不正确,我想我没有根据需要实现THREE.marchingCube的属性。小程序的核心有以下代码

        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变大时,会使椭球扩大而不是缩小;“行进立方体网格”似乎也在扩展,这有点滑稽


许多其他配置与预期结果不匹配。使用三个.marchingcube的正确方法是什么?

使用三个.marchingcube:

通过以下方式包括MarchingCubes.js

分配分辨率为R的体积,该体积将是分辨率为R x R x R的体素立方体,通过V=new THREE.MarchingCubes R,material

填充体素值,体素值是浮点值的线性数组。位置[X,Y,Z]处体素的索引为X+Y*R+Z*R*R。通过V.field[i+j*R+k*R*R]=f设置值

设置隔离值。显示的体积将是小于此值的所有体素,因此这可以称为“iso曲面值”。通过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,那么它似乎无缘无故地将de和F乘以2

否则,在发布问题后,您是否解决了一个bug?或者你能更具体地谈谈这个问题吗


错误报告:有一个错误。截至2018年5月,在three.js版本r92中,Marching Cubes库似乎在Windows和MacOS上的1个Firefox中运行,在MacOS上的2个Safari中运行。Linux上的Firefox和任何系统上的Chrome都有缺陷。关闭平面着色可能会解决此问题。

非常感谢!这很有趣,但我的代码不能正常工作;为了清晰起见,我添加了一个gif。如果您从GitHub下载代码,您会得到正确的结果吗?也许这取决于浏览器或其他什么?在这方面仍然存在错误的结果。至于2个因素,它与来自对称矩阵的系数有关:在Windows 7上的Firefox版本>=59中,结果在我看来是正确的。我在Firefox 60中尝试过,但它不起作用,还清除了浏览数据并处于匿名模式。增加a11使椭球体在x方向上。你能上传一张工作示例的图片吗?非常有趣,没有GIF编辑。除了删除乘法2之外,不要认为代码有任何修改,我同意这不会有什么区别。您看不到演示有任何问题,或者添加了错误报告详细信息。如果你发现任何不准确的地方,请告诉我。