Threejs 实现扩散圆环效果

Easter79
• 阅读 1152

ThreeJS 实现扩散圆效果

代码实现
//r 圆半径
//init 初始圆半径
//ring 圆环大小
//color 颜色 THREE.Vector3
//speed 速度
function scatterCircle(r, init, ring, color, speed) {
    var uniform = {
        u_color: { value: color },
        u_r: { value: init },
        u_ring: {
            value: ring,
        },
    };

    var vs = `
        varying vec3 vPosition;
        void main(){
            vPosition=position;
            gl_Position    = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
    `;
    var fs = `
        varying vec3 vPosition;
        uniform vec3 u_color;
        uniform float u_r;
        uniform float u_ring;

        void main(){
            float pct=distance(vec2(vPosition.x,vPosition.y),vec2(0.0));
            if(pct>u_r || pct<(u_r-u_ring)){
                gl_FragColor = vec4(1.0,0.0,0.0,0);
            }else{
                float dis=(pct-(u_r-u_ring))/(u_r-u_ring);
                gl_FragColor = vec4(u_color,dis);
            }
        }
    `;
    const geometry = new THREE.CircleGeometry(r, 120);
    var material = new THREE.ShaderMaterial({
        vertexShader: vs,
        fragmentShader: fs,
        side: THREE.DoubleSide,
        uniforms: uniform,
        transparent: true,
        depthWrite: false,
    });
    const circle = new THREE.Mesh(geometry, material);

    function render() {
        uniform.u_r.value += speed || 0.1;
        if (uniform.u_r.value >= r) {
            uniform.u_r.value = init;
        }
        requestAnimationFrame(render);
    }
    render();

    return circle;
}
使用
let circle = scatterCircle(1, 0.1, 0.3, new THREE.Vector3(0, 1, 1), 0.02);
circle.position.set(x, y, z);
scene.add(circle);
点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
Python10行代码实现视频人脸追踪打马赛克
一、背景知识1.1、headblur简介追踪人脸打马赛克需要使用headblur函数。调用语法:headblur(clip,fx,fy,rzone,rblurNone)说明:其中参数fx和fy是两个函数,该函数带参数t,用于确认t时刻需要模糊化范围的中心点位置,moviepy将对以中心点为圆心半径r\zone的圆范围内的图像进行模糊化处理,模糊化处理时
Wesley13 Wesley13
3年前
java GUI初试
学面向对象,以java为设计语言,虽然老师不是讲java但是还是把java的基础知识大概讲了一下,速度当然很快,很少动手实践,这是自己抽时间照着课本做的图像化界面计算圆的周长面积。/功能:测试GUI的使用,用户输入圆的半径,然后计算时间:2012.11.3作者:KDF5000文件名:Tes
DaLongggggg DaLongggggg
3年前
python刷题-圆的面积
问题描述给定圆的半径r,求圆的面积。输入格式输入包含一个整数r,表示圆的半径。输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。说明:在本题中,输入是一个整数,但是输出是一个实数。对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不
good123 good123
3年前
旋转算法
一条直线通过端点绕一个半径为200的圆的圆心进行360度的旋转,在旋转的期间直线的端点一直在圆环上defineCRTSECURENOWARNINGSinclude"graphics.h"defineUSEMATHDEFINESincludestructPointdoublex;doubley;Point(void):
Stella981 Stella981
3年前
SVG 绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Easter79 Easter79
3年前
SVG 绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Stella981 Stella981
3年前
OpenCV基础(五)
图形绘制OpenCV提供了直线,矩形,圆,椭圆的绘制函数,下面介绍用法直线绘制:line()函数原型: voidline(InputOutputArrayimg,Pointpt1,Pointpt2,constScalar&color,intth
Easter79 Easter79
3年前
SVG 如何绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Stella981 Stella981
3年前
SVG 如何绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k