zoukankan      html  css  js  c++  java
  • (二)Sierpinski镂垫的3d画法

    一、3d镂垫的主要思路:

        (1)随机点构建

      a、用四个初始顶点来定义四面体   

        var vertices = [
            vec3( -0.5, -0.5, -0.5 ),
            vec3(  0.5, -0.5, -0.5 ),
            vec3(  0.0,  0.5,  0.0 ),
            vec3(  0.0, -0.5, 0.5 ),
        ];

      b、把四面体内的一点作为初始位置

      

    points = [ vec3( 0.0, 0.0, 0.0 ) ];

        c、从四边体内随机选点,与初始点进行向量运算,得到四边体内的第二个点,把第二个点作为初始点,继续迭代,即可得到更多随机点。

    for ( var i = 0; points.length < NumPoints; ++i ) {
            var j = Math.floor(Math.random() * 4);
    
            points.push(mix(points[i], vertices[j], 0.5) );
        }

        d、对所有点进行渲染,得到随机点3d镂垫

        (2)三角形构建

      a、构建四面体节点

    let vertices = [
            vec3(  0.0000,  0.0000, -1.0000 ),
            vec3(  0.0000,  0.9428,  0.3333 ),
            vec3( -0.8165, -0.4714,  0.3333 ),
            vec3(  0.8165, -0.4714,  0.3333 )
        ]

      b、求四面体的每条边的中点,把四面体分割为四个四面体,不断迭代,直到次数为0

    function divideTetra(a, b, c, d, count) {
        if (count === 0) {
            /*绘制四个三角形面*/
            tetra(a, b, c, d);
        } else {
            let ab = mix(a, b, 0.5);
            let ac = mix(a, c, 0.5);
            let ad = mix(a, d, 0.5);
            let bc = mix(b, c, 0.5);
            let bd = mix(b, d, 0.5);
            let cd = mix(c, d, 0.5);
    
            --count;
    
            divideTetra(a, ab, ac, ad, count);
            divideTetra(ab, b, bc, bd, count);
            divideTetra(ac, bc, c, cd, count);
            divideTetra(ad, bd, cd, d, count);
        }
    }

      c、把四面体的每个三角形的顶点依次放到数组中

    function tetra(a, b, c, d) {
        /*每个面的顶点共用一种颜色*/
        triangles(a, b, c, 0);
        triangles(a, b, d, 1);
        triangles(a, c, d, 2);
        triangles(b, c, d, 3);
    }
    
    function triangles(a, b, c, color) {
        let baseColors = [
            vec3(1.0, 0.0, 0.0),
            vec3(0.0, 1.0, 0.0),
            vec3(0.0, 0.0, 1.0),
            vec3(0.0, 0.0, 0.0)
        ];
    
    
        colors.push(baseColors[color]);
        points.push(a);
    
    
        colors.push(baseColors[color]);
        points.push(b);
    
    
        colors.push(baseColors[color]);
        points.push(c);
    }

      d、对所有点进行渲染,得到三角形3d镂垫

        

    二、命名规范:

         1、使用v作为顶点着色器中的变量的首字母    2、使用f作为片元着色器中的变量的首字母

      关于webgl基础中常见的变量解释,参考文章:https://blog.csdn.net/qq_34874034/article/details/105732082

    三、镂垫源码下载地址

    https://gitee.com/yiliangmi/computer-graphic-base-webgl

    四、学习交流群

    QQ群:871934478

    
    

    版权所有,转载请注明源地址   

  • 相关阅读:
    foreach
    if
    注意事项
    Maven测试
    课程评价
    个人总结
    HTML表格CSS美化
    让多个输入框对齐
    CSS样式写在JSP代码中的几种方法
    日常
  • 原文地址:https://www.cnblogs.com/yiliangmi/p/13614630.html
Copyright © 2011-2022 走看看