three.js 中的凸出几何体

3

我正在将一个STL对象加载到我的three.js场景中。

由于渲染/动画需要大量GPU资源,导致整个场景变慢,因此我一直在考虑替代方案。

由于它是一个相当简单的形状,所以我想我可以创建2D形状并将其拉伸。

这个3D形状是一个正方形框架(它是一个相框),没有曲线或任何其他的几何形状。

起初,我考虑创建4个3D长方形,将每一个旋转90度,并将它们放置在场景中恰当的位置,使它看起来像一个框架 - 但这不是理想的。

Here's a 2D shape  (it's perfectly square):

And here's a preview of the STL model

作为一种替代方案,我该如何在three.js中创建这个形状(中央留有空白)并将其挤出以赋予其一定的深度,而不是将STL模型加载到场景中?


尝试将您的模型以不同的格式(如obj、fbx)导出,并在3D建模程序中优化网格。 - FutureCake
你只需要创建一个带有孔的形状,然后挤压它,并在下方添加一个盒子。 - soju
你能发布你的代码吗?一个大约有40个顶点的场景不应该会减慢你的GPU。我认为你可能每帧重新构建几何体,或者类似的事情。 - M -
1个回答

4

基本挤出示例:形状 -> 挤出几何体 -> 网格

const { renderer, scene, camera } = initThree();


//Create a frame shape..
var frame = new THREE.Shape();
frame.moveTo(-4, -3);
frame.lineTo( 4, -3);
frame.lineTo( 4,  3);
frame.lineTo(-4,  3);

//..with a hole:
var hole = new THREE.Path();
hole.moveTo(-3, -2);
hole.lineTo( 3, -2);
hole.lineTo( 3,  2);
hole.lineTo(-3,  2);
frame.holes.push(hole);

//Extrude the shape into a geometry, and create a mesh from it:
var extrudeSettings = {
    steps: 1,
    depth: 1,
    bevelEnabled: false,
};
var geom = new THREE.ExtrudeGeometry(frame, extrudeSettings);
var mesh = new THREE.Mesh(geom, new THREE.MeshPhongMaterial({ color: 0xffaaaa }));


scene.add(mesh);
renderer.render(scene, camera);
body {
    margin: 0;
    overflow: hidden;
}
canvas {
    display: block;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/three.js/102/three.min.js"></script>
<script src="//cdn.rawgit.com/Sphinxxxx/298702f070e34a5df30326cd9943260a/raw/16afc701da1ed8ed267a896907692d8acdce9b7d/init-three.js"></script>


1
太完美了,这正是我一直在寻找的-当你知道方法之后,看起来很容易! - Huskie69
1
使用这种方法会导致一个具有"双面"的实体,即每个面由两个重叠的三角形构成;这使我无法成功地将其导出为可用于3D打印的STL文件:我可以得到STL文件,但我必须手动删除所有的双面。是否有一种方法可以防止使用THREE.ExtrudeGeometry()时产生"三角化"的面? - jumpjack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接