私は Three.js を初めて使用し、時折入ってくるファイルの法線を修復しようとするタスクを割り当てられました。それらが悪いスキャンなのか、おそらく悪いアップロードなのかはわかりません. アップロード機能については検討しておりますが、可能であれば修復を試みたいと考えております。ファイルを修復したり、正しい法線を見つけたりするためのアイデアやヒントを提供できる人はいますか?
以下は、法線を取得するコードとその取得方法です。注: このコードは通常は正常に機能しますが、法線が悪い場合にのみ問題になります。また、ファイルの 1 つを添付して、法線の種類と私が扱っている「不良ファイル」を確認できるようにします。ここでファイルを入手
また、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;
}
}