C++ Minko-摄像机和旋转角度

C++ Minko-摄像机和旋转角度,c++,linux,camera,rotation,minko,C++,Linux,Camera,Rotation,Minko,使用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)

使用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()));
然后使用类似的方法加载我的obj:

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
}
obj不会加载,但会“向左”旋转(例如,在搅拌机中加载时比较)。 如果我使用RotateMyobj(0,1.5,0)调用我的方法;obj是以正确的角度固定的,但是我认为这不需要

PS:使用多个obj进行测试,结果都相同

PS2:注释/关闭Matrix4x4::create()->lookAt会导致相同的结果

PS3:创建位置为30(Z轴)的cam不应该感觉像从建筑物顶部看地面吗

你知道这是相机创建代码还是obj加载代码吗

Thx

更新

我找到了问题的根源,它是由在enterFrame回调中调用此方法引起的:UpdateSceneOnMouse(camera)

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

浮点回调管理器::cameraRotationXSpeed=0.f

float CallbackManager::CameraRotationSpeed=0.f

如果我关闭调用(受克隆示例的启发),对象的加载或多或少是正确的 (仍然有点向左旋转,但比以前更好)。我不是数学大师,有人能提出更好的建议吗 默认参数使对象/摄影机在启动时不旋转


Thx.

许多3D/CAD工具将导出坐标系不同于Minko所用坐标系的文件(包括OBJ):

  • Minko 3 beta 2使用左手坐标系
  • Minko 3 beta 3使用OpenGL坐标系,它是右手坐标系
例如,在右手坐标系中,x+向右移动,y+向上移动,z+从屏幕向外移动

您的Minko应用程序可能通过Minko/ASSIMP插件使用ASSIMP库加载3D文件。如果三维文件(格式)提供了导出时使用的坐标系的相关信息,则ASSIMP将坐标转换为右手坐标系。但OBJ文件格式标准不包括此类信息

解决方案1:尝试使用更通用的格式(如Collada(*.dae))导出3D模型

注释/关闭Matrix4x4::create()->lookAt()不会影响三维模型的方向,因为它没有理由这样做。更改摄影机的位置没有理由影响网格的方向。如果要更改相机的上轴,必须使用Matrix4x4::lookAt()方法的第三个参数

解决方案2:最好使用
RotateMyobj(0,PI/2,0)
正确旋转网格**

我还建议使用开发分支(Minko beta 3而不是beta 2),因为有一些API更改(尤其是数学方面的更改)和巨大的性能提升


解决方案3:尝试添加符号而不克隆它,看看它是否有任何区别。

感谢您快速而详细的回答,但目前我仍使用obj,是的,我正在使用ASSIMP插件
我认为问题不在于模型,而在于我的代码,就像海盗模型一样
解决方案2确实很难奏效。PS:我知道注视不应该影响网格的方向,但它不应该影响视图吗?我的意思是,它不应该像从你眼睛的同一位置向下或向上看一样吗?ThxThx对于更新,解决方案3不起作用,我将尝试在我的代码中深入挖掘,看看真正的问题是什么。。。至于cam,我似乎无法移动它,无论是在创建时(lookAt的第三个参数,还是在asset load complete回调时(使用:
camera->component()->matrix()->appendRotationY(0.5f);
,还是在enterframe回调时,都无法移动它。移动它的唯一方法是通过鼠标滚轮回调(偏航、俯仰…)根据Minko示例代码。你应该发布你的全部代码,也可以尝试“开发”分支,因为很多错误已经修复。你也尝试过运行海盗模型的动画吗?动画模型有时在没有启用动画时看起来很奇怪,因为没有使用姿势矩阵。我不是专家,也不知道什么是数学ko在封面下使用,但我以前在opengl中遇到过类似的问题。这只是一个你可能想研究的问题的指针:你知道四元数旋转与欧拉角相对吗?如果minko使用欧拉角,你可能会在所谓的“万向节锁”中遇到麻烦
auto _ = sceneManager->assets()->loader()->complete()->connect([=](file::Loader::Ptr loader)
{
...
RotateMyobj(0,0,0);
...
}
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;