开发者

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

开发者 https://www.devze.com 2023-02-17 11:17 出处:网络
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 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?


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 :)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号