Sign in to follow this  
yaazz

OpenGL Learning openGL, stupid problems

Recommended Posts

I am attempting to learn openGL, and I am trying to create a square that can move around the window. When I attempt to translate the square, it disapears, can someone tell me what I am doing wrong? Written in C++ on Ubuntu Linux test.cpp
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <time.h>
#include "tile.h"

 clock_t clk;
tile block[3][3];	


void polygon(int X, int Y, int W, int H)
{
	/* draw a polygon from a list of vetices */ 
	
	
	printf("%d %d %d %d \n", X, Y, X+W, Y+H);
	glBegin(GL_POINTS);
	glColor3f(1.0,0.0,0.0);
	glVertex2d(X,Y);
	glVertex2d(X+W,Y);
	glVertex2d(X+W,Y+H);
	glVertex2d(X,Y+H);
	glEnd();
	
}

void createObjects()
{
	/* map vertices to faces */
	polygon(block[0][0].getX(),block[0][0].getY(),block[0][0].getWidth(),block[0][0].getHeight());
	//polygon(block[0][1].getX(),block[0][1].getY(),block[0][1].getWidth(),block[0][1].getHeight());
	//polygon(block[0][2].getX(),block[0][2].getY(),block[0][2].getWidth(),block[0][2].getHeight());
	//polygon(block[1][0].getX(),block[1][0].getY(),block[1][0].getWidth(),block[1][0].getHeight());
	//polygon(block[1][1].getX(),block[1][1].getY(),block[1][1].getWidth(),block[1][1].getHeight());
	//polygon(block[1][2].getX(),block[1][2].getY(),block[1][2].getWidth(),block[1][2].getHeight());
	//polygon(block[2][0].getX(),block[2][0].getY(),block[2][0].getWidth(),block[2][0].getHeight());
	//polygon(block[2][1].getX(),block[2][1].getY(),block[2][1].getWidth(),block[2][1].getHeight());
	//polygon(block[2][2].getX(),block[2][2].getY(),block[2][2].getWidth(),block[2][2].getHeight());
	printf("**\n");
	printf("**\n");
	block[0][0].setX(block[0][0].getX()+1);
}



void display()
{
	/* display callback, clear frame buffer and Z buffer, rotate cube and draw
	 * swap buffers */
	 glMatrixMode(GL_MODELVIEW);
	 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	 glLoadIdentity();
	 
	 glTranslated(block[0][0].getX(),block[0][0].getY(),0.0);
	 createObjects();
	 
	 glFlush();
	 glutSwapBuffers();
	 
}

void idle()
{
	/*display */
	 clk = clock () + 0.5 * CLOCKS_PER_SEC ;
  while (clock() < clk) {}
	glutPostRedisplay();
	
}

void mouse(int btn, int state, int x, int y)
{
	/*mouse callBack, selects and axis on which to rotate */

}

void myReshape(int w, int h)
{
	glViewport(0,0,50,30);
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity();
	if (w <= h)
		glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w,
				2.0 * (GLfloat) w / (GLfloat) h,-10.0,10.0);
	else
		glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0,10.0);
	glMatrixMode(GL_MODELVIEW);
}

int	main(int argc, char **argv)
{
	glutInit(&argc, argv);
	
	 //get values for all of the tiles
	int i=0,p=0,curX=0,curY=0,TWidth=50,THeight=50;
	
	for (p=0;p<3;p++)
	{
		for (i=0;i<3;i++)
		{
			block[i][p].setX(curX);
			block[i][p].setY(curY); 
			block[i][p].setWidth(TWidth);
			block[i][p].setHeight(THeight);
			printf("i=%d p=%d %d %d %d %d \n",i,p, block[i][p].getX(),block[i][p].getY(),block[i][p].getWidth(),block[i][p].getHeight());
			curX = curX+TWidth+5;
		}
		curX=50;
		curY= curY+THeight+3;
	}
	printf("%f %f %f",block[0][0].getRf(),block[0][0].getGf(),block[0][0].getBf());
	
	
	for (p=0;p<3;p++)
	{
		for (i=0;i<3;i++)
		{

			printf("i=%d p=%d %d %d %d %d \n",i,p, block[i][p].getX(),block[i][p].getY(),block[i][p].getWidth(),block[i][p].getHeight());
			printf("\n");
		}

	}
	/* need both double buffering and Z buffer */
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(500,500);
	glutCreateWindow("createObjects");
	glutReshapeFunc(myReshape);
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	glutMouseFunc(mouse);
	glEnable(GL_DEPTH_TEST); /*enable hidden surface removal */
	glEnable(GL_TEXTURE_2D);
	glutMainLoop();
}


tile.h
#ifndef TILE_H_
#define TILE_H_

class tile
{
	
int x,y,width,height;
float color[3];
bool blocked;
int id;
public:
	tile();
	tile(int X, int Y, int W, int H);
	void setX(int X);
	void setY(int Y);
	void setWidth(int H);
 	void setHeight(int W);
	
	int getX();
	int getY();
	int getWidth();
	int getHeight();
	
	float getRf();
	float getGf();
	float getBf();
	
	virtual ~tile();
};

#endif /*TILE_H_*/


tile.cpp
#include "tile.h"



tile::tile()
{
	x=0;
	y=0;
	width=0;
	height=0;
	blocked=false;
	id=0;
	color[0]=1.0;
	color[1]=0.0;
	color[2]=0.0;
}

tile::tile(int X, int Y, int W, int H)
{
	blocked=false;
	id=0;
	color[0]=1.0;
	color[1]=0.0;
	color[2]=0.0;
	
	x=X;
	y=Y;
	width=W;
	height=H;
}

tile::~tile()
{
}

void tile::setX(int X)
{
	x=X;
}

void	tile::setY(int Y)
{
	y=Y;
}
void	tile::setWidth(int W)
{
	width=W;
}
void	tile::setHeight(int H)
{
	height=H;
}
int	tile::getX()
{
	return x;
}
int	tile::getY()
{
	return y;
}
int	tile::getWidth()
{
	return width;
}
int	tile::getHeight()
{
	return height;
}

	float tile::getRf()
	{
		return color[0];
	}
	float tile::getGf()
	{
		return color[1];
	}
	float tile::getBf()
	{
		return color[2];
	}

Share this post


Link to post
Share on other sites
There are a few problems with the code which I found @ a glance.

Quote:

glViewport(0,0,50,30);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w,
2.0 * (GLfloat) w / (GLfloat) h,-10.0,10.0);
else
glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0,10.0);


The viewport is quite small !!! Also, the viewing voulme you defined by glOrtho will not display all objects that you defined already.

Another important thing,
In your polygon drawing function polygon(), you are actually drawing points. So you may not be able to see the polygon at all !!!

Hope this helps you
Best Regards,
KumGame

Share this post


Link to post
Share on other sites
I fixed the viewport, but when I try to translate the square, only one side moves and eventually sqishes itself.

do you know why this would be

Share this post


Link to post
Share on other sites
Yes. Your rectangle will disappear from the scene after few translations. You are incrementing the X coordinate of the rectangle by calling your setX() function.

Quote:

void createObjects()
{
/* map vertices to faces */
polygon(block[0][0].getX(),block[0][0].getY(),block[0][0].getWidth(),block[0][0].getHeight());
//polygon(block[0][1].getX(),block[0][1].getY(),block[0][1].getWidth(),block[0][1].getHeight());
//polygon(block[0][2].getX(),block[0][2].getY(),block[0][2].getWidth(),block[0][2].getHeight());
//polygon(block[1][0].getX(),block[1][0].getY(),block[1][0].getWidth(),block[1][0].getHeight());
//polygon(block[1][1].getX(),block[1][1].getY(),block[1][1].getWidth(),block[1][1].getHeight());
//polygon(block[1][2].getX(),block[1][2].getY(),block[1][2].getWidth(),block[1][2].getHeight());
//polygon(block[2][0].getX(),block[2][0].getY(),block[2][0].getWidth(),block[2][0].getHeight());
//polygon(block[2][1].getX(),block[2][1].getY(),block[2][1].getWidth(),block[2][1].getHeight());
//polygon(block[2][2].getX(),block[2][2].getY(),block[2][2].getWidth(),block[2][2].getHeight());
printf("**\n");
printf("**\n");
block[0][0].setX(block[0][0].getX()+1);
}


So with every drawing, your rectangle will be translated by 1 unit in the X direction.
Finally it will disappear when it goes out of the viewing volume you defined by projection transformation.

Actually what do you expect to happen?

Hope I helped you
Best Regards,
KumGame

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this