PDA

View Full Version : How to draw a 2d object in 3d world correctly



taylornrolyat
04-12-2013, 01:26 AM
I'm attempting to draw particles (which is in 2D) in my 3D world using OpenGL ES 1.1, and the platform is for iOS devices.

The 3D world (without the 2D particles) looks like this:
https://www.dropbox.com/s/dujs9bsrcv1l233/iOS%20Simulator%20Screen%20shot%20Mar%2028,%202013 %2010.18.26%20PM.png


When trying to draw the 2D particles in the 3D world, it looks like this (notice the grid is now moved somehow to the bottom left corner):
https://www.dropbox.com/s/erv5vopspa5lt2e/iOS%20Simulator%20Screen%20shot%20Mar%2028,%202013 %2010.17.56%20PM.png

However, I want it to draw directly over the 3D grid. Any ideas on how to achieve this or why it is moved to the left bottom corner?

Any help is greatly appreciated.

Heres my work so far.

- (void)drawFrame
{
[(EAGLView *)self.view setFramebuffer];

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

///////////// 3D Drawing the Grid floor

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

static GLfloat z = 0;
gluLookAt(0, 5, -10, 0, 0, 0, 0, 1, 0);
z += 0.075f;

// Rotate the scene
glRotatef(angle, 0, 1, 0);

// Draw the Floor
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, zFloorVertices);
glDrawArrays(GL_LINES, 0, 42);
glVertexPointer(3, GL_FLOAT, 0, xFloorVertices);
glDrawArrays(GL_LINES, 0, 42);

//////////// 2D drawing the particle system

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(0.0f, 320.0f, 0.0f, 480.0f, -100.0f, 100.0f);

glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

[explosion1 update:UPDATE_INTERVAL];

if (explosion1.active != YES)
{
explosion1.sourcePosition = Vector2fMake(200, 200);
explosion1.active = YES;
explosion1.duration = 1;
explosion1.sourcePositionVariance = Vector2fMake(0, rand() % 20);
}

[explosion1 renderParticles];

[(EAGLView *)self.view presentFramebuffer];
}

- (void)initOpenGLES1
{
// Set the clear color
glClearColor(0, 0, 0, 1.0f);

// Projection Matrix config
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
CGSize layerSize = self.view.layer.frame.size;
gluPerspective(45.0f, (GLfloat)layerSize.width / (GLfloat)layerSize.height, 0.1f, 750.0f);

// Modelview Matrix config
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// This next line is not really needed as it is the default for OpenGL ES
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_BLEND);

// Enable depth testing
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
}

taylornrolyat
04-15-2013, 11:35 AM
Can anyone help me out here??

Claude
04-15-2013, 12:48 PM
You set up perspective projection in init function.
In draw function you switch to ortho and never go back.
So everything is dawn in ortho except for the first frame.
Could that be the problem?

Khronos_webmaster
04-16-2013, 10:12 AM
@taylornrolyat Please read the guide on how to post (http://www.opengl.org/discussion_boards/showthread.php/176139-Forum-Posting-Guidelines). You will find very useful ways to get answers faster, like using [CODE ] tags for one.

Many thanks.