Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I map a texture to the sides of an icosahedron?

I have been trying to develop a 3D game for a long time now. I went through this tutorial and found that I didn't know enough to actually make the game.

I am currently trying trying to add a texture to the icosahedron (in the "Look at Basic Drawing" section) he used in the tutorial, but I cannot get the texture on more than one side. The other sides are completely invisible for no logical reason (they showed up perfectly until I added the texture).

Here are my main questions:

  • How do I make the texture show up properly without using a million vertices and colors to mimic the results?

  • How can I move the object based on a variable that I can set in other functions?

like image 210
Justin Avatar asked Oct 28 '25 05:10

Justin


1 Answers

Try to think of your icosahedron as a low poly sphere. I suppose Lamarche's icosahedron has it's center at 0,0,0. Look at this tutorial, it is written for directX but it explains the general principle of sphere texture mapping http://www.mvps.org/directx/articles/spheremap.htm. I used it in my project and it works great. You move the 3D object by applying various transformation matrices. You should have something like this

glPushMatrix();
glTranslatef();
draw icosahedron;
glPopMatrix();

Here is my code snippet of how I did texCoords for a semisphere shape, based on the tutorial mentioned above

    GLfloat *ellipsoidTexCrds;
Vector3D *ellipsoidNorms;

int numVerts = *numEllipsoidVerticesHandle;

ellipsoidTexCrds = calloc(numVerts * 2, sizeof(GLfloat));
ellipsoidNorms = *ellipsoidNormalsHandle;

for(int i = 0, j = 0; i < numVerts * 2; i+=2, j++)
{

    ellipsoidTexCrds[i] = asin(ellipsoidNorms[j].x)/M_PI + 0.5; 
    ellipsoidTexCrds[i+1] = asin(ellipsoidNorms[j].y)/M_PI + 0.5;
}

I wrote this about a year and a half ago, but I can remember that I calculated my vertex normals as being equal to normalized vertices. That is possible because when you have a spherical shape centered at (0,0,0), then vertices basically describe rays from the center of the sphere. Normalize them, and you got yourself vertex normals.

And by the way if you're planning to use a 3D engine on the iPhone, use Ogre3D, it's really fast.

hope this helps :)

like image 196
Marko Hlebar Avatar answered Oct 29 '25 20:10

Marko Hlebar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!