[solved] Object instead of a pixel

Started by
9 comments, last by Lord_Evil 17 years, 7 months ago
Hi I already searched for my problem in the forum but without success. So here is my question/problem: Basically I want to draw an 3d-object instead of a pixel of the base object. For example I draw a triangle with the common vertex-code. That's no problem, but here comes the challange: For every single pixel containing this triangle I want to draw a new, smaller coordinate system. Example: The pixels of the triangle are visualised with a sphere in the according coordinate system, then the triangle consists of many spheres. Does anybody know how to realise this? Is there any example/tutorial/link which explains it to me? reani [Edited by - reani on September 22, 2006 7:33:36 AM]
Advertisement
I didn't understand what you want to do, but can try the following:

Read the pixel buffer after rendering the triangle, check each pixel for the triangle's color, project the pixel's position + depth value into the world again and draw a sphere there.


Question:

Why would you want to draw a sphere instead of a pixel? When using the same projection matrix, the sphere would end in beeing drawn as a pixel again, so where's the difference?
If I was helpful, feel free to rate me up ;)If I wasn't and you feel to rate me down, please let me know why!
Every pixel of the triangle belongs to additional infomation. I use the sphere to visualise this infomation.
My fault: not every pixel is visualised with a sphere.

For a better understanding i found a picture in the web:
http://www.informatik.uni-leipzig.de/bsv/Hlawit/Glyphs/glyphs/glyphs-000002.png

This picture shows what i want to implement.
Seems to be a huge n x m matrix.
Why don't you create a 2D array containing the information, store position and orientation of the "sphere" and render the spheres by traversing the array?

If that background is a texture: just deal with the texture as an array. Load it into OpenGL for rendering but keep a copy for reading.

If that texure should be dynamic, use render to texture or read back the pixels using glReadPixels (you don't have to read every pixel, just the ones you want to use).
If I was helpful, feel free to rate me up ;)If I wasn't and you feel to rate me down, please let me know why!
No, you cannot tell openGl to replace all pixels in a surface with 3d objects automatically.

If you want to draw a grid of these spheres... you're going to have to do it yourself. This is easily accomplished using a 2d array...

I suspect, that you are trying for something more difficult, rather than a flat plane of these spheres, you are probably trying to cover an arbitrary surface with them.
You're just going to have to go through your triangle, and use linear interpolation between it's vertices to calculate postions for each of theres spheres 'manually'.
ok, i think i understand what i have to do, but i'm confused :-(

I'm not that familiar with OpenGL. Do you have an example or a tutorial for me?
I don't have a tutorial right now, but you can do the following:

If the surface you want to cover is static, you can build a list of positions to cover in a preprocess, then loop through this list and draw an object at each of those positions.

If the surface will be deformable, you'd have to loop through its vertices each frame or build the list I mentioned above and only update the deformed parts.

Now for the interpolation. It's basically just some vector math:

Get two neighboring vertices, calculate the vector between them (v2 - v1) + its length. Get the number of interpolated points = length / prefered distance (the distance your objects should have). Each interpolated point will be calculated as: v1 + Normalize(v2 - v1) * distance.

This way you can cover the edges of your primitives with objects.

When using rectangluar Quads you could also use the interpolated points on the edge to calculate the interior points. For non-rectangluar primitives you would have to figure it out on your own.

At the end, draw an object at each position you calculated. You could use glut for drawing spheres or create your own objects.
If I was helpful, feel free to rate me up ;)If I wasn't and you feel to rate me down, please let me know why!
hi again,

ok, i found a way for doing my first example, but i doesn't work. Idea is that i draw a triangle and on every corner i add - at the beginning - a line. The line will be replaced by a sphere later, that's why i draw the line in a list (see below).

Here's my routine:
glBegin(GL_TRIANGLES);	glVertex3dv(&vdata[tindices[0]][0]);	glCallList(1);	glVertex3dv(&vdata[tindices[1]][0]);	glCallList(1);	glVertex3dv(&vdata[tindices[2]][0]);	glCallList(1);glEnd();


and my list declaration:

glNewList(1, GL_COMPILE);	glBegin(GL_LINES);		glPushMatrix();		glVertex3d( 1.0, 1.0,-1.0);		glVertex3d( 1.0, 1.0, 1.0);		glPopMatrix();	glEnd();		glEndList();


The scene only shows a mix of triangle and line. I tried the triangle without the lines and vice versa: works!

Does anybody know what's wrong?

reani
Put the glPushMatrix() and glPopMatrix() outside your list definition.
Use them in your rendering function instead.

You don't draw the triangle, right?

so do the following:

Render(){  glPushMatrix();  glTranslatef(corner.x, corner.y, corner.z);  //convert your &vdata[tindices[0]][0] to those 3 floats  glCallList(1);  glPopMatrix();  //repeat for the 2 remaining corners.};


if you want to render the triangle, too, put that glBegin(GL_TRIANGLES) + glVertex3f(...) etc. stuff at the beginning or end of the Render() function but without the glCallList(1)s.
If I was helpful, feel free to rate me up ;)If I wasn't and you feel to rate me down, please let me know why!
i render the triangle too, but anyway thank for solving the problem!

Except there was something missing: after the
glCallList(1); 

you have to insert:
glTranslatef(-corner.x, -corner.y, -corner.z); 

... the transformation back to the coordinates.

reani

This topic is closed to new replies.

Advertisement