1

ちょっとした文脈:

個別に選択可能にする必要があるかなり大量のオブジェクト (マージされていない) が取り込まれたシーンがあります。

これらの各オブジェクトは、次の構造を持つ Object3D です。

parent Object3D
|_ child_1
|_ child_2
|_ etc

デフォルトおよび最初のレンダリングでは、child_1s のみが表示されます。

各 child_1 は、クォータニオンがカメラのクォータニオンに設定されている平面ジオメトリであるため、常にカメラに面しています (ビルボードと同様)。

カメラは次のように宣言されます。

camera = new THREE.PerspectiveCamera(
 70,
 WIDTH / HEIGHT,
 0.1,
 10000000
);
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 500000;
camera.lookAt(new THREE.Vector3( 0, 0, 0 ));
scene.add(camera);

そして、各 child_1 は次のようにシーンに挿入されます。

child_1 = new THREE.Mesh(
  new THREE.PlaneGeometry(child_1_scale, child_1_scale),
  new THREE.MeshBasicMaterial({
    map: child_1_texture,
    blending: THREE.AdditiveBlending,
    color: new THREE.Color('rgb('+child_1_data.color.r+','+child_1_data.color.g+','+child_1_data.color.b+')'),
    transparent: true
  })
);

child_1.quaternion = camera.quaternion;
child_1.castShadow = false;
child_1.receiveShadow = false;

parent.add(child_1);

最初のレンダリング フレームではすべてが正常に機能します。次のピッキング関数が機能します。

var pick_object = function(el, coords){

  var mousevector = new THREE.Vector3(
    ( coords.x / $(el).width() ) * 2 - 1,
    -( coords.y / $(el).height() ) * 2 + 1,
    0
  );

  var projector = new THREE.Projector();
  projector.unprojectVector(mousevector, camera);

  var raycaster = new THREE.Raycaster(
    camera.position,
    mousevector.sub(camera.position).normalize()
  );

  var intersects = raycaster.intersectObjects(scene.children, true);

  // one or more hits: we take only the first one that DOES NOT match the ignored entity types for selection (helpers, etc)
  if( intersects.length>0 ){
    for( var i=0, n=intersects.length; i<n; i++ ){
      if (
        picking_ignored_entity_types.indexOf( intersects[i].object.entity_type ) == -1
        && intersects[i].object.visible == true
      ) {
        return intersects[i];
      }
    }
  }

  return null;
};

ただし、(トラックボール) コントロールを使用して次のいずれかを回転させるとすぐに:

  • 最初の lookAt() またはカメラ ([0,0,0])
  • または別の座標セット (オブジェクトの中心など)

その後、ピッキングの動作が悪くなり始めます。

パンした後も、ズームイン/ズームアウトした後も同じことが当てはまります。

私の質問は、ローテーション中またはローテーション後に、どこかでマトリックスを更新する必要がありますか? 何か他のことをしますか?コントロールによって処理される回転/パンに従って、カメラが更新されなかったかのようです。

ここでフィドル:

http://jsfiddle.net/Hal9/TrfpU/

コントロール、ズーム、回転、パンをいじってみると、「青い四角」にカーソルを合わせても赤いヘルパーが表示されないことに気付くと思います。それらのほとんどはそうしますが、すべてではありません。

4

0 に答える 0