2015-11-17 22 views
2

我正在嘗試對TextGeometry的邊界框進行光線投射。目前,當點擊不在字母或中間字母之間時,raycasting適用於textGeometry。如果點擊位於文本字母/ aphabets之間,則沒有對象與intersectObjects()相交。當點擊介於字母之間時,我需要raycast與textGeo對象相交。Raycast到TextGeometry的邊界框而不是網格

我定義TextGeometry爲:

var textGeo = new THREE.TextGeometry(text, { 
        size: size, 
        height: 1, 
        font: 'helvetica' 
       }); 

textGeo.computeBoundingBox(); 
var textMaterial = new THREE.MeshBasicMaterial({ color: fontColor }); 
var textMesh = new THREE.Mesh(textGeo, textMaterial); 

尋找解決方案,與boundingBox的會後似乎是最好的辦法。請諮詢或指出如何實現這一目標。任何想法或提示如何做到這一點?或者如果有任何目前可用的方法。

如何使raycast與邊界框相交?

回答

0
  1. 創建幾何的邊界框併爲bbox創建幾何。
  2. 創建一個THREE.Object3D並將邊界添加爲其子(將其命名爲obbox)
  3. 將obbox添加到場景中。

現在,如果您與場景相交,您將首先獲得obbox對象,因爲它將始終接近光線的原點。

+0

這是我想過的東西,但正在尋找不同的方法。當我創建許多Textgeos時,希望避免每個人都有重複對象的開銷。尋找一種可以與現有幾何體配合使用的解決方案,而不必爲每個現有幾何體創建一個新的解決方案。 – avg

+0

你不會創建一個重複的對象,但是對於光線投射來說,這是一個低得多的細節對象。所以它實際上是一個雙贏的局面,因爲您不需要對textgeos(可能會變得相當大)的幾何圖形進行光線投射。你只需要對平行四邊形的六個面進行光線投射。 – gaitat

+0

我也喜歡你的方法,但對於我想要做的場景,我發現上面的方法效果更好。感謝您的回答和意見,非常感謝。 – avg

2

我在Three.js庫本身找到了一個解決方案。他們在一個Mesh的raycast函數中有一個優化部分,該部分查看BoundingBox和BoundingSphere來確定射線是否落在外面以避免檢查相交。我翻轉了我的情況:

var inverseMatrix = new THREE.Matrix4(), ray = new THREE.Ray(); 
//for example textGeo is the textGeometry 
inverseMatrix.getInverse(textGeo.matrixWorld); 
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix); 

if(textGeo.geometry.boundingBox !== null){ 
    if(ray.isIntersectionBox(textGeo.geometry.boundingBox) === true){ 
     //intersected 
    } 
} 
+1

這看起來像是我試圖解決的問題的一個很好的解決方案。你能夠給出一個更全面的例子嗎?或者指向某個地方使用它?謝謝! – bravokiloecho