我是 Three.js 的新手,并被分配了尝试修复偶尔出现的看起来很糟糕的文件的法线的任务。我们不知道它们是否是错误的扫描或可能是错误的上传。我们正在研究上传功能,但如果可能的话也想尝试修复它们。谁能提供任何想法或提示来修复文件或找到正确的法线?
下面是我们获取法线以及如何获取它们的代码。注意:此代码通常可以正常工作,只有当法线不好时才会出现问题。我还附上了其中一个文件,这样您就可以看到我正在处理的法线类型和“坏文件”。在此处获取文件
我们还在后端使用 C++ 使用 VTK,因此使用其中任何一个的解决方案或想法都会很有帮助。
my.geometry = geometry;
var front = new THREE.MeshPhongMaterial(
{color: 0xe2e4dc, shininess: 50, side: THREE.DoubleSide});
var mesh = [new THREE.Mesh(geometry, front)];
my.scene.add(mesh[0]);
my.objects.push(mesh[0]);
var rc = new THREE.Raycaster();
var modelData = {'objects': [mesh[0].id], 'id': mesh[0].id};
var normalFound = false;
for (var dy = 80; dy >= -80; dy = dy - 10) {
console.log('finding a normal on', 0, dy, -200);
rc.set(new THREE.Vector3(0, dy, -200), new THREE.Vector3(0, 0, 1));
var hit = rc.intersectObjects([mesh[0]]);
if (hit.length) {
my.normal = hit[0].face.normal.normalize();
console.log('normal', my.normal.z);
modelData['normal'] = my.normal;
if ((my.normal.z > 0.9 && my.normal.z < 1.1)) {
my.requireOrienteering = true;
modelData['arch'] = 'lower';
normalFound = true;
console.log('we have a lower arch');
} else if ((my.normal.z < -0.9 && my.normal.z > -1.1)) {
modelData['arch'] = 'upper';
normalFound = true;
console.log('we have an upper arch');
}
break;
}
}