Форум

Вращение камеры не через углы Эйлера

26 января 2015 11:51
Всем добра

Есть ли какие-то опции у камеры, чтобы она вращалась не через углы эйлера, а более свободно? Или может какой-то плагин? Или может можно как-то повернуть мир на -90 по иксу и оси b4w и блендера совпадут?
Дело вот в чем: есть простая сцена, в идеале в ней ось Z должна идти вверх (как в блендере). Если в коде поворачивать по иксу на -90 для конвертации осей блендера в b2w оси - то все нормально. Вот только неудобно так работать с кодом, сценой и объектами в браузере. (и вообще - зачем это было сделано? неудобно же).
Так вот, решил попробовать повернуть сцену в блендере и сместить камеру - и тут камера попала в шарнирный замок и невозможно её разместить в наиболее удобном положении ни в блендере ни в браузере. Даже если её как-то направить на сцену - то вид в блендере и в браузере будет различаться - видимо все из-за того же шарнирного замка.
Или таки надо писать свой код для вращения камеры?
26 января 2015 19:56
Привет!

и вообще - зачем это было сделано? неудобно же

Это сделано с целью соответствия стандартам OpenGL, на которых WebGL и основан. На самом деле - это в блендере оси расположены немного непривычно для 3D.
Вот даже есть обсуждение этой уникальности.

Сама поддержка блендеровской системы координат может только приводить к дополнительным сложностям, например, популярная WebGL-библиотека glMatrix, которую мы используем, завязана на стандартной с.к. из Opengl.

В принципе, можно было бы поддержать блендеровские координаты только для внешнего API, а приводить все к стандарту OpenGL уже внутри движка, сделав некую прослойку. Тогда с точки зрения разработчика приложения - все будет как в блендере. Но, я думаю, все-таки большинство разработчиков привыкло работать с системой координат OpenGL, поэтому незачем её менять.

Поэтому повороты в своем приложении будет гораздо удобнее мыслить именно в стандартах OpenGL, т.е. вращение вокруг вертикальной оси - значит вокруг Y.

Или таки надо писать свой код для вращения камеры

Того что есть в движке в принципе достаточно, поэтому свой код писать не нужно, если это только не что-то оригинальное.
Если есть проблемы с конкретной сценой, можете скинуть на почту, посмотрим.
26 января 2015 23:44
Ага, вот оно как значит. А почему бы не сделать кнопочку в блендере, которая вращала бы оси сразу в блендере и в экспортируемой сцене оси уже были бы по стандарту? Или даже как опцию в настройках экспорта.
Того что есть в движке в принципе достаточно, поэтому свой код писать не нужно, если это только не что-то оригинальное.
Если есть проблемы с конкретной сценой, можете скинуть на почту ivan@blend4web.com, посмотрим.
Так я же говорю в чем проблема: камера попадает в шарнирный замок и нужен иной механизм её вращения вокруг сцены. Собственно, это я и спрашивал - видимо надо таки написать свое. Ну да ладно, раз нету - то напишу. Тогда, такой вопрос: а как вращать камеру? И где у объекта находится его матрица? У меня идея такая: конвертировать движение курсора в вектор, сделать проекцию этого вектора на сферу и уже по сфере кватернионом вращать. Ну или как-то так. Надо бы поэкспериментировать.
27 января 2015 11:23
Приветствую.

Вообще, если Z становится Y-ком, это не должно никак сказываться на работе с объектами. Я могу предположить, что в вашем случае несоответствия между Blender и Blend4Web обуславливаются тем, что вы использовали Target-камеру, которая жестко выравнивает свою вертикаль по Y-оси. Можно это проверить, изменив тип камеры например на Eye или Static. Но для точного диагноза, конечно, нужно видеть blend-файл.
27 января 2015 17:57
Камера стандартная, ничего нигде не менялось. Хорошо, попробую. Хмхмх, а где переключить-то?
27 января 2015 18:18
Ответ на сообщение пользователя VoidVolker
Камера стандартная, ничего нигде не менялось. Хорошо, попробую. Хмхмх, а где переключить-то?
Как это описано в документации по камере - в разделе Blend4Web изменяете Move style на нужный вам тип.
27 января 2015 18:56
Ааа, вот оно где. Спасибо! Сменил с таргет на Hover - этот тип камеры двигается, но не вращается. Нашел опции вращения:
Ответ на сообщение пользователя
Blend4Web > Use horizontal rotation
Доступно в режиме Hover при включенной опции Blend4Web > Use distance limits. Разрешить вращение камеры в горизонтальной плоскости относительно опорной точки.
Это конечно здорово, но вот при загрузке сцены в бразуере камера оказывается на оси Z - т.е. почему-то поворачивается на -90 градусов.
Таргет вблизи шарнирного замка в браузере получает лишнее вращение и сцена выглядит под другим углом, нежели в блендере.
В общем, надо делать свое вращение камеры. Я так понимаю, камера - это типа объект и к ней применимы стандартные трасформации объектов? А где у объектов/камры их матрицы? Я заглянул внутрь объектов и увидел там огромное количество параметров и несколько матриц.
28 января 2015 15:07
А вообще, какое поведение камеры требуется? Честно говоря, пока не уверен, стоит ли начинать писать свою модель движения.

Это конечно здорово, но вот при загрузке сцены в бразуере камера оказывается на оси Z - т.е. почему-то поворачивается на -90 градусов.
HOVER-камера слишком специфическая - она реализует обзор с высоты птичьего полета как в стратегиях, поэтому, вряд ли, подойдет.

У меня идея такая: конвертировать движение курсора в вектор, сделать проекцию этого вектора на сферу и уже по сфере кватернионом вращать.
- примерно так и работает TARGET-камера, которая стоит по умолчанию. При этом перемещение мыши слева направо пприведет к вращению вокруг вертикали, т.е. мировой оси Y, а сверху-вниз - вокруг локальной оси X самой камеры, что соответствует углам в сферической системе координат.
Если требуется вращение вокруг определенной точки, то TARGET-камера подходит лучше остальных.

Насколько я понял, вы повернули сцену так, что камера в блендере смотрит на куб снизу вверх, тогда и ось Z для неё будет вертикальной.

Пока непонятно следующее:

Даже если её как-то направить на сцену - то вид в блендере и в браузере будет различаться - видимо все из-за того же шарнирного замка.
и
Таргет вблизи шарнирного замка в браузере получает лишнее вращение и сцена выглядит под другим углом, нежели в блендере.
- без скриншотов или исходного blend-файла трудно сказать, т.е. при старте в приложении камера ориентирована по другому? Для всех камер кроме STATIC происходит выравнивание вертикали, как писал Евгений, это блокирует крен ("roll") камеры, изменение которого не было нужно в этих режимах - не знаю, в этом ли причина.


Теперь по вращениям:
А где у объектов/камры их матрицы? Я заглянул внутрь объектов и увидел там огромное количество параметров и несколько матриц.
- для поворотов используются кватернионы.

API-методы для поворота объектов содержатся в модуле transform.js:
get_rotation()
set_rotation()
set_rotation_v()
Там также можно и через углы Эйлера, но не рекомендуется.

Для работы с векторами, кватернионами и пр. используются модули quat, mat3, vec3, … - это на самом деле доступ к библиотеке glMatrix. Документация по библиотеке: http://glmatrix.net/docs/2.2.0/.
Единственное отличие - несколько изменен вызов методов библиотеки: везде, где первым параметром подается "out" - у нас нужно передавать его последним. Это неочевидное момент, но в ближайшее время мы напишем свою документацию с учетом этого обстоятельства.
29 января 2015 16:29
Насколько я понял, вы повернули сцену так, что камера в блендере смотрит на куб снизу вверх, тогда и ось Z для неё будет вертикальной.
Да, примерно так. Я же на почту кидал линк на сцену. А тут нет системы ЛС?

Теперь по вращениям:

А где у объектов/камры их матрицы? Я заглянул внутрь объектов и увидел там огромное количество параметров и несколько матриц.

- для поворотов используются кватернионы.

API-методы для поворота объектов содержатся в модуле transform.js:
get_rotation()
set_rotation()
set_rotation_v()
Там также можно и через углы Эйлера, но не рекомендуется.
Это-то понятно, это все я уже нашел в документации. Но меня интересует где сама матрица-то?

А вообще, какое поведение камеры требуется? Честно говоря, пока не уверен, стоит ли начинать писать свою модель движения.
Чтобы когда двигаешь в сторону курсором сцену - камера двигалась в соответствующую сторону независимо от текущего положения, а не застревала в шарнирном замке.
29 января 2015 19:53
А тут нет системы ЛС?
Сейчас - нет, может быть, в будущем сделаем.

Это-то понятно, это все я уже нашел в документации. Но меня интересует где сама матрица-то?
Для dev-версии библиотеки мировая матрица на каждом объекте будет здесь: obj._render.world_matrix, но в скомпилированной версии многое подвергается обфускации, поэтому может быть что-то вроде: obj.D.K. Матрицы недоступны через API, т.к. всегда хватало кватернионов. Да и в будущем мы планируем полностью избавиться от необходимости держать матрицы на js.


Чтобы когда двигаешь в сторону курсором сцену - камера двигалась в соответствующую сторону независимо от текущего положения, а не застревала в шарнирном замке.
Всё, я, наконец-то, понял. Шарнирный замок тут не причем - это специфика режима TARGET, а именно: вращение слева направо - это вокруг мировой оси Y. В вашем случае - нужно вращать локально. Действительно, такого режима у нас нет. И вообще, все текущие режимы построены с выравниванием относительно вертикали, т.е. со слежением за up-вектором камеры, иначе её ориентация быстро нарушится, ну т.е. будет как в космосе.

Единственное исключение, которое вам может подойти - STATIC камера. Она с точки зрения внутренней логики движка неподвижна, поэтому её можно как угодно двигать и вращать с помощью API - тут движок препятствовать не будет.

Ну, получается, да - нужно реализовывать самому, используя STATIC-камеру.


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