通过 threejs 中的松散部分分离网格
Separate mesh by loose parts in threejs
我在 Blender 中创建了一些基本模型。它是 4 倍细分的立方体(我需要面看起来像正方形),然后面被边分割(在 Blender 中也是如此)。然后我需要在 threejs 中通过松散部分分离最终网格(如果我在 Blender 中这样做,导出的文件太大,比如几 MB 大)。所以每一张脸都变成了单独的一张。
我应该怎么做?
步骤 1(搅拌机)
步骤 2(搅拌机)
在第 2 步之后,每个面都是一个单独的网格。我需要在 ThreeJS 中复制步骤 2。
因此我需要分解球体的面
这是我目前所拥有的
我需要更多面孔才能达到预期效果。一种可能的解决方案是将 2 个球体放在另一个球体中,然后同时“爆炸”它们。但我也需要脸小得多。
我的“爆款”代码很大程度上基于此:https://github.com/akella/ExplodingObjects/blob/0ed8d2668e3fe9913133382bb139c73b9d554494/src/egg.js#L178
下面是演示:
https://tympanus.net/Development/ExplodingObjects/index-heart.html
在你的情况下,我会使用 bufferGeometry。
根据这个展示:https://threejs.org/examples/#webgl_buffergeometry
生成了 16000 个具有法线方向的三角形。
我认为你应该使用 BufferGeometry。
建立在你的codePen之上,
在这里,您会找到一个解决方案,使四边形面(而不是三角形)沿球面定向。
获得沿球体表面铺设的四边形面的核心:
for (let down = 0; down < segmentsDown; ++down) {
const v0 = down / segmentsDown;
const v1 = (down + 1) / segmentsDown;
const lat0 = (v0 - 0.5) * Math.PI;
const lat1 = (v1 - 0.5) * Math.PI;
for (let across = 0; across < segmentsAround; ++across) {
//for each quad we randomize the radius
const radius = radiusOfSphere + Math.random()*1.5*radiusOfSphere;
const u0 = across / segmentsAround;
const u1 = (across + 1) / segmentsAround;
const long0 = u0 * Math.PI * 2;
const long1 = u1 * Math.PI * 2;
//for each quad you have 2 triangles
//first triangle of the quad
//getPoint() returns xyz coord in vector3 array with (latitude longitude radius) input
positions.push(...getPoint(lat0, long0, radius));
positions.push(...getPoint(lat1, long0, radius));
positions.push(...getPoint(lat0, long1, radius));
//second triangle of the quad. Order matter for UV mapping,
positions.push(...getPoint(lat1, long0, radius));
positions.push(...getPoint(lat1, long1, radius));
positions.push(...getPoint(lat0, long1, radius));
}
}
https://codepen.io/mquantin/pen/mdqmwMa
我希望这能帮到你。
我在 Blender 中创建了一些基本模型。它是 4 倍细分的立方体(我需要面看起来像正方形),然后面被边分割(在 Blender 中也是如此)。然后我需要在 threejs 中通过松散部分分离最终网格(如果我在 Blender 中这样做,导出的文件太大,比如几 MB 大)。所以每一张脸都变成了单独的一张。
我应该怎么做?
步骤 1(搅拌机)
步骤 2(搅拌机)
在第 2 步之后,每个面都是一个单独的网格。我需要在 ThreeJS 中复制步骤 2。
因此我需要分解球体的面
这是我目前所拥有的
我需要更多面孔才能达到预期效果。一种可能的解决方案是将 2 个球体放在另一个球体中,然后同时“爆炸”它们。但我也需要脸小得多。
我的“爆款”代码很大程度上基于此:https://github.com/akella/ExplodingObjects/blob/0ed8d2668e3fe9913133382bb139c73b9d554494/src/egg.js#L178
下面是演示: https://tympanus.net/Development/ExplodingObjects/index-heart.html
在你的情况下,我会使用 bufferGeometry。
根据这个展示:https://threejs.org/examples/#webgl_buffergeometry
生成了 16000 个具有法线方向的三角形。
我认为你应该使用 BufferGeometry。
建立在你的codePen之上, 在这里,您会找到一个解决方案,使四边形面(而不是三角形)沿球面定向。
获得沿球体表面铺设的四边形面的核心:
for (let down = 0; down < segmentsDown; ++down) {
const v0 = down / segmentsDown;
const v1 = (down + 1) / segmentsDown;
const lat0 = (v0 - 0.5) * Math.PI;
const lat1 = (v1 - 0.5) * Math.PI;
for (let across = 0; across < segmentsAround; ++across) {
//for each quad we randomize the radius
const radius = radiusOfSphere + Math.random()*1.5*radiusOfSphere;
const u0 = across / segmentsAround;
const u1 = (across + 1) / segmentsAround;
const long0 = u0 * Math.PI * 2;
const long1 = u1 * Math.PI * 2;
//for each quad you have 2 triangles
//first triangle of the quad
//getPoint() returns xyz coord in vector3 array with (latitude longitude radius) input
positions.push(...getPoint(lat0, long0, radius));
positions.push(...getPoint(lat1, long0, radius));
positions.push(...getPoint(lat0, long1, radius));
//second triangle of the quad. Order matter for UV mapping,
positions.push(...getPoint(lat1, long0, radius));
positions.push(...getPoint(lat1, long1, radius));
positions.push(...getPoint(lat0, long1, radius));
}
}
https://codepen.io/mquantin/pen/mdqmwMa
我希望这能帮到你。