小编ste*_*164的帖子

四元数 - >欧拉角 - >旋转矩阵故障(GLM)

我正在编写一个程序来加载包含场景描述的文件,然后使用OpenGL显示它.我正在使用GLM进行所有数学运算.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧拉角的形式对物体进行旋转,然后在绘制时将这些角度转换为旋转矩阵.

因此,我的加载过程采用四元数旋转,将它们转换为欧拉角以存储在我的对象类中,然后将这些欧拉角转换为旋转矩阵以进行绘制.我正在使用glm :: eulerAngles和glm :: eulerAngleYXZ函数来执行这两个操作.

但是,我的结果不正确.例如,如果我理解正确,四元数{0.500 -0.500 0.500 0.500}(即WXYZ)应该描述从+ Z轴到+ Y轴的箭头旋转.但是,当我运行程序时,我得到的箭头指向+ X轴.

我认为我对四元数的理解存在一些缺陷,但我可以跳过中间的欧拉角形式来得到我预期的结果.通过使用glm :: toMat4将四元数直接转换为旋转矩阵,我得到一个将我的+ Z箭头指向+ Y的旋转.

考虑到两种方法看起来既简单又正确,我无法协调这两种不同的输出.为了简化我的问题,为什么这两个看似等效的方法会产生不同的结果:

glm::quat q(.5, -.5, .5, .5);
glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f; // eulerAngleYXZ takes radians but eulerAngles returns degrees
glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);
// transform1 rotates a +Z arrow so that it points at +X

glm::quat q(.5, -.5, .5, .5);
glm::mat4 transform2 = glm::toMat4(q);
// transform2 rotates a +Z arrow so that it points at +Y
Run Code Online (Sandbox Code Playgroud)

c++ math quaternions euler-angles glm-math

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

将std :: unique_ptr <void>与自定义删除器一起用作智能空白*

我有一个泛型类myClass,有时需要根据用途存储额外的状态信息.这通常用a完成void*,但我想知道我是否可以使用一个,std::unique_ptr<void, void(*)(void*)>以便在类实例被破坏时自动释放内存.问题是我需要使用自定义删除器,因为删除void*会导致未定义的行为.

有没有办法默认构造一个std::unique_ptr<void, void(*)(void*)>,所以我没有先用虚拟删除器构造它,然后在我使用void*状态结构时设置一个真正的删除器?或者是否有更好的方法将状态信息存储在类中?

以下是一些示例代码:

void dummy_deleter(void*) { }

class myClass
{
public:
    myClass() : m_extraData(nullptr, &dummy_deleter) { }
    // Other functions and members
private:
    std::unique_ptr<void, void(*)(void*)> m_extraData;
};
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr c++11

10
推荐指数
1
解决办法
5149
查看次数

禁止在继承的类中定义复制构造函数

我想使一个抽象基类不可复制,并强制从它派生的任何类是不可复制的.下面的代码使用Boost的不可复制中定义noncopyable.hpp但仍然允许d,派生类,定义一个拷贝构造函数.

class noncopyable
{
    protected:
        noncopyable() {}
        ~noncopyable() {}
    private:  // emphasize the following members are private
        noncopyable( const noncopyable& );
        const noncopyable& operator=( const noncopyable& );
};

class D : noncopyable
{
    public:
        D() { }
        D(const D&) { }
};

int main()
{
    D a;
    D b(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译并运行(http://ideone.com/g4gGLm),当我预计它会抛出关于D的复制构造函数的编译时错误.也许我误解了这个不可复制的课程的意图.如果是这样,有没有办法强制派生类不定义复制构造函数?(答案可以使用C++ 11,但最好不要提升)

c++ copy-constructor noncopyable

10
推荐指数
2
解决办法
2272
查看次数

std :: array不完整类型错误,数组为std :: tuple

我用C++ 11得到了一些奇怪的行为std::array.当我尝试std::array<std::tuple<int, float>, 6> myTuples;使用成员变量进行编译时,我收到以下错误:

mingw32\4.7.2\include\c++\array:-1: In instantiation of 'struct std::array<std::tuple<int, float>, 6u>':
mingw32\4.7.2\include\c++\array:77: error: 'std::array<_Tp, _Nm>::_M_instance' has incomplete type

我不确定是否有任何改变,但它所在的类是从另一个模板类派生的模板类.模板参数是一个unsigned int确定std::array基类中受保护的大小,我在派生类中引用它using Base<param>::m_array;.派生类有glm::vec3/dmat4/quat各种类型,并使用OpenGL固定函数glBegin(GL_QUADS);.我正在使用SDL-1.2.15来创建OpenGL上下文.我认为大部分内容都是无关紧要的,但也许不是.我可以粘贴代码,但所有内容都是互连的,所以它只能作为一个整体编译(在源之间分配大约一千行左右).

但是,当我在这个ideone示例中包含相同的行时,在非常相似的情况下,它编译完全正常.我通过命令行编译我的编译器,检查它不仅仅是我的编译器(MinGW g ++版本4.7.2)g++ -Wall -std=c++11

有谁知道为什么我会得到这些错误?在解析std::array赋值(使用array = {{a,b,c}};默认参数)时编译器崩溃之前我遇到了一些问题,但这次编译器错误没有崩溃.

c++ c++11 glm-math

8
推荐指数
1
解决办法
8702
查看次数

使用四元数的OpenGL立方体旋转

我一直在尝试使用在SDL全屏窗口中运行的OpenGL来旋转立方体.我成功地完成了这项工作glRotatef(),但是我经历了"万向节锁定"以及与欧拉角相关的其他问题.想要改进我的程序,我研究了四元数.我编写了一个四元数类,下面上的指示该页面,并试图用它来转动我的隔间glMultMatrixf(),但与不是90度的多角度各地超过1轴旋转时,立方体被扭曲.我检查了我的四元数到矩阵转换和我的四元数乘法代码,但我找不到任何错误.

这是问题的照片: 在此输入图像描述

这是显示这些立方体的完整程序(需要SDL和OpenGL)

//==============================================================================
#include <cmath>

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

namespace game_lib
{
    struct vec3
    {
        vec3() : x(0), y(0), z(0) { }
        vec3(float x, float y, float z) : x(x), y(y), z(z) { }

        vec3 normalize();
        inline float lenSqr() { return x*x + y*y + z*z; }
        float len();

        inline vec3 operator+(vec3 v) { v.x += x; v.y += y; v.z += z; return v; }
        inline vec3 operator-(vec3 v) { …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rotation quaternions sdl-opengl

3
推荐指数
1
解决办法
4034
查看次数