Javascript 二次曲面的行进立方体-Three.js
我曾尝试使用three.js的Marching Cubes库实现一个小程序,显示不同类型的曲面,以渲染隐式曲面。但是出现的形状不正确,我想我没有根据需要实现THREE.marchingCube的属性。小程序的核心有以下代码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
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之外,不要认为代码有任何修改,我同意这不会有什么区别。您看不到演示有任何问题,或者添加了错误报告详细信息。如果你发现任何不准确的地方,请告诉我。