C++ vector 数学和 OpenGL 兼容

标签 c++ opengl vector

我一直在做很多 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/

相关文章:

c++ - 接受所有数据类型的不区分大小写的 C++ 排序?

C++:通过二维数组中的重载数组下标运算符访问

c++ - 无法重定向程序的控制台输出

c++ - 直接调用事件处理器

c# - OpenTK - 如何按给定角度旋转对象

java - jogl 列出所有图形设备

vector - 将多个向量连接成一个新向量的最佳方法是什么?

c++ - ROOT 和 libbz2 的问题

c++ - gpu 蒙皮的矩阵计算

c++ - 如何在 C++ 类中定义 vector <ifstream>