2016-04-03 2 views
0

У меня есть объект THREE.Line, который используется для настройки пользовательской сетки. Теперь проблема заключается в том, что при использовании raycast до intersectObjects, когда пользовательская мышь может пройти через эту сетку, intercept будет успешным только в том случае, если пользовательская мышь «пойдет» по любой из линий сетки.IntersectObjects - THREE.Line - Three.js

Пожалуйста вложенное фото: Custom Grid

Так в конце концов, что я пытаюсь сделать это, как может заполнить пространство между линиями с «невидимым» лицом или даже форма, так что, когда пользователи мыши идут по этой сетке, я могу вызвать действие. Вот что я делаю:

var response = this.buildGridGeometry(modelStep,modelSize,gridtype); 
var geometry = response['geometry']; 
geometry.computeBoundingBox(); 
// # Setup the material 
var material = new THREE.LineBasicMaterial({ color: 0x000000, opacity: 0.2 }); 
// # Draw each individual line 
var line = new THREE.Line(geometry, material, THREE.LinePieces); 

Любые предложения?

+0

Два предложения. Как насчет установки свойства raycasters linePrecision на большее значение. Документация определяет это свойство как _ Точный коэффициент raycaster при пересечении объектов Line ._. Возможно, он может заполнить область между линиями. Второе предложение - масштабировать и выровнять PlaneGeometry с сеткой (придать ей одну и ту же матрицу преобразования), а затем сделать ее «.visible = false;». Когда плоскость пересекается, вы знаете, что линия сетки тоже. – micnil

+0

Micnil Мне нравится идея преобразования плоской геометрии. На ваш взгляд, какой вариант лучше? –

+0

Я думаю, что геометрическая плоскость была бы лучше, если бы ваша сетка линий была прямоугольной, но она выглядит более «L». Это означало бы, что вам, вероятно, понадобится два самолета, что сделает его «хакерским» решением. Попытайтесь сначала установить более высокую линейную точность, посмотрите, подходит ли она для ваших нужд. Одним из последствий высокой точности линии может быть то, что сетка будет пересекаться немного за пределами краев. Сетка также пересекла бы, как если бы она имела немного высоты. Надеюсь, вы понимаете, что я имею в виду, иначе просто попробуйте. – micnil

ответ

1

Простейшим решением было бы создать пользовательскую геометрию с той же формой, что и сетка, а затем сделать ее начальное положение, поворот и масштаб соответствовать сетке (если ее еще нет). После этого вы можете добавить пользовательскую геометрию в качестве дочернего элемента в сетку, чтобы она соответствовала. Последний шаг состоит в том, чтобы сделать обычную сетку геометрии невидимой, установив ее свойство .visible = false;.

Теперь вам просто нужно использовать raycaster intersectsObject() на пользовательской сетке геометрии, а когда он пересечет, вы знаете, что сетка также пересекается.

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