2011-12-04 8 views
1

私はrealVecを返す自分で書かれていないデータ構造を使用しています。これは、(typedef.h中)realVecの宣言です:TNTのベクトルの定義についてC++のデータ構造:TNTベクトルからGL vec3への変換

typedef TNT::Vector<PCReal> realVec; 

を参照してください。PCRealのhttp://calicam.sourceforge.net/doxygen/tnt__vector_8h_source.html

定義:

typedef double PCReal; 

を、私はこれを変換する必要があります次のvec3へのrealVec:

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おそらく、TNT :: Vectorのイテレータを使用して、それによって返された値を変換することにあります。私は以下のようなことを考えているので、意味があるかどうか教えてください。 (no「を作る」エラー)をコンパイルするようだ:

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

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

私はGLプログラミングをやっている、と私のシェーダを入力としてvec3年代を取るのが便利なので、私はこれを必要とします。

+0

PCRealとは何ですか?上記の編集は – interjay

+0

です。ダブルのように見えます。 – Rooster

+0

PCRealがdoubleの場合、3つの浮動小数点数を持つstructにどのように変換したいですか?最初のvec3コンストラクタをPCRealでコールしますか? –

答えて

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

関連する問題