Moving objects towards and away from the camera

Started by
2 comments, last by lesshardtofind 13 years, 6 months ago
I'm not sure why this is eluding me. I have some cubes and I can rotate in all directions, move them in the x and y directions, but I can't figure out how to cause them to move towards and away from the camera. I am using glFrustrum, so the problem isn't that I'm drawing them orthographically, but it seems any translation of the camera in the z direction causes no change. I've spent hours looking in books and tutorials and I have no idea why this simple action is eluding me though 2D actions in opengl seem common, even when displaying 3D objects all I can find are 2D movements or rotations around a point, nothing about moving things closer or farther away from the current view.

I had assumed that if I draw an object, then translate, then draw the next object based on their stored local positions they would be drawn at their respective distances.

Any hints? I know I probably seem completely ignorant but I'm going out of my mind with the repeated suggestions of gluLookAt which I cannot use due to the lack of glut on the platform I'm working in.

Greatly appreciate any guidance.

overall DRAWVIEW call
[EAGLContext setCurrentContext:context];        glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	glClearDepthf(1.0f);    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	glEnableClientState(GL_VERTEX_ARRAY);    GLfloat triVertices[40*3*2];		// draw static grid as background	int index = 0;	int lCount = 0;	for ( float i = -0.8f; i <= 0.9f; i += 0.1f)	{				triVertices[index] = -0.9f;		triVertices[index + 1] = i;		triVertices[index + 2] = 0.0f;				triVertices[index + 3] = 0.9f;		triVertices[index + 4] = i;		triVertices[index + 5] = 0.0f;				triVertices[index + 6] = i;		triVertices[index + 7] = -0.9f;		triVertices[index + 8] = 0.0f;				triVertices[index + 9] = i;		triVertices[index + 10] = 0.9f;		triVertices[index + 11] = 0.0f;				index += 12;		lCount += 4;	}		glVertexPointer(3, GL_FLOAT, 0, triVertices);	glDrawArrays(GL_LINES, 0, lCount);		// draw 3D objects		glEnable(GL_DEPTH_TEST);	glMatrixMode(GL_PROJECTION);        glLoadIdentity();	glFrustumf(-1.6f, 1.6, -2.4, 2.4, -10, 10);	glMatrixMode(GL_MODELVIEW);		// enable GL states for textures	glEnableClientState(GL_VERTEX_ARRAY);	glEnableClientState(GL_TEXTURE_COORD_ARRAY);	glEnable(GL_TEXTURE_2D);		glEnable(GL_BLEND); // cubes have slightly transparent texture	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);	[self drawCubes];	glDisable(GL_BLEND);		// draw buttons	glMatrixMode(GL_PROJECTION);         glLoadIdentity();        glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);	glMatrixMode(GL_MODELVIEW);		glEnable(GL_BLEND); // buttons are one texture with transparent center	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);	[self drawButtons];	glDisable(GL_BLEND);		//disable GL states for texturing	glDisableClientState(GL_VERTEX_ARRAY);	glDisableClientState(GL_TEXTURE_COORD_ARRAY);	glDisable(GL_TEXTURE_2D);    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);    [context presentRenderbuffer:GL_RENDERBUFFER_OES];


drawCubes
{		const GLfloat cubeTexCoords[8] =        {		1, 0,  1, 1,  0, 0,  0, 1,	};		glBindTexture(GL_TEXTURE_2D, texture[0]);		glPushMatrix();	glLoadIdentity();	//glTranslatef( playerShape.x, playerShape.y, playerShape.z );  this seems to be causing problems, perhaps done in wrong order	glScalef(kCubeScale, kCubeScale, kCubeScale);		glTexCoordPointer(2, GL_FLOAT, 0, cubeTexCoords);	for (int f = 0; f < playerShape.num_outer_sides/12; f++) {		//glColor4f(cubeColors[f%6][0], cubeColors[f%6][1], cubeColors[f%6][2], cubeColors[f%6][3]);				glColor4f(cubeColors[1][0], cubeColors[1][1], cubeColors[1][2], cubeColors[1][3]);		glVertexPointer(3, GL_FLOAT, 0, cubeVertices[f]);		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);	}		glPopMatrix();		glBindTexture(GL_TEXTURE_2D, 0);}


[Edited by - Zmaker5 on October 10, 2010 5:12:35 PM]
Advertisement
Hey I'm definitely still a ameteur in OpenGL, but I can share my method. I usually start by making a Class of any object I'm going to draw. Then I give every object a center point. And all rendering is done based off the size of the object and its center. Like in the example of a cube you know each Face is going to be size/2 away from the Center. So you draw everything in a formula based off the center. Translate to center then draw off the formula. When I want to move an object I can just change the center cartesian coordinates(3 set x, y, z) and the object will automaticly move where I tell its center to go.

for(int a = 0; a < 20; a++){  Cube.SetCenter(Cube.CenterX(), Cube.CenterY(), Cube.CenterZ()+1);}


This would move it 20 forward from its original position. If you know your classes and geomotry this should be a snap. I apologize if this isn't an applicable solution due to my lack of understanding of all OpenGL formats, but I figured I'd take a stab at it since no one had responded yet.
I assume you mean you're updating the vertices at each step, but that seems like a lot of unneeded computation though I'd considered it. I didn't think I would have to change all the vertices values to move objects, I figure there's a way for something to be placed at a location rather than actually defining the vertices themselves around the location.

Thanks for your help though I hope to avoid having to implement using that method. From various tutorials I had assumed there was some way to use glTranslate or something similar to handle drawing objects in their correct location on screen.
My method does use GL translate to draw onto the screen at the "correct" position. The translate translates to the center of the object. The example I gave was simple, but I use this method so the physics engine can manipulate the objects location. Shouldn't every object be movable unless it is a wall or some sort of stationary object? I'm sorry I seem to be confused. Are you just wanting to move the camera rather than the object?

I also made a little play around particle engine using this method with a couple std::vector that did a pushback to increase the number of particles. The computer I'm using with 2gig ram was able to handle around 500k particles (which each contained 4 triangles so around 2 million triangles on the screen moving their own centers) before it even started to slow down. I have recently read since then that the physics engine should operate calculations at half the speed of your renderer to increase speed so I'm guessing using that tactic I could probably nearly double the number of triangles on the screen.

This topic is closed to new replies.

Advertisement