-1

我正在尝试从一个网格对象向另一个网格对象绘制箭头。但是,如果我直接使用他们的位置并在 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;
4

1 回答 1

0

有一种更简单的方法可以做到这一点。

方法一

  1. 您正在从一个网格表面上的一个点绘制到另一个网格表面上的另一个点。
  2. 你有对象中心的位置,这意味着你也有表面的位置
    • 对象的顶点都以原点(本地中心)为中心
    • 你的对象的中心由你给它的变换矩阵变换。
    • 真正做的是转换所有这些顶点位置。
    • 那个顶点位置(仍然)在表面上,你所要做的就是变换它。

现在,如果您知道要使用哪个顶点,这将起作用,这听起来可能是您提出问题的方式。但是,如果您只想要一个箭头从一个网格指向另一个网格而不让它穿过网格,那么下一个方法可能会更好。

方法二

如果您想要做的只是从一个网格指向另一个网格,并且在曲面上精确地拥有一个点并不重要,那么这是更好的方法。您所做的是计算网格的边界框边界球,并使用它来快速找到如何绘制箭头。

  1. 生成包围体

    一个。当您读取网格的所有顶点时,请跟踪哪个顶点离中心最远。最后,这将为您提供包含网格的球体的半径。

    湾。相反,您可以跟踪 6 个方向 (+-x,y,z) 中每个方向的最大距离以生成边界框。

  2. 计算从包围体表面到另一个表面的线。现在您有一个盒子或一个球体,这应该很容易(尤其是对于球体)。

于 2013-10-19T21:29:08.477 回答