2013-10-01 5 views
1

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

Итак, я сделал свою собственную геометрию, и она выглядит нормально, но raycaster не работает так хорошо с моими собственными объектами, как со встроенными кубами.

var cube = new THREE.Line(getCube(5,5, 5), new THREE.LineDashedMaterial({ color: 0x000000,dashSize: 1, gapSize: 0.1, linewidth: 2 }),THREE.LinePieces); 

где getCube() возвращает

var geometry = new THREE.Geometry() 

Смотрите пример: http://jsfiddle.net/QHjSM/12/

6 цвет заполненную форму на вершине находятся defalt THREE.CubeGeometry коробки, и выбирая их с raycaster работает отлично , 6 wireframe - моя обычная геометрия.

Вопросы: Если вы попытаетесь щелкнуть за пределами поля, но довольно близко к нему, он поймает коробку, и если вы щелкнете внутри коробки (посередине), она не поймает ее ни на одну.

Но самая неприятная вещь заключается в том, что если вы нажмете внутри одной коробки, но рядом с другой, она иногда попадает не в другую.

Я не уверен, что это можно сделать лучше, попробовал все методы geometry.compute ... но все равно никакого эффекта.

ответ

1

Добрый день, ваши кубики не являются кубиками. Это всего лишь стопка строк без сопутствующих лиц. Ваш выбор не возвращается так, как ожидалось, из-за того, что ваши «кубики» действительно имеют пропущенные отверстия, которые их бросают. То, что вы можете сделать, находится в вашей функции getCube после того, как вы построили вершины, вы можете построить все ваши лица аналогичным образом.

Посмотрите на этот пример: Issue with custom geometry and face normal

Вообще вам нужно тщательно шаблон каждые 3 множество вершин так, что, когда вы строите рожи там по часовой стрелке так, что нормаль будет computerd правильно. Вот основной пример добавления лица.

geometry.faces.push(new THREE.Face3(1,2,3)); 

НО, НО! Обратите внимание, что это приведет к тому же вышеупомянутым диагональным линиям через ваш каркас. Таким образом, для вашего случая использования, почему бы просто не использовать как основную кубическую сетку с подбором и удалить каркас, а затем наложить линии, нарисованные как ваш собственный каркас. Лучшее обоих миров.

FYI, вы, вероятно, уже знаете, но Face4 ушел, поэтому для этого вам нужно будет использовать Face3 и какой-то пользовательский каркас.

Редактировать: Я сделал небольшой тест для вашей скрипки, заметил что-то странное. Используя CanvasRender, даже с каркасом от куба по умолчанию вы все равно видите диагональные линии! Я пытаюсь использовать WebGLRenderer, и все в порядке. Мне нужно будет изучить это еще раз.

CanvasRenderer http://jsfiddle.net/QHjSM/13/

WebGLRenderer http://jsfiddle.net/QHjSM/14/

меня снова, хммы оказывается те пунктирные черты лица видны во всех примерах CanvasRenderer, которые используют MeshBasicMaterial на три.js сайт. Единственное, что я смог сделать, это просто уменьшить непрозрачность материала ячейки куба до 0,1, чтобы уменьшить эффект. Я полагаю, что единственный другой способ, чтобы переключиться на WebGLRenderer, но я с нетерпением жду, чтобы быть неправильно на этом :) Вот последний тест

http://jsfiddle.net/QHjSM/16/

+0

Более обходной путь вместо решения реальной проблемы, но это работает, так если я не найду какое-то прямое решение, я буду использовать твое. Спасибо –

+0

Действительно это обходное решение. Я сам был удивлен самим CanvasRenderer. Я предположил, что вы использовали «wireframe: true» в материале, но, к моему удивлению, это было не так. –

+0

А я нашел его, вот поток миграции от r59 до r60, где были удалены квадратики. Вы увидите, что предлагаемое решение - это тот, на который мы наткнулись: https://github.com/mrdoob/three.js/issues/3788 –

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