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

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

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);
...
}

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

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

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

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

Любая идея, если это из кода создания камеры или загрузки OBJ?

Спасибо.

Обновление:

Я нашел источник моей проблемы, это вызвано вызовом этого метода внутри обратного вызова 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;

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

Спасибо.

1 ответ

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

  • Минко 3 бета 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-модели, потому что для этого нет никаких оснований. Изменение положения камеры не имеет причин влиять на ориентацию сетки. Если вы хотите изменить верхнюю ось камеры, вы должны использовать третий параметр метода Matrix4x4::lookAt().

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

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

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

Другие вопросы по тегам