0

私は 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;
  }
}
4

2 に答える 2

0

VTK にはvtkPolyDataNormalsという名前のフィルターがあり、ファイルに対して実行して法線を計算できます。おそらく、実行する前にConsistencyOn()NonManifoldTraversalOn()、およびを呼び出す必要があります。AutoOrientNormalsOn()

(セルごとの法線の代わりに) ポイント法線が必要で、形状に鋭い角がある場合は、おそらく とSetFeatureAngle()を呼び出して機能角度を提供する必要がありますSplittingOn()

于 2017-07-04T15:41:47.557 に答える