используя версию 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;
Если я выключаю вызов (вдохновленный примером клона), объект загружается более или менее правильно
(еще немного повернут влево, но лучше, чем раньше). Я не математический гуру, может кто-нибудь предложить лучше
параметры по умолчанию, чтобы объект / камеры не вращались при запуске?
Спасибо.
Многие 3D / CAD инструменты будут экспортировать файлы, включая OBJ, с системой координат, отличной от той, которая используется в Minko:
Например, в правосторонней системе координат 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: Попробуйте добавить символ, не клонируя его, посмотрите, имеет ли он какое-либо значение.