C++ Minko-摄像机和旋转角度
使用minko 3.0版,我创建了一个摄像头作为示例: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)
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坐标系,它是右手坐标系
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;