2013-10-19 38 views
-1

我想繪製從一個網格對象到另一個網格對象的箭頭。但是,如果我直接使用自己的位置並在箭頭助手中作爲參數發送,則箭頭將進入對象內部,因爲對象的位置意味着它的中心。Isuue繪製從一個網格對象到另一個網格對象的表面的箭頭

所以我創建了對象,我正在使用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]」 爲空。我無法弄清楚原因。任何幫助表示讚賞。 以下是Iam使用的代碼片段。我剛纔也提到了輔助方法:

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; 

回答

0

還有就是做這個簡單的方法。

方法1

  1. 你從一個點開始繪製一個網格的表面上的另一表面上的另一點。
  2. 你有對象中心的位置,這意味着你有表面的位置以及
    • 對象的頂點都以原點(本地中心)爲中心
    • 對象的中心由您給它的轉換矩陣轉換。
    • 這個真的確實是轉換所有這些頂點位置。
    • 頂點位置(仍然)在表面上,所有你需要做的就是改變它。現在

,這個工程如果你知道哪個頂點要使用,這聽起來可能是從你如何問你的問題的情況下。但是,如果您只需要一個箭頭從一個網格指向另一個網格,而不需要戳穿網格,則下一個方法可能會更好。

方法2

如果你想要做的是點從一個網到另一個,並在其表面上的點究竟並不重要,這是更好的方法。你要做的是計算你的網格的包圍盒包圍球並使用它來快速找到如何繪製箭頭。

  1. 生成界體積

    一個。當你讀入網格的所有頂點時,要跟蹤哪一個離中心最遠。最後,這會給你包含網格的球體的半徑。

    b。您可以改爲跟蹤6個方向(+ -x,y,z)中的每個方向的最大距離以生成邊界框。

  2. 計算從包圍體表面到另一個表面的直線。既然你有一個盒子或一個球體,這應該是非常容易的(特別是球體)。

+0

我已經使用了邊界框,並計算了它的最近頂點。它的工作原理!謝謝:) –

+0

我正在使用object1和object2之間的箭頭助手繪製一個箭頭。我添加了聽衆,這樣當物體移動時,箭頭的長度也會根據物體之間的距離和位置的變化而變化。但是這裏的問題是箭頭中的錐體也隨着箭頭的長度而增加。是否有辦法獲得固定的錐體大小而不考慮箭頭的大小? –

+0

@RevanthAlampally您應該將其作爲一個新問題發佈。評論不是一個很好的答案。 – GraphicsMuncher

相關問題