2015-11-17 16 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