2010-11-24 37 views
0

我考虑了一展身手了一段时间,但我一直没能得到良好的结果。基本上,我有一个2个纹理的球体。一个是与其他人混合在一起的,并且想法是让它成为一个脸部环境映射。我想让一个纹理与球体一起旋转,另一个纹理保持固定在最初的纹理坐标上。另外旋转2纹理坐标集相同的对象

我试图旋转一个纹理矩阵GL_TEXTURE和重置等,但是这并没有真正做的伎俩,因为当它旋转某些方面的纹理映射是不正确的。

任何人都知道我可以旋转,只有一组纹理坐标,并保持固定的另一个?

这是我此刻的渲染代码:

glColor4f(0.0, 0.0, 0.0, 0.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex[0]); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, sizeof(TexturedVertexData3D), &SphereVertexData[0].texCoord); 

glMatrixMode(GL_TEXTURE); 
glPushMatrix(); 
glTranslatef(0, 0, -4.5f); 
glRotatef(.00001, .00001, .0, .0); 

glClientActiveTexture(GL_TEXTURE1); 
glActiveTexture(GL_TEXTURE1); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, tex[1]); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, sizeof(TexturedVertexData3D), &SphereVertexData[0].texCoord); 

glPopMatrix(); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); 

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glTranslatef(0, 0, -4.5f); 

glVertexPointer(3, GL_FLOAT, sizeof(TexturedVertexData3D), &SphereVertexData[0].vertex); 
glNormalPointer(GL_FLOAT, sizeof(TexturedVertexData3D), &SphereVertexData[0].normal); 
glDrawArrays(GL_TRIANGLES, 0, kSphereNumberOfVertices); 

glPopMatrix(); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

rotation += .0001; 

如果有人需要看到更多的是怎么回事,只是让我知道的。

回答

1

你可以使用两个球,只发出glRotatef()球体与您要旋转的纹理。另一个球体只会收到相应的glTranslatef()命令。如果您使用Alpha通道混合纹理,它应该工作相同。

+0

我虽然这件事,但我担心它会影响到整体性能。还有一堆其他的碰撞检测和物理数学,已经增加了很多开销。任何想法,我会采取多少表现打击,而不是一种不同的方式? – ezekielDFM 2010-12-20 17:04:35