編集編集:
また、私のモデルはスケーリングされていることにも言及する必要があります。これがintersectsObjectメソッドに影響するかどうかはわかりませんが、(既知の比率を使用して)描画してメートル単位で測定しようとしている線に明らかに影響します。この線は常に正しいサーフェスにマップされるとは限りません。これを修正するにはどうすればよいですか?
明確にするために:
モデルの表面で2つのポイントを選択した後、線を測定し、これをメートル単位で出力する必要があります。ただし、私のモデルを使用すると、モデルのすべてのサーフェス上のすべてのポイントを選択できないように見えます。また、サーフェスの背後にある他のポイントを選択することもあります(もちろんカメラに対して)...
誰かがこれについて何か洞察を持っていますか?厚さがないので、いくつかの表面は平面です-おそらくこれは問題です。
編集:それで私はray.intersectsObjects ..のオーバーロードされたメソッドを呼び出すことによってこれを機能させました:これは以下を使用して呼び出されます:
var intersects = ray.intersectObjects( scene.children, true );
ただし、モデルのすべてのサーフェスで機能するわけではありません。何かアイデアはありますか?
したがって、私はthree.jsを使用してwebGLにロードされた建物のモデルを持っています。具体的には、OBJMTLローダーを使用してロードされています。
従来の方法を使用して、すなわち
var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
// create an array containing all objects in the scene with which the ray intersects
var intersects = ray.intersectObjects( scene.children );
マウスがモデルの上にあるときにオブジェクトを見つけることができず、デバッガーは交差が初期化されていないと言います。
このように建物をロードします
var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
object.position.y = 8;
object.scale.x = object.scale.y = object.scale.z = 8;
scene.add( object );
objects.push(object);
});
loader.load( 'oakley/building.obj', 'oakley/building.mtl' );
ここで、scene.add()呼び出しを確認できます。
それで、私は愚かなことをしていますか、それともこの方法を使用してロードされたモデルの顔の衝突を検出する方法はありませんか?
そうでない場合、回避策はありますか?