第六节 WebGL画球算法
2026-05-01 21:59:30
197
分类:WebGL
转载自:https://blog.csdn.net/qq_37338983/article/details/78643772
很多学习WebGL的小伙伴,刚开始一直都是学怎么画立方体,等到立方体画的炉火纯青的时候,却被另一个东西难住了,那就是球。what,还会被一个球难住?。下面就给大家介绍一种画球的算法:
我们的地球现在被划分为很多经线和纬线,如下图所示:
由下面的图,我们来推导一下计算球面上点的坐标:
假设图中圆的半径R=1,由图可算出红点的坐标:x = R*cos theta, y = R * sin theta;那角度theta又是怎样得到的呢?
其实很简单,如果将一个球的经纬线都取为由5,再将其投影到平面圆,就得到在圆的边上的交点总共有10个,两个半圆,一半5个,其所对应的5个圆心角都是相等的,这个角即theta, 所以theta = PI/5, 如果取最中间的那条线为第一条线,那么第一条线上的交点所对的圆心角theta = 0; 如下图所示:
代码实现如下:
for (j = 0; j <= SPHERE_DIV; j++){//SPHERE_DIV为经纬线数
aj = j * Math.PI/SPHERE_DIV;
sj = Math.sin(aj);
cj = Math.cos(aj);
for(i = 0; i <= SPHERE_DIV; i++){
ai = i * 2 * Math.PI/SPHERE_DIV;
si = Math.sin(ai);
ci = Math.cos(ai);
points.push(si * sj);//point为顶点坐标
points.push(cj);
points.push(ci * sj);
}
}
for(j = 0; j < SPHERE_DIV; j++){
for(i = 0; i < SPHERE_DIV; i++){
p1 = j * (SPHERE_DIV+1) + i;
p2 = p1 + (SPHERE_DIV+1);
indices.push(p1);//indices为顶点的索引
indices.push(p2);
indices.push(p1 + 1);
indices.push(p1 + 1);
indices.push(p2);
indices.push(p2 + 1);
}
}本文只提供算法部分,绘制的部分可参考:点击打开链接(里面绘制了一个可交互的立方体),最后我实现的效果如下: