在 Opengl Glut 中绘制对象数组

Posted

技术标签:

【中文标题】在 Opengl Glut 中绘制对象数组【英文标题】:Drawing an array of objects in Open GL Glut 【发布时间】:2011-04-14 19:09:11 【问题描述】:

我一直在尝试为我正在制作的游戏绘制多个球,我试图让它工作,但我的 init 类和显示方法类存在问题,我已经评论了错误所在。

球.h:

#pragma once
#include "Vector2f.h"
#include "Vector3f.h"

class Ball

private:
    Vector3f position;
    Vector3f velocity;

public:
    Ball(void);
    ~Ball(void);

    void Draw();
    void SetPos(Vector3f New_position);
    void SetVel(Vector3f New_velocity);
    Vector3f GetPos();
;

球.cpp

#include "Ball.h"
#include "Vector2f.h"
#include "Vector3f.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"


Ball::Ball(void)

    Vector3f Temp_position;
    position = Temp_position;
    Vector3f Temp_velocity;
    velocity = Temp_velocity;



Ball::~Ball(void)



void Ball::SetPos(Vector3f New_position)

    position = New_position;


void Ball::Draw()

    glPushMatrix();
    glTranslatef(position.X(), position.Y(), position.Z());
    glColor3d(1, 0, 0);
    glutSolidSphere(0.3, 50, 50);
    glPopMatrix();


void Ball::SetVel(Vector3f New_velocity)

    velocity = New_velocity;


Vector3f Ball::GetPos()

    Vector3f temp;
    temp = position;
    return temp;

我希望能够在 Main.cpp 中绘制一个球数组

Main.cpp 

#include "Display.h"
#include "Vector3f.h"
#include "Ball.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"
#include <math.h>



static float TableWidth = 4;  // Z axis normal = 4
float Display::eyeX = -7.5; //-7.5
float Display::eyeY = 3; //3
float Display::eyeZ = 5; //5
float Display::Position[4] =  1.0f, 0.0f, -3.5, 1.0f ;
float Display::translateZ = -3.5;
float Display::translateX = 0.0;
//Timer Display::m_Timer = Timer();
float Display::lightX = 5.0; //5 2.5
float Display::lightY = 5.0;
float Display::lightZ = 2.5;


float m_TableX = -5.0f;
float m_TableZ = -2.5f;
float m_TableWidth = 2.5f;
float m_TableLength = 5.0f;

float ballx = 0.7;
float bally = 0.1;
float ballz = -0.7;

Ball Redball;
float BALL_RED_START = 0;
float RADIUS_OF_BALL = 0.3;
float BALL_RED_END = 8;
float m_ball;




void Display::Init(int argc, char ** argv)

    glutInit(&argc, argv); // initializes glut
    // sets display mode. These parameter set RGB colour model
    // and double buffering.
    glutInitWindowSize(500,500);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("Pool Version 1.0");


    // Set glut callback functions
    glutDisplayFunc(Display::DisplayScene);
    glutIdleFunc(Display::Idle);
    glutReshapeFunc(Display::Resize);
    glutKeyboardFunc(Display::KeyboardInput);
    //m_Timer.getSeconds();
    glEnable(GL_DEPTH_TEST);
    glPointSize(5);

        glEnable(GL_NORMALIZE);
        glEnable(GL_LIGHTING);
        glClearColor(0,0,0,1);
        glEnable(GL_COLOR_MATERIAL);


float white[] =  1.0f, 1.0f, 1.0f, 1.0f ;
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);

glEnable(GL_LIGHT0);
Redball.SetPos(Vector3f(0.0,0.3,0.0));

for(int i = BALL_RED_START; i < BALL_RED_START; i++)

  glColor3f(1,0,0);
  Redball[i]->SetPos(Vector3f (i+128,RADIUS_OF_BALL,45));  //I tried this but it doesn't work Error C2227




    // Begin glut main loop
    glutMainLoop();





void BallMovement()

    //Vector3f position(0.0,0.3,0.0);
    /*Redball.SetPos(Vector3f(0.0,0.3,0.0));*/
    Vector3f New_velocity(0.01,0,0);
    Redball.SetVel(New_velocity);

    Vector3f New_position;
    Vector3f Old_position;

    Old_position = Redball.GetPos();

    //New_position = Old_position + New_velocity;

    New_position.SetX(Old_position.X() + New_velocity.X());
    New_position.SetY(Old_position.Y() + New_velocity.Y());
    New_position.SetZ(Old_position.Z() + New_velocity.Z());


    Redball.SetPos(New_position);






void Display::DisplayScene()

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the back buffer


    glPushMatrix();
    glLoadIdentity();
    glNormal3f(0,1,0);
    Vector3f didums = Redball.GetPos();
    gluLookAt(eyeX, eyeY, eyeZ,     // eye position
            0, 0, 0,        // what I'm looking at
            0.0, 1.0, 0); // Up direction

    float Position[] = lightX, lightY, lightZ, 1.0f;
glLightfv(GL_LIGHT0, GL_POSITION, Position);
DrawLight(0, Position);



    /* Rendering code goes here */

for (int i = BALL_RED_START; i<BALL_RED_END;i++)

glColor3f(1,0,0);
Redball[i]->Draw();     //I tried this but it doesn't work Error C2227





drawTable();
drawTableLegFrontLeft();
drawTableLegFrontRight();
drawTableLegBackLeft();
drawTableLegBackRight();
drawCushions();
//drawCircle();
//drawHCircle();
Table(-2,-4.5,2,4.5); // Draws the table top in trianglestrip       -4.5, 0.5, -0.5, 9.5



    glPopMatrix();
    glutSwapBuffers(); // Swap the front and back buffers


void Display::Resize(int w, int h)

    /* Resize is called when window is resized */
    glMatrixMode(GL_PROJECTION); // set matrix mode to profection
    // this dictates how the 3d scene is "squashed" onto the 2d screen
    glLoadIdentity();
    glViewport(0, 0, w, h);  // Set the part of the window to use.
    gluPerspective(45,              // field of view
                (float)w/(float)h,  // ration of window
                1,                  // front clipping plane
                1000                // back clipping plane
                );          // set the area in the 3d scene to draw

    glMatrixMode(GL_MODELVIEW); // Setthe matrix mode to model view
        // the matrix specifies how the 3d scene is viewed
    /*glLoadIdentity();
    gluLookAt(-3.5, 2, eyeZ,        // eye position
            1, 1, 0,        // what I'm looking at
            0.0, 1.0, 0); // Up direction*/





void Display::Idle()

    /* When nothing else is happening, idle is called.
     * Simulation should be done here and then
     * the display method should be called
     */

    BallMovement();

    glutPostRedisplay();

【问题讨论】:

【参考方案1】:

我看到您已将 Ball 声明为 Ball Redball;,这将在堆栈上创建一个 Ball。

然后您尝试将其视为Balls 与Redball[i]-&gt;SetPos(...)Redball[i]-&gt;Draw() 的集合。您似乎正在尝试使用其中的 8 个。

您要做的是创建一个Balls 的数组,最大大小为8(根据BALL_RED_END)。为简单起见,您可以这样做

Ball RedBall[8];
for( //some conditions here )

    RedBall[i].Draw();

作为您的声明和用法。

请记住,任何时候您使用Redball.SetPos(...) 都将不再有效。

【讨论】:

谢谢!这已经使错误变红了,并且编译得很好!现在唯一的问题是我只能看到一个,但那是因为我相信我把它们都画在同一个地方? 没关系!我已经完成了,我在循环中放了一个 gltranslatef 来将球隔开,感谢您的帮助!

以上是关于在 Opengl Glut 中绘制对象数组的主要内容,如果未能解决你的问题,请参考以下文章

VBO:未绘制数组

如何纹理 Opengl glut 对象(C++)

[转]OpenGL 通过VBO实现顶点数组绘制顶点

无法在openGL中绘制对象

无法使用 VAO 和 EBO (openGL) 绘制多个对象

opengl绘制三角形