webgl 9.画一个圆

前面我们学习了复杂的物体都可以由多个三角形组成。所以可以用多个三角形去拟合一个圆形。

draw_circle.png
cricle.jpeg

如图我们可以把圆等分成 N 份,用 N 个三角形去拟合圆。
设圆上任意一个点跟 y 轴的夹角为 θ, 可得到点的坐标为 (rsin(θ), rcos(θ)), 而 θ 的取值范围是 [0,2π]。

var N = 100;
var vertexData = [0.0, 0.0];
var r = 0.5;

for (var i = 0; i <= N; i++) {
    var theta = i * 2 * Math.PI / N;
    var x = r * Math.sin(theta);
    var y = r * Math.cos(theta);
    vertexData.push(x, y);
}

N = 100, 用 101 个点(第 1 个点和第 101 个点重合)把圆等分成 100 个三角形。加上原点用 gl.TRIANGLE_FAN 画扇形就可以了。

完整代码如下:

 // vertex shader
var VERTEX_SHADER_SOURCE =
    'attribute vec4 a_Position;\n' +

    'void main() {\n' +
    '   gl_Position = a_Position;\n' +
    '}\n';

// fragment shader
var FRAGMENT_SHADER_SOURCE =
    'void main() {\n' +
    '   gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n' +
    '}\n';

var canvas = document.getElementById("canvas");
var gl = canvas.getContext('webgl');

if (!initShaders(gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE)) {
    alert('Failed to init shaders');
}


var N = 100;
var vertexData = [0.0, 0.0];
var r = 0.5;

for (var i = 0; i <= N; i++) {
    var theta = i * 2 * Math.PI / N;
    var x = r * Math.sin(theta);
    var y = r * Math.cos(theta);
    vertexData.push(x, y);
}

var vertices = new Float32Array(vertexData);
initVertexBuffers(gl, vertices);

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLE_FAN, 0, vertices.length / 2);

后面我们还会用同样的方法画一个球体。

查看源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、一元一次方程根的情况 △=b2-4ac 当△>0时,一元二次方程有2个不相等的实数根; 当△=0时,一元二次方...
    abbatuu阅读 4,115评论 1 21
  • 每一天时间的流逝,就是生命的流逝,是自己的也是大家的,生命在不知不觉中走向消亡,你想要的生活是什么样的?当你开始意...
    风流花吹雪阅读 151评论 0 2
  • 天空灰蒙,灯光星点,秋雨淅沥,伴之古旧的车站站台。驻足于此情此景,真的会将你拽到另一个似曾相识的境遇。将军沙场点兵...
    书包会唱歌阅读 192评论 0 0