>创建自己的球体网格
通过2个角度的简单2D环(球面坐标系2笛卡尔坐标).如果想要更高的精度,可以轻松添加椭球属性(地球不是球体).如果没有,则可以对所有行星使用单球面网格,并在使用之前进行缩放…
设a为经度,b为纬度,因此从0到2 * PI [rad]循环a和b从-0.5 * PI到0.5 * PI [rad],其中PI = 3.1415 …是Pi(在C数学中). h称为M_PI).如果你的数学api使用度数然后转换为度数PI [rad] = 180.0 [deg]
>每个顶点添加必要的信息
照明法线
// just unit sphere
nx=cos(b)*cos(a);
ny=cos(b)*sin(a);
nz=sin(b);
纹理坐标(假设矩形非扭曲图像)
// just convert a,b to <0,1> range
tx=a/(2.0*PI)
ty=(b/PI)+0.5;
顶点位置
// just sphere(rx=ry=rz=r) or ellipsoid (rx=ry=equatorial and rz=polar radius)
// can also use rx*nx,ry*ny,rz*nz instead ...
x=rx*cos(b)*cos(a);
y=ry*cos(b)*sin(a);
z=rz*sin(b);
>将所有这些发送给OpenGL
所以以上都存储在一些内存空间(CPU或GPU)中,然后发送到渲染.您可以使用旧版glBegin(QUAD_STRIP); …… glEnd();或displaylist / VBO / VAO.在每个行星/身体之前绑定正确的纹理,并且不要忘记更新ModelView矩阵.这是我的坐标系看起来像:
另外看看这些相关的问答:
[edit1] C例子
//---------------------------------------------------------------------------
const int