我正在尝试从一个网格对象向另一个网格对象绘制箭头。但是,如果我直接使用他们的位置并在 Arrow Helper 中作为参数发送,那么箭头将进入对象内部,因为对象的位置意味着它的中心。
所以我创建了对象,我正在使用 raycaster。
var ray = new THREE.Raycaster(sourcePos, direction.clone().normalize());
所以这里的原点是源对象的位置,方向是源到目标的方向。然后我在与目标相交时获取碰撞结果,即
var collisionResults = ray.intersectObject(target);
然后我计算光线第一次与目标相交的距离:
var length=collisionResults[0].distance;
然后,使用以下参数创建一个箭头:
var arrow = new THREE.ArrowHelper(direction.clone().normalize(), sourcePos, length, 0xaa0000);
scene.add( arrow );
箭头正在按预期创建:
helper_methods.draw_arrow(mesh1,mesh2);
helper_methods.draw_arrow(mesh1,mesh2);
但对于 :
helper_methods.draw_arrow(mesh2,mesh3);
它说“collisionResults[0]”为空。我无法弄清楚原因。任何帮助表示赞赏。下面是我正在使用的代码片段。我还提到了辅助方法:
var mesh1 = helper_methods.create_mesh();
mesh1.position.set(100,0,0);
scene.add( mesh1);
var mesh2 = helper_methods.create_mesh();
mesh2.position.set(300,0,0);
scene.add( mesh2);
var mesh3 = helper_methods.create_mesh();
mesh3.position.set(100,200,0);
scene.add( mesh3);
helper_methods.draw_arrow(mesh1,mesh2);
helper_methods.draw_arrow(mesh1,mesh2);
helper_methods.draw_arrow(mesh2,mesh3);
以及我正在使用的辅助方法:
create_mesh: function(){
var darkMaterial = new THREE.MeshBasicMaterial( { color: 0xffffcc } );
var geometry=new THREE.CylinderGeometry( 30, 30, 50,100,1 );
var mesh = new THREE.Mesh( geometry, darkMaterial );
return mesh;
},
draw_arrow: function(source,target){
var sourcePos = new THREE.Vector3(source.position.x, source.position.y, source.position.z);
var targetPos = new THREE.Vector3(target.position.x, target.position.y, target.position.z);
var direction = new THREE.Vector3().subVectors(targetPos, sourcePos);
var ray = new THREE.Raycaster(sourcePos, direction.clone().normalize());
var collisionResults = ray.intersectObject(target);
var length=collisionResults[0].distance;
var arrow = new THREE.ArrowHelper(direction.clone().normalize(), sourcePos, length, 0xaa0000);
scene.add( arrow );
return arrow;