相关疑难解决方法(0)

C/C++中的四元数库

在C/C++中进行四元数计算的任何好的库?

旁注:任何好的教程/示例?我已经谷歌了,并且去了前几页,但也许你有一些来自compsci或数学课程的演示/实验室你可以/将分享?

谢谢

c++ math quaternions

25
推荐指数
4
解决办法
3万
查看次数

使用四元数进行OpenGL旋转

所以我正在编写一个程序,其中对象围绕着spaceim风格移动,以便学习如何在3D空间中平滑地移动物体.在稍微弄清楚欧拉角度之后,看起来它们并不适合任意方向的自由形式3D运动,所以我决定继续寻找最适合这项工作的东西 - 四元数.我打算让对象始终围绕其局部XYZ轴旋转,而不是围绕全局XYZ轴旋转.

我试图使用四元数实现旋转系统,但有些东西不起作用.沿单轴旋转物体时,如果没有进行先前的旋转,则物体沿给定轴旋转精细.但是,当执行一个接一个的旋转后,第二个旋转并不总是沿着它应该旋转的局部轴 - 例如,绕Z轴旋转约90°后,围绕Y轴旋转仍然发生在全局Y轴周围,而不是与全局X轴对齐的新的局部Y轴.

呵呵.让我们一步一步来看看.错误必须在某处.

第1步 - 捕获输入

我认为最好使用Euler角度(或Pitch-Yaw-Roll方案)来捕捉玩家输入.此时,箭头键控制俯仰和偏航,而Q和E控制滚动.我捕获了播放器输入(我正在使用SFML 1.6):

    ///SPEEDS
    float ForwardSpeed = 0.05;
    float TurnSpeed = 0.5;

    //Rotation
    sf::Vector3<float> Rotation;
    Rotation.x = 0;
    Rotation.y = 0;
    Rotation.z = 0;
    //PITCH
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Up) == true)
    {
        Rotation.x -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Down) == true)
    {
        Rotation.x += TurnSpeed;
    }
    //YAW
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Left) == true)
    {
        Rotation.y -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Right) == true)
    {
        Rotation.y += TurnSpeed;
    }
    //ROLL
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Q) == true)
    {
        Rotation.z -= TurnSpeed; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d quaternions sfml

18
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×2

quaternions ×2

3d ×1

math ×1

opengl ×1

sfml ×1