-4

私が書いている OpenGL コードに奇妙なエラーがあります。テストとして、球のベクトルを作成し、push_back(s1) を使用しています。ベクトルに複数の球を追加しています。ただし、プログラムを実行すると、最後にベクターにプッシュされた球のみが描画されます。

#include "Sphere.h";
#include <iostream>;
#include <vector>;
using namespae std;

vector<Sphere> spheres;
Sphere s1 = Sphere(1.0, "One");
Sphere s2 = Sphere(2.0, "Two");
Sphere s3 = Sphere(3.0, "Three");

void init(void) {
    spheres.push_back(s1);
    spheres.push_back(s2);
    spheres.push_back(s3);

    for each(Sphere s in spheres) {
        cout << s.getName() << "\n";
    }
}

// OTHER CODE OMMITED

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 0.0);
    glPushMatrix();

    for each(Sphere in s) {
        s.draw();
    }

    glPopMatrix();
}

明らかに、すべての GL がセットアップされている主な方法があり、そこに問題がないことはわかっています。

したがって、球には独自の描画方法があります。ここで興味深いのは、コンソールに次のように出力されることです。

Three
Three
Three

s3 を画面に 3 回描画します。

だから私の質問は、なぜベクトルの最後のアイテムを3回しか描画しないのですか? イテレータと通常の for ループも使用してみましたが、すべて同じ結果になります。

誰にもアイデアがありますか?

編集

getName() 関数:

string Sphere::getName() {
    return name;
}

ベクトルの反復子:

vector<Sphere>::iterator it;
void display() {
    for(it = planets.begin(); it != planets.end(); ++it) {
        it->draw();
    }
}

スフィアでコードを描画する:

GLdouble r = 0.0;
GLfloat X = 0.0f;
string name = " ";

Sphere::Sphere(GLdouble ra, GLfloat x, string n)
{
    r = ra;
    X = pos;
    name = n;
}


Sphere::~Sphere(void)
{
}

void Sphere::draw(void) 
{
    glutSolidSphere(r, 10, 8);
    glTranslatef(X, 0.0, 0.0);
}

string Sphere::getName(void)
{
    return name;
}
4

1 に答える 1

5

問題は、クラス メンバー変数ではなく、Sphere.cpp で 3 つのグローバル変数を定義したことです。したがって、コンストラクターが実行されるたびに、以前の値が上書きされ、最後に構築されたオブジェクトのみが表示されます。

解決策は、それらをメンバーとして宣言することです。

Sphere.h の Sphere のクラス定義内に、

class Sphere { 
   // constructors, your current functions, and so on...
  private:
   GLdouble r;
   GLfloat X;
   string name;
}

最後に、このような質問は、問題を示す小さな例を提供することが重要である理由の例です。1 つ目の理由は、問題の原因を特定しやすくなるためです。2 つ目は、コードを小さな部分で調べる必要があることです。問題を切り分ければ、自分で問題を認識できる可能性が高くなります。

于 2013-03-04T15:31:31.863 に答える