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