• 跳动爱心代码-李峋同款爱心代码1(完整代码)


    电视剧 点燃我,温暖你 打火机与公主裙 李洵同款爱心跳动效果。

    获取完整代码,公众号「ClassmateJie」 回复爱心代码。
    或者直接复制粘贴文章的代码,可以直接运行!
    友情提示:公众号内有更多好玩的代码,等待你的到来
    在这里插入图片描述

    简介

    代码实现电视剧 点燃我,温暖你 打火机与公主裙 李洵爱心跳动效果。跳动的爱心❤真的超级好看,程序员的浪漫,真的好炫酷啊!


    以下为代码内容|关注微信公众号「ClassmateJie」

    1.先建立一个html文件(mian.html)

    代码如下:

    DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title>流动爱心表白title>
        <link rel="stylesheet" href="mian.css" />
      head>
     
      <body>
        
        <canvas id="canvas" width="1400" height="600">canvas>
        
        <script src="main.js">script>
      body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.然后建立一个js文件(mian.js)

    代码如下:

    
    var canvas = document.getElementById("canvas");
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    // Initialize the GL context
    var gl = canvas.getContext('webgl');
    if (!gl) {
        console.error("Unable to initialize WebGL.");
    }
    //Time step
    var dt = 0.015;
    //Time
    var time = 0.0;
    //************** Shader sources **************
    var vertexSource = `
    attribute vec2 position;
    void main() {
    	gl_Position = vec4(position, 0.0, 1.0);
    }
    `;
     
    var fragmentSource = `
    precision highp float;
    uniform float width;
    uniform float height;
    vec2 resolution = vec2(width, height);
    uniform float time;
    #define POINT_COUNT 8
    vec2 points[POINT_COUNT];
    const float speed = -0.5;
    const float len = 0.25;
    float intensity = 0.9;
    float radius = 0.015;
    //https://www.shadertoy.com/view/MlKcDD
    //Signed distance to a quadratic bezier
    float sdBezier(vec2 pos, vec2 A, vec2 B, vec2 C){    
    	vec2 a = B - A;
    	vec2 b = A - 2.0*B + C;
    	vec2 c = a * 2.0;
    	vec2 d = A - pos;
    	float kk = 1.0 / dot(b,b);
    	float kx = kk * dot(a,b);
    	float ky = kk * (2.0*dot(a,a)+dot(d,b)) / 3.0;
    	float kz = kk * dot(d,a);      
    	float res = 0.0;
    	float p = ky - kx*kx;
    	float p3 = p*p*p;
    	float q = kx*(2.0*kx*kx - 3.0*ky) + kz;
    	float h = q*q + 4.0*p3;
    	if(h >= 0.0){ 
    		h = sqrt(h);
    		vec2 x = (vec2(h, -h) - q) / 2.0;
    		vec2 uv = sign(x)*pow(abs(x), vec2(1.0/3.0));
    		float t = uv.x + uv.y - kx;
    		t = clamp( t, 0.0, 1.0 );
    		// 1 root
    		vec2 qos = d + (c + b*t)*t;
    		res = length(qos);
    	}else{
    		float z = sqrt(-p);
    		float v = acos( q/(p*z*2.0) ) / 3.0;
    		float m = cos(v);
    		float n = sin(v)*1.732050808;
    		vec3 t = vec3(m + m, -n - m, n - m) * z - kx;
    		t = clamp( t, 0.0, 1.0 );
    		// 3 roots
    		vec2 qos = d + (c + b*t.x)*t.x;
    		float dis = dot(qos,qos);
            
    		res = dis;
    		qos = d + (c + b*t.y)*t.y;
    		dis = dot(qos,qos);
    		res = min(res,dis);
    		
    		qos = d + (c + b*t.z)*t.z;
    		dis = dot(qos,qos);
    		res = min(res,dis);
    		res = sqrt( res );
    	}
        
    	return res;
    }
    //http://mathworld.wolfram.com/HeartCurve.html
    vec2 getHeartPosition(float t){
    	return vec2(16.0 * sin(t) * sin(t) * sin(t),
    							-(13.0 * cos(t) - 5.0 * cos(2.0*t)
    							- 2.0 * cos(3.0*t) - cos(4.0*t)));
    }
    //https://www.shadertoy.com/view/3s3GDn
    float getGlow(float dist, float radius, float intensity){
    	return pow(radius/dist, intensity);
    }
    float getSegment(float t, vec2 pos, float offset, float scale){
    	for(int i = 0; i < POINT_COUNT; i++){
    		points[i] = getHeartPosition(offset + float(i)*len + fract(speed * t) * 6.28);
    	}
        
    	vec2 c = (points[0] + points[1]) / 2.0;
    	vec2 c_prev;
    	float dist = 10000.0;
        
    	for(int i = 0; i < POINT_COUNT-1; i++){
    		//https://tinyurl.com/y2htbwkm
    		c_prev = c;
    		c = (points[i] + points[i+1]) / 2.0;
    		dist = min(dist, sdBezier(pos, scale * c_prev, scale * points[i], scale * c));
    	}
    	return max(0.0, dist);
    }
    void main(){
    	vec2 uv = gl_FragCoord.xy/resolution.xy;
    	float widthHeightRatio = resolution.x/resolution.y;
    	vec2 centre = vec2(0.5, 0.5);
    	vec2 pos = centre - uv;
    	pos.y /= widthHeightRatio;
    	//Shift upwards to centre heart
    	pos.y += 0.02;
    	float scale = 0.000015 * height;
    	
    	float t = time;
        
    	//Get first segment
    	float dist = getSegment(t, pos, 0.0, scale);
    	float glow = getGlow(dist, radius, intensity);
        
    	vec3 col = vec3(0.0);
        
    	//White core
    	col += 10.0*vec3(smoothstep(0.003, 0.001, dist));
    	//Pink glow
    	col += glow * vec3(0.94,0.14,0.4);
        
    	//Get second segment
    	dist = getSegment(t, pos, 3.4, scale);
    	glow = getGlow(dist, radius, intensity);
        
    	//White core
    	col += 10.0*vec3(smoothstep(0.003, 0.001, dist));
    	//Blue glow
    	col += glow * vec3(0.2,0.6,1.0);
            
    	//Tone mapping
    	col = 1.0 - exp(-col);
    	//Output to screen
     	gl_FragColor = vec4(col,1.0);
    }
    `;
     
    //************** Utility functions **************
     
    window.addEventListener('resize', onWindowResize, false);
     
    function onWindowResize() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        gl.viewport(0, 0, canvas.width, canvas.height);
        gl.uniform1f(widthHandle, window.innerWidth);
        gl.uniform1f(heightHandle, window.innerHeight);
    }
     
     
    //Compile shader and combine with source
    function compileShader(shaderSource, shaderType) {
        var shader = gl.createShader(shaderType);
        gl.shaderSource(shader, shaderSource);
        gl.compileShader(shader);
        if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
            throw "Shader compile failed with: " + gl.getShaderInfoLog(shader);
        }
        return shader;
    }
     
    //From https://codepen.io/jlfwong/pen/GqmroZ
    //Utility to complain loudly if we fail to find the attribute/uniform
    function getAttribLocation(program, name) {
        var attributeLocation = gl.getAttribLocation(program, name);
        if (attributeLocation === -1) {
            throw 'Cannot find attribute ' + name + '.';
        }
        return attributeLocation;
    }
     
    function getUniformLocation(program, name) {
        var attributeLocation = gl.getUniformLocation(program, name);
        if (attributeLocation === -1) {
            throw 'Cannot find uniform ' + name + '.';
        }
        return attributeLocation;
    }
     
    //************** Create shaders **************
     
    //Create vertex and fragment shaders
    var vertexShader = compileShader(vertexSource, gl.VERTEX_SHADER);
    var fragmentShader = compileShader(fragmentSource, gl.FRAGMENT_SHADER);
     
    //Create shader programs
    var program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);
     
    gl.useProgram(program);
     
    //Set up rectangle covering entire canvas 
    var vertexData = new Float32Array([-1.0, 1.0, // top left
        -1.0, -1.0, // bottom left
        1.0, 1.0, // top right
        1.0, -1.0, // bottom right
    ]);
     
    //Create vertex buffer
    var vertexDataBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexDataBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.STATIC_DRAW);
     
    // Layout of our data in the vertex buffer
    var positionHandle = getAttribLocation(program, 'position');
     
    gl.enableVertexAttribArray(positionHandle);
    gl.vertexAttribPointer(positionHandle,
        2, // position is a vec2 (2 values per component)
        gl.FLOAT, // each component is a float
        false, // don't normalize values
        2 * 4, // two 4 byte float components per vertex (32 bit float is 4 bytes)
        0 // how many bytes inside the buffer to start from
    );
     
    //Set uniform handle
    var timeHandle = getUniformLocation(program, 'time');
    var widthHandle = getUniformLocation(program, 'width');
    var heightHandle = getUniformLocation(program, 'height');
     
    gl.uniform1f(widthHandle, window.innerWidth);
    gl.uniform1f(heightHandle, window.innerHeight);
     
    function draw() {
        //Update time
        time += dt;
     
        //Send uniforms to program
        gl.uniform1f(timeHandle, time);
        //Draw a triangle strip connecting vertices 0-4
        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
     
        requestAnimationFrame(draw);
    }
     
    draw();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249

    3.再建立一个css文件(mian.css)

    代码如下:

    body {
        background-color: #000;
        margin: 0;
        overflow: hidden;
        background-repeat: no-repeat;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    友情提示:文件都要建立在一个目录下,负责会找不到文件路径

    在这里插入图片描述

    关注微信公众号「 ClassmateJie
    更多惊喜等待你的发掘
    ​ ​
  • 相关阅读:
    公司产品太多了,怎么实现一次登录产品互通?
    智能家居后端技术解决方案-API设计
    1206. 设计跳表 : 数据结构实现题
    python爬虫requests.get乱码问题
    前后端分离计算机毕设项目之基于SpringBoot的无人智慧超市管理系统的设计与实现《内含源码+文档+部署教程》
    【计算机毕业设计】基于SpringBoot+Vue贵州旅游系统的设计与实现
    OSCP-Vulnhub靶机记录-GoldenEye-walkthrough
    虚拟体育来袭!普通人也能参加奥运会?
    深入剖析红黑树:优雅地平衡二叉搜索树
    图腾柱和推挽电路介绍
  • 原文地址:https://blog.csdn.net/J_Jie_/article/details/127775260