2011-12-04 23 views
1

我使用的數據結構不是我自己寫的,返回realVec。這是realVec的聲明(中typedef.h):C++數據結構:從TNT向量轉換爲GL vec3

typedef TNT::Vector<PCReal> realVec; 

對於TNT矢量的定義請參閱:http://calicam.sourceforge.net/doxygen/tnt__vector_8h_source.html

PCReal的定義:

typedef double PCReal; 

我需要轉換這realVec加入以下vec3:

struct vec3 { 

GLfloat x; 
GLfloat y; 
GLfloat z; 

// 
// --- Constructors and Destructors --- 
// 

vec3(GLfloat s = GLfloat(0.0)) : 
x(s), y(s), z(s) {} 

vec3(GLfloat _x, GLfloat _y, GLfloat _z) : 
x(_x), y(_y), z(_z) {} 

vec3(const vec3& v) { x = v.x; y = v.y; z = v.z; } 

vec3(const vec2& v, const float f) { x = v.x; y = v.y; z = f; } 
... 

我對C++非常陌生,所以我的conf usion可能在於使用TNT :: Vector的迭代器並轉換它返回的值。我在想下面的東西,所以告訴我它是否合理。這似乎編譯(無「製作」錯誤):

realVec normal = this->meshPoints.getNormalForVertex(i); 
PCReal* iter = normal.begin(); 

vec3(*iter++, *iter++, *iter++); 

我需要這個,因爲我在做GL編程,這是方便我的着色器採取VEC 3的輸入。

+0

什麼是PCReal? – interjay

+0

我上面編輯過。看起來像一個雙。 – Rooster

+0

如果一個PCReal是一個double,你想如何將它轉換成一個帶有3個浮點數的結構?你想用PCReal調用第一個vec3構造函數嗎? –

回答

2

你有什麼可能的工作,但你可以通過一些安全檢查來改善它,你根本不必使用迭代器。看來realVec像大多數其他矢量類一樣提供operator[]

realVec normal = this->meshPoints.getNormalForVertex(i); 
if (normal.size() >= 3) 
{ 
    vec3 x(normal[0], normal[1], normal[2]); 
} 
+0

請參閱我對上述評論的回覆。我會先嚐試我的代碼,除非有人能證明它是錯誤的。那麼我會考慮你的,謝謝。 – Rooster

+0

根據您上面的評論重寫了我的答案。 –

+0

啊,所以我應該能夠使用數組語法訪問realVec組件,而不是使用迭代器。看起來像編譯。這是我現在的答案,如果出現運行時錯誤,我可能會回來。 – Rooster