spa*_*rum 7 geometry stl smooth mesh three.js
我正在尝试使用Three.js加载一些STL文件.模型正确加载,但有太多的三角形我想合并/平滑.
我已经成功地在其他3D格式中应用了平滑的加载地形,但是我无法使用通过使用STLLoader加载STL文件而导致的BufferGeometry.
var material = new THREE.MeshLambertMaterial( { ... } );
var path = "./models/budah.stl";
var loader = new THREE.STLLoader();
loader.load( path, function ( object ) {
object.computeBoundingBox();
object.computeBoundingSphere();
object.computeFaceNormals();
object.computeVertexNormals();
object.normalizeNormals();
object.center();
// Apply smooth
var modifier = new THREE.SubdivisionModifier( 1);
var smooth = smooth = object.clone();
smooth.mergeVertices();
smooth.computeFaceNormals();
smooth.computeVertexNormals();
modifier.modify( smooth );
scene.add( smooth );
});
Run Code Online (Sandbox Code Playgroud)
这是我试过的,它会抛出一个错误:Uncaught TypeError:smooth.mergeVertices不是一个函数
如果我评论"mergeVertices()"行,我得到的是一个不同的错误:Uncaught TypeError:无法读取 SubdivisionsModifier第156行中未定义的属性'length'.
似乎我尝试的示例代码已经过时(由于Three.JS库中的大量更改,这最近发生了很多).或者也许我忘了什么.事实是顶点似乎是空的..?
提前致谢!
看起来我看错了方向:平滑三角形与SubdivisionsModifier无关......我需要的比这更容易,只需在应用材质之前计算顶点,所以它可以使用SmoothShading而不是FlatShading(我做对了吗?)
这里的问题是STLLoader返回的BufferGeometry没有计算顶点/顶点,所以我不得不手动完成.之后,在computeVertexNormals()和voilà之前应用mergeVertices()!三角形消失了,一切都很平滑:
var material = new THREE.MeshLambertMaterial( { ... } );
var path = "./models/budah.stl";
var loader = new THREE.STLLoader();
loader.load( path, function ( object ) {
object.computeBoundingBox();
object.computeVertexNormals();
object.center();
///////////////////////////////////////////////////////////////
var attrib = object.getAttribute('position');
if(attrib === undefined) {
throw new Error('a given BufferGeometry object must have a position attribute.');
}
var positions = attrib.array;
var vertices = [];
for(var i = 0, n = positions.length; i < n; i += 3) {
var x = positions[i];
var y = positions[i + 1];
var z = positions[i + 2];
vertices.push(new THREE.Vector3(x, y, z));
}
var faces = [];
for(var i = 0, n = vertices.length; i < n; i += 3) {
faces.push(new THREE.Face3(i, i + 1, i + 2));
}
var geometry = new THREE.Geometry();
geometry.vertices = vertices;
geometry.faces = faces;
geometry.computeFaceNormals();
geometry.mergeVertices()
geometry.computeVertexNormals();
///////////////////////////////////////////////////////////////
var mesh = new THREE.Mesh(geometry, material);
scene.add( mesh );
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4165 次 |
最近记录: |