2D纹理或立方体映射

2D texture or cube mapping

本文关键字:映射 立方体 纹理 2D      更新时间:2023-10-16

我正在尝试创建一个行星(OpenGL和c++),但我不知道如何围绕我创建的球体包装图片。

我能够创建一个实心球体,我也可以绘制网格(纬度和经度)的行星。我现在最大的问题是如何获得这个球体或网格周围的图像。

有没有人知道一个简单的遵循纹理映射教程?

我建议你使用gluSphere();来绘制行星,如果你想要一个简单的方法来添加纹理到球体,这里有一个示例代码如何使一个球体与纹理包裹在它周围,首先你必须声明一个新的引用到GLUquadric(在initGl方法之前声明)

GLUquadric* q;

现在在initGl方法中放入以下代码:

q=gluNewQuadric();
gluQuadricNormals(q, GL_SMOOTH);
textureID = LoadTexture("***.bmp");      //put the name of the photo resource file you want to use.
gluQuadricTexture(q , GL_TRUE);

DrawGlScene方法中,我们放入以下代码来绘制球体并将我们创建的纹理包裹在它周围:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textureID);
gluSphere(q , 2 , 30 , 30);     
glDisable(GL_TEXTURE_2D);

U坐标基本上被计算为:

U = asin(x) / PI + 0.5 

V坐标:

V = asin(y) / PI + 0.5 

这里有一些关于如何在球体网格上实现立方体和球体映射的易于理解的教程:

  • NVidia Cube Map OpenGL
  • OpenGL Wiki Texturing a Sphere
  • CSU课程纹理

我假设您以这种方式(或多或少)创建具有经度和纬度两个参数的行星:

for longitude from -Pi to Pi
    from latitude from -Pi/2 to Pi /2
        add vertex
    next
next

为顶点指定纹理坐标uv的最简单方法是使用经度/纬度坐标。

u = (longitude + Pi) / (2 Pi)
v = (Pi/2 - latitude) / Pi

这样你就可以使用像这样的纹理。