[英]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.