2015-11-17 7 views
2

Я пытаюсь raycast to boundingBox в TextGeometry. В настоящее время raycasting работает для textGeometry, когда клик находится на буквах вокруг или между буквами. Если щелчок находится между текстовыми буквами/афаэлями, объект не пересекается с intersectObjects(). Мне нужен raycast, чтобы пересечь объект textGeo, когда щелчок находится между буквами.Raycast to boundingBox 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 и добавьте ограничение в качестве своего дочернего элемента (name the obbox)
  3. Добавить обнуление в сцену.

Теперь, если вы пересекаете сцену, вы сначала получите объект OBbox, потому что он всегда будет ближе к началу луча.

+0

Это то, о чем я думал, но искал другой подход. Поскольку я создаю много Textgeos, я хотел бы избежать накладных расходов на наличие дублирующего объекта для каждого из них. Ищете решение, которое может работать с существующей геометрией, а не создавать новую для каждого. – avg

+0

вы не будете создавать дублирующий объект, а гораздо более низкий уровень детализации, идеально подходящий для raycasting. поэтому на самом деле это беспроигрышная ситуация, потому что вам не нужно раскошеливаться на геометрию textgeos (которая может стать довольно большой). Вам нужно будет только ограбить шесть лиц параллелограмма. – gaitat

+0

Мне тоже нравится ваш подход, но для сценария, который я хотел сделать, я нашел, что подход выше работает лучше. Спасибо за ваш ответ и комментарии, очень ценится. – avg

2

Я нашел решение в самой папке Three.js. У них есть функция оптимизации в функции raycast для Mesh, которая смотрит на 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

 Смежные вопросы

  • Нет связанных вопросов^_^