Минько - камера и угол поворота

используя minko версии 3.0, я создаю камеру в качестве образцов:

auto camera = scene::Node::create("camera")
->addComponent(Renderer::create(0x000000ff))
->addComponent(Transform::create(
    //test
    Matrix4x4::create()->lookAt(Vector3::zero(), Vector3::create(0.f, 0.f, 3.f))  //ori
    //Matrix4x4::create()->lookAt(Vector3::zero(), Vector3::create(0.f, 0.f, 30.f))
))
->addComponent(PerspectiveCamera::create(canvas->aspectRatio()));

Затем загружаю мой объект, используя аналогичный метод:

RotateMyobj(const char *objName,float rotX, rotY, float rotZ)
{
...
    auto myObjModel = sceneMan->assets()->symbol(objName);
    auto clonedobj = myObjModel->clone(CloneOption::DEEP);
    ...
    clonedobj->component<Transform>()->matrix()->prependRotationX(rotX); //test - ok
    clonedobj->component<Transform>()->matrix()->prependRotationY(rotY);
    clonedobj->component<Transform>()->matrix()->prependRotationZ(rotZ);
...
    //include adding child to rootnode
}

вызов его из полного обратного вызова актива:

auto _ = sceneManager->assets()->loader()->complete()->connect([=](file::Loader::Ptr loader)
{
...
RotateMyobj(0,0,0);
...
}

Obj загружается, но поворачивается «влево» (по сравнению, например, при загрузке в блендере). если я вызываю свой метод с помощью RotateMyobj (0,1.5,0); объект отображается под прямым углом, но я думаю, что в этом нет необходимости.

PS: протестировано со многими obj, все дает одинаковые результаты.

PS2: комментирование / отключение Matrix4x4 :: create () -> lookAt приводит к тому же результату

PS3: не следует ли создавать кулачок с положением 30 (ось Z), как если бы вы смотрели на землю с крыши здания?

Есть идеи, из кода создания камеры или из загружаемого объекта?

Спасибо.

Обновление:

Я нашел источник своей проблемы, она вызвана вызовом этого метода внутри обратного вызова enterFrame: UpdateSceneOnMouse (camera);

void UpdateSceneOnMouse(  std::shared_ptr<scene::Node> &cam ){
yaw += cameraRotationYSpeed;
cameraRotationYSpeed *= 0.9f;

pitch += cameraRotationXSpeed;
cameraRotationXSpeed *= 0.9f;
if (pitch > maxPitch)
{
    pitch = maxPitch;
}
else if (pitch < minPitch)
{
    pitch = minPitch;
}

cam->component<Transform>()->matrix()->lookAt(
        lookAt,
        Vector3::create(
        lookAt->x() + distance * cosf(yaw) * sinf(pitch),
        lookAt->y() + distance * cosf(pitch),
        lookAt->z() + distance * sinf(yaw) * sinf(pitch)
        )
        );}

со следующими параметрами инициализации:

float CallbackManager::yaw = 0.f;

float CallbackManager :: pitch = (float) M_PI * 0.5f;

float CallbackManager :: minPitch = 0.f + 1e-5;

float CallbackManager :: maxPitch = (float) M_PI - 1e-5;

std :: shared_ptr CallbackManager :: lookAt = Vector3 :: create (0.f, .8f, 0.f);

float CallbackManager :: distance = 10.f;

float CallbackManager :: cameraRotationXSpeed ​​= 0.f;

float CallbackManager :: cameraRotationYSpeed ​​= 0.f;

Если я отключу вызов (вдохновленный примером клона), объект загружается более или менее правильно (все еще немного повернут влево, но лучше, чем раньше). Я не гуру математики, может ли кто-нибудь предложить лучшие параметры по умолчанию, чтобы объект / камеры не поворачивались при запуске?

Спасибо.


person Jeux    schedule 06.07.2015    source источник
comment
Я не эксперт и действительно не знаю, что использует математика minko под прикрытием, но у меня были аналогичные проблемы в opengl несколько раз назад. Это всего лишь указатель на то, что вы, возможно, захотите исследовать: знаете ли вы о вращениях кватернионов в отличие от углов Эйлера? Если minko использует углы Эйлера, возможно, вы наткнулись на так называемый карданный замок.   -  person dogiordano    schedule 15.07.2015


Ответы (1)


Многие инструменты 3D / CAD экспортируют файлы, в том числе OBJ, с системой координат, отличной от той, которую использует Минко:

  • Minko 3 beta 2 использует левостороннюю систему координат
  • Minko 3 beta 3 использует правостороннюю систему координат OpenGL.

Например, в правой системе координат x + идет «вправо», y + идет «вверх», а z + идет «за пределы экрана».

Ваше приложение Minko, вероятно, загружает 3D-файлы с помощью библиотеки ASSIMP через плагин Minko / ASSIMP. Если 3D-файл (формат) предоставляет информацию о системе координат, которую он использовал при экспорте, то ASSIMP преобразует координаты в правостороннюю систему. Но стандарт формата файлов OBJ не включает такую ​​информацию.

Решение 1. Попробуйте экспортировать 3D-модели в более универсальном формате, например Collada (* .dae).

Комментирование / отключение Matrix4x4 :: create () -> lookAt () не влияет на ориентацию вашей 3D-модели, потому что для этого нет причин. Изменение положения камеры не влияет на ориентацию сетки. Если вы хотите изменить верхнюю ось камеры, вы должны использовать 3-й параметр метода Matrix4x4 :: lookAt ().

Решение 2. Лучше всего правильно повернуть сетку ** с помощью RotateMyobj(0, PI / 2, 0).

Я также рекомендую использовать ветку dev (Minko beta 3 вместо beta 2), потому что есть некоторые изменения API, особенно по математике, и огромный прирост производительности.

Решение 3. Попробуйте добавить символ, не клонируя его, и посмотрите, не изменится ли он.

person Jean-Marc Le Roux    schedule 07.07.2015
comment
Спасибо за ваш быстрый и подробный ответ, однако в настоящее время я застрял с obj, и да, я использую плагин ASSIMP. ‹Br/› Я не думаю, что проблема кроется в моделях, а в моем коде, как это также происходит с пиратской моделью !? ‹Br/› Решение 2 действительно сработало. PS: Я понимаю, что внешний вид не должен влиять на ориентацию меша, но разве он не должен влиять на вид? Я имею в виду, разве это не должно быть похоже на то, чтобы из одного и того же положения ваш глаз смотрел вниз или вверх? Спасибо - person Jeux; 08.07.2015
comment
Спасибо за обновление, solution3 не сработал, я попытаюсь копнуть глубже в своем коде, чтобы увидеть, в чем реальная проблема ... Что касается камеры, я, похоже, не могу ее переместить, ни при создании (третий параметр lookAt, ни на Обратный вызов завершения загрузки ресурса (с использованием: camera->component<Transform>()->matrix()->appendRotationY(0.5f); , ни в обратном вызове энтерфрейма. Единственный способ переместить его - это выполнить обратный вызов колеса мыши (рыскание, тангаж ...) в соответствии с примером кода Minko. - person Jeux; 11.07.2015
comment
Тогда вы должны опубликовать весь свой код, также попробуйте ветку dev, так как было исправлено множество ошибок. Также пробовали запустить анимацию пиратской модели? Анимированные модели иногда выглядят странно, когда анимация не включена, потому что матрица поз не используется. - person Jean-Marc Le Roux; 11.07.2015