第六节 WebGL画球算法

很多学习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);
    }
}
本文只提供算法部分,绘制的部分可参考: 点击打开链接(里面绘制了一个可交互的立方体),最后我实现的效果如下:





猜你喜欢

转载自blog.csdn.net/qq_37338983/article/details/78643772