Three.js Вращайте объекты внутри движущегося Object3D, чтобы они всегда смотрели в камеру

Я новичок в Threejs, мне просто интересно, как сделать так, чтобы движущаяся сетка всегда была обращена к камере в сцене. У меня есть 100 сеток внутри контейнера Object3D, и я вращаю этот контейнер по осям x и y. Есть ли способ заставить сетки внутри контейнера всегда смотреть в камеру?

Вот пример кода, я также установил jsFiddle на http://jsfiddle.net/nickelWeb/rZtJX/4/

for(var k = 0; k<numMeshes; k++){
     meshes[k].lookAt( camera.position );   
}

Я пробовал просто использовать метод .lookAt (), но, похоже, он не работает. Я знаю, что есть способ сделать это, я просто не знаю, где искать. Любая помощь будет оценена. Спасибо!


person user2205268    schedule 24.03.2013    source источник


Ответы (1)


Object.lookAt() не будет работать правильно, если объект имеет повернутый родительский элемент.

Самое простое решение вашей проблемы - удерживать родительский объект неподвижным и вместо этого вращать камеру вокруг объекта.

Таким образом, Object.lookAt() будет работать должным образом.

Обновленная скрипка: http://jsfiddle.net/rZtJX/5/

three.js r.57

person WestLangley    schedule 24.03.2013
comment
Есть ли способ сделать это, не перемещая камеру? Как какое-то преобразование globalToLocal? - person user2205268; 25.03.2013
comment
Теоретически да, но чувство собственного достоинства изменится. Таким образом, объекты будут смотреть в камеру, но не вверх. Вы можете попробовать THREE.SceneUtils.detach(), затем lookAt(), а затем THREE.SceneUtils.attach() для каждого объекта, но это ужасно неэффективно, и я бы не рекомендовал его. - person WestLangley; 25.03.2013
comment
Хорошо спасибо! Я попробую ваше первое предложение. - person user2205268; 25.03.2013
comment
Я думаю, что решение @WestLangley (detach, lookAt, attach) на самом деле является довольно хорошим решением, особенно если вам не нужно делать это в каждом цикле рендеринга / обновления. Следует иметь в виду одну вещь: вам нужно обновить матрицу объекта перед присоединением, примерно так: 1) отсоединить 2) lookAt 3) updateMatrix 4) прикрепить - person Viktor Benei; 19.09.2013
comment
@ViktorBenei Правильно. three.js r.61 - person WestLangley; 19.09.2013