我正在编写一个程序来加载包含场景描述的文件,然后使用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) 我有一个泛型类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) 我想使一个抽象基类不可复制,并强制从它派生的任何类是不可复制的.下面的代码使用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++ 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}};默认参数)时编译器崩溃之前我遇到了一些问题,但这次编译器错误没有崩溃.
我一直在尝试使用在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++ ×5
c++11 ×2
glm-math ×2
quaternions ×2
euler-angles ×1
math ×1
noncopyable ×1
opengl ×1
rotation ×1
sdl-opengl ×1
unique-ptr ×1