-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 三遍。

所以我的问题是:为什么它只绘制向量中的最后一项三遍?我也尝试过使用迭代器和普通的 for 循环,但它们都产生相同的结果。

有人有想法吗?

编辑

getName() 函数:

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

向量的迭代器:

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

在 Sphere 中绘制代码:

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;
}

最后,像这样的问题是一个例子,说明为什么提供一个演示问题的小例子很重要。第一个原因是它使我们更容易确定问题的根源。第二个是它使您可以小部分检查代码。一旦你隔离了问题,你就更有可能自己识别问题。

于 2013-03-04T15:31:31.863 回答