我一直在做很多 vector 数学的事情,并为它写了我自己的模板。
我的要求是很多 vector 数学(加法、减法、缩放、叉积和点积),我还需要能够将我的 vector 作为 float[] 传递,以便 openGL 可以使用它。
用了一段时间挺开心的,今天有个讲师看到了,吐槽一下。他特别讨厌两件事(我理解其中之一),我对继承的使用,因为它似乎不遵循 is a
风格。而我的类型转换 (T*)this
,当然他没有太多的解决方案。
首先: 继承,我需要能够使用 vec2 到 vec4,所以我设计了这样的 vector 。
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() ...
}
为什么会这样?老实说,我看不出如何改进它。我需要(想要)能够定义类型并拥有某种类型的 getter 和 setter。如果我像这样重新排列它
template<typename T, int _size>
VectorT
我会丢失我的 .getX()
、.setX()
东西,必须用 .at()
之类的东西替换它> 或 []
。说实话,我更喜欢 .getX()
的可读性,尽管它会使运算符定义更容易。
第二: 我明白为什么这很糟糕,但为了做到这一点,我可以将这些 vector 传递到 openGL 的方法中,该方法需要一个 float 组,我已经重载了 splat 运算符
// Defined in Vector2D<T>
operator*() { return (T*)this; }
据我了解,无法保证编译器会将成员变量 x、y、z、w 放在类的开头,如果不小心,我可能最终会传递 v 表。但是我必须承认,到目前为止我没有遇到任何问题。
我能看到的解决这个问题的唯一方法是维护一个返回的数组。我想如果我首先改变他们处理 vector 的方式会更容易。
最佳答案
您可能需要考虑使用 GLM反而。它完成了您所描述的所有工作(尽管我发现缺少文档),包括与 OpenGL 的集成。
关于C++ vector 数学和 OpenGL 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5568793/