[英]3D vertices class or struct
我正在编写一个用于学习C ++和3D的小程序。
我已经用有用的方法编写了一个顶点类。 (例如点,叉等)
class cVector {
...
float x, y, z;
...
float dot(cVector& v);
cVector cross(cVector& v);
...
}
现在,我意识到OpenGL期望缓冲区中的元素更像是结构(VBO)。
struct sVector {
float x, y, z;
}
所以我的顶点类不再有用了,因为如果我想操作缓冲区中的数据:
1-我需要提取缓冲区中元素的数据。
2-使用数据创建顶点类的临时实例。
3-使用顶点类方法。 (点,叉等)
4-将数据放回缓冲区。
它不是非常有效的:(。
我想知道是否不应该使用结构来组织我的向量并创建将指向结构的指针作为参数的全局函数。 我可以更有效地处理数据缓冲区(只是移动指针),但是我觉得我会失去C ++的“便捷功能”。
在我见过的每个3D C ++源代码中,所有人都为顶点使用类,但是我不明白它们如何在“类似结构的”缓冲区中操纵大量顶点。
你能帮我理解吗? 最好的方法是什么?
实际上,在像C ++这样的语言中,最常见的方法都不是这些。
struct Vector3 {
union {
struct {
float x,y,z;
};
float v [3];
};
...
Vector3 (float x_, float y_, float z_) : x (x_), y (y_), z (z_) { };
float Norm (void) { return sqrt ((x * x) + (y * y) + (z * z)); }
void Normalize (void) {
float norm = Norm ();
v [0] /= norm;
v [1] /= norm;
v [2] /= norm;
}
};
这样做的原因是因为使用匿名联合和结构,你可以作为float数组处理数据( v [...]
或他们的名字(参考各个组件x
, y
, z
没有很多)混乱或大惊小怪。 通过更明智地使用该语言,您可以两全其美。
至于在这种特殊情况下struct
和class
之间的区别,从内存表示的角度来看,没有区别。 在C ++中, class
和struct
之间的唯一真正区别是默认访问权限。 struct
默认具有公共访问权限。
当GL需要访问对象的内部存储器时,您可以通过向其传递指针: Vector3::v
或各个组件来完成此操作,具体取决于特定的函数。
Vector3 vec (1.0f, 2.0f, 3.0f);
---------------------------------
glVertex3fv (vec.v);
and
glVertex3f (vec.x, vec.y, vec.z);
are equivalent
附带说明一下,匿名结构是C ++的非标准扩展,但几乎在所有地方都受支持。 如果您的编译器不支持它们,则可能必须通过给struct
一个名称来限定对x
, y
和z
的访问。
struct Vector3 {
union {
struct {
float x,y,z;
} s;
float v [3];
};
};
如果您以这种方式编写结构,则:
Vector3 vec;
assert (vec.v [0] == vec.s.x);
必须以这种方式限定x
vec.x
(使用匿名结构可以使用vec.x
)。
struct
和class
之间恰好有一个区别:对于class
,默认范围是private
,而对于struct
它是public
。
所以
class cVector {
...
float x, y, z; // data
...
float dot(cVector& v); // just a function
cVector cross(cVector& v); // just a function
...
}
和
struct sVector {
float x, y, z; // data
}
具有完全相同的内存布局(假设x,y,z
是cVector
的唯一成员变量)。
您可以使用&v.x
获取OpenGL的(x,y,z)
指针,例如glVertex3f(&v.x);
。
您甚至可以执行以下操作来获取指向连续顶点序列的指针,以供OpenGL使用:
std::vector<cVector> vertices(100);
const float* data = &(vertices[0].x);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.