C++ Vector Math和OpenGL兼容

7 c++ opengl vector

我一直在做很多矢量数学的东西,并为它编写了我自己的模板.

我的要求是很多矢量数学(加法,减法,缩放,交叉刺和点刺)我还需要能够将我的向量作为float []传递,以便openGL可以使用它.

我一直很愉快地使用这个,今天一位讲师看到它并呻吟.有两件事他特别讨厌(其中一件我理解),我对继承的使用,因为它似乎没有遵循一种is a风格.而我的演员(T*)this,当然他没有太多的解决方案.

第一: 继承,我需要能够使用vec2到vec4,所以我设计了这样的矢量.

template<typename T>
Vector2D
{
 public:
 getX(), getY(), setX(), setY() ....
};

template<typename T>
Vector3D : public Vector2D<T>
{
 public:
 getZ(), setZ() ...
}

template<typename T>
Vector4D : public Vector3D<T>
{
 public:
 getW(), setW() ...
}
Run Code Online (Sandbox Code Playgroud)

为什么这么糟糕?和tbh我看不出如何改进它.我需要(想要)能够定义类型并具有某种类型的getter和setter.如果我重新排列它就像

template<typename T, int _size>
VectorT
Run Code Online (Sandbox Code Playgroud)

我会失去我.getX(),.setX()东西,有喜欢的东西来取代它.at()[].tbh我更喜欢它的可读性.getX(),尽管它会使操作符定义更容易.

第二: 我可以看出为什么这很糟糕,但为了实现这一点我可以将这些向量传递给openGL的方法,该方法期望浮点数组我重载了splat运算符

// Defined in Vector2D<T>
operator*() { return (T*)this; }
Run Code Online (Sandbox Code Playgroud)

据我所知,不能保证编译器会将成员变量x,y,z,w放在类的开头,如果不小心,我可能最终会传递v-table.但是我必须承认到目前为止我没有遇到任何问题.

我能看到的唯一方法是维护一个返回的数组.如果我改变他们的方式,我认为这将更容易,我首先处理矢量.

and*_*and 6

您可能需要考虑使用GLM.它完成了你所描述的所有内容(虽然我发现文档缺乏),包括与OpenGL的集成.