• <center id="sm46c"></center>
  • <dfn id="sm46c"></dfn>
  • <strike id="sm46c"></strike>
  • <cite id="sm46c"><source id="sm46c"></source></cite>
    • <strike id="sm46c"><source id="sm46c"></source></strike>
      <option id="sm46c"></option>
      国产精品天天看天天狠,女高中生强奷系列在线播放,久久无码免费的a毛片大全,国产日韩综合av在线,亚洲国产中文综合专区在,特殊重囗味sm在线观看无码,中文字幕一区二区三区四区在线,无码任你躁久久久久久老妇蜜桃

      好看的圣誕樹(動態(tài)效果) 轉自 csdn

      2023-12-25    前端達人

      、制作方法 

      1.復制代碼到Dreamweaver或HBuilder或vscode中

      2.點擊運行---運行到瀏覽器---選擇你要打開的瀏覽器

      3.打開后會出現(xiàn)這個界面,前四個是固定音樂,最后一個是自主選擇的音樂,你可以選擇你電腦上的歌曲,什么歌曲都行(第一次打開可能會有點慢,稍等片刻即可,選擇音樂的時候點一下沒反應的話多點幾下即可,第一次打開這屬于正常現(xiàn)象)

       

      4.特別提醒:打開的時候電腦一定要處于聯(lián)網狀態(tài)
       

      三、源代碼

       
      1.  
        <!DOCTYPE html>
      2.  
        <html lang="en">
      3.  
         
      4.  
        <head>
      5.  
        <meta charset="UTF-8">
      6.  
         
      7.  
        <title>圣誕樹</title>
      8.  
         
      9.  
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">
      10.  
         
      11.  
        <style>
      12.  
        * {
      13.  
        box-sizing: border-box;
      14.  
        }
      15.  
         
      16.  
         
      17.  
        body {
      18.  
        margin: 0;
      19.  
        height: 100vh;
      20.  
        overflow: hidden;
      21.  
        display: flex;
      22.  
        align-items: center;
      23.  
        justify-content: center;
      24.  
        background: #161616;
      25.  
        color: #c5a880;
      26.  
        font-family: sans-serif;
      27.  
        }
      28.  
         
      29.  
         
      30.  
        label {
      31.  
        display: inline-block;
      32.  
        background-color: #161616;
      33.  
        padding: 16px;
      34.  
        border-radius: 0.3rem;
      35.  
        cursor: pointer;
      36.  
        margin-top: 1rem;
      37.  
        width: 300px;
      38.  
        border-radius: 10px;
      39.  
        border: 1px solid #c5a880;
      40.  
        text-align: center;
      41.  
        }
      42.  
         
      43.  
         
      44.  
        ul {
      45.  
        list-style-type: none;
      46.  
        padding: 0;
      47.  
        margin: 0;
      48.  
        }
      49.  
         
      50.  
         
      51.  
        .btn {
      52.  
        background-color: #161616;
      53.  
        border-radius: 10px;
      54.  
        color: #c5a880;
      55.  
        border: 1px solid #c5a880;
      56.  
        padding: 16px;
      57.  
        width: 300px;
      58.  
        margin-bottom: 16px;
      59.  
        line-height: 1.5;
      60.  
        cursor: pointer;
      61.  
        }
      62.  
         
      63.  
        .separator {
      64.  
        font-weight: bold;
      65.  
        text-align: center;
      66.  
        width: 300px;
      67.  
        margin: 16px 0px;
      68.  
        color: #a07676;
      69.  
        }
      70.  
         
      71.  
         
      72.  
        .title {
      73.  
        color: #a07676;
      74.  
        font-weight: bold;
      75.  
        font-size: 1.25rem;
      76.  
        margin-bottom: 16px;
      77.  
        }
      78.  
         
      79.  
         
      80.  
        .text-loading {
      81.  
        font-size: 2rem;
      82.  
        }
      83.  
        </style>
      84.  
         
      85.  
        <script>
      86.  
        window.console = window.console || function (t) { };
      87.  
        </script>
      88.  
         
      89.  
         
      90.  
         
      91.  
        <script>
      92.  
        if (document.location.search.match(/type=embed/gi)) {
      93.  
        window.parent.postMessage("resize", "*");
      94.  
        }
      95.  
        </script>
      96.  
         
      97.  
         
      98.  
        </head>
      99.  
         
      100.  
        <body translate="no">
      101.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/build/three.min.js"></script>
      102.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/EffectComposer.js"></script>
      103.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/RenderPass.js"></script>
      104.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/ShaderPass.js"></script>
      105.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/shaders/CopyShader.js"></script>
      106.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/shaders/LuminosityHighPassShader.js"></script>
      107.  
        <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/UnrealBloomPass.js"></script>
      108.  
         
      109.  
        <div id="overlay">
      110.  
        <ul>
      111.  
        <li class="title">請選擇音樂</li>
      112.  
        <li>
      113.  
        <button class="btn" id="btnA" type="button">
      114.  
        Snowflakes Falling Down by Simon Panrucker
      115.  
        </button>
      116.  
        </li>
      117.  
        <li><button class="btn" id="btnB" type="button">This Christmas by Dott</button></li>
      118.  
        <li><button class="btn" id="btnC" type="button">No room at the inn by TRG Banks</button></li>
      119.  
        <li><button class="btn" id="btnD" type="button">Jingle Bell Swing by Mark Smeby</button></li>
      120.  
        <li class="separator">或者</li>
      121.  
        <li>
      122.  
        <input type="file" id="upload" hidden />
      123.  
        <label for="upload">Upload File</label>
      124.  
        </li>
      125.  
        </ul>
      126.  
        </div>
      127.  
         
      128.  
        <script id="rendered-js">
      129.  
        const { PI, sin, cos } = Math;
      130.  
        const TAU = 2 * PI;
      131.  
         
      132.  
        const map = (value, sMin, sMax, dMin, dMax) => {
      133.  
        return dMin + (value - sMin) / (sMax - sMin) * (dMax - dMin);
      134.  
        };
      135.  
         
      136.  
        const range = (n, m = 0) =>
      137.  
        Array(n).
      138.  
        fill(m).
      139.  
        map((i, j) => i + j);
      140.  
         
      141.  
        const rand = (max, min = 0) => min + Math.random() * (max - min);
      142.  
        const randInt = (max, min = 0) => Math.floor(min + Math.random() * (max - min));
      143.  
        const randChoise = arr => arr[randInt(arr.length)];
      144.  
        const polar = (ang, r = 1) => [r * cos(ang), r * sin(ang)];
      145.  
         
      146.  
        let scene, camera, renderer, analyser;
      147.  
        let step = 0;
      148.  
        const uniforms = {
      149.  
        time: { type: "f", value: 0.0 },
      150.  
        step: { type: "f", value: 0.0 }
      151.  
        };
      152.  
         
      153.  
        const params = {
      154.  
        exposure: 1,
      155.  
        bloomStrength: 0.9,
      156.  
        bloomThreshold: 0,
      157.  
        bloomRadius: 0.5
      158.  
        };
      159.  
         
      160.  
        let composer;
      161.  
         
      162.  
        const fftSize = 2048;
      163.  
        const totalPoints = 4000;
      164.  
         
      165.  
        const listener = new THREE.AudioListener();
      166.  
         
      167.  
        const audio = new THREE.Audio(listener);
      168.  
         
      169.  
        document.querySelector("input").addEventListener("change", uploadAudio, false);
      170.  
         
      171.  
        const buttons = document.querySelectorAll(".btn");
      172.  
        buttons.forEach((button, index) =>
      173.  
        button.addEventListener("click", () => loadAudio(index)));
      174.  
         
      175.  
         
      176.  
        function init() {
      177.  
        const overlay = document.getElementById("overlay");
      178.  
        overlay.remove();
      179.  
         
      180.  
        scene = new THREE.Scene();
      181.  
        renderer = new THREE.WebGLRenderer({ antialias: true });
      182.  
        renderer.setPixelRatio(window.devicePixelRatio);
      183.  
        renderer.setSize(window.innerWidth, window.innerHeight);
      184.  
        document.body.appendChild(renderer.domElement);
      185.  
         
      186.  
        camera = new THREE.PerspectiveCamera(
      187.  
        60,
      188.  
        window.innerWidth / window.innerHeight,
      189.  
        1,
      190.  
        1000);
      191.  
         
      192.  
        camera.position.set(-0.09397456774197047, -2.5597086635726947, 24.420789670889008);
      193.  
        camera.rotation.set(0.10443543723052419, -0.003827152981119352, 0.0004011488708739715);
      194.  
         
      195.  
        const format = renderer.capabilities.isWebGL2 ?
      196.  
        THREE.RedFormat :
      197.  
        THREE.LuminanceFormat;
      198.  
         
      199.  
        uniforms.tAudioData = {
      200.  
        value: new THREE.DataTexture(analyser.data, fftSize / 2, 1, format)
      201.  
        };
      202.  
         
      203.  
         
      204.  
        addPlane(scene, uniforms, 3000);
      205.  
        addSnow(scene, uniforms);
      206.  
         
      207.  
        range(10).map(i => {
      208.  
        addTree(scene, uniforms, totalPoints, [20, 0, -20 * i]);
      209.  
        addTree(scene, uniforms, totalPoints, [-20, 0, -20 * i]);
      210.  
        });
      211.  
         
      212.  
        const renderScene = new THREE.RenderPass(scene, camera);
      213.  
         
      214.  
        const bloomPass = new THREE.UnrealBloomPass(
      215.  
        new THREE.Vector2(window.innerWidth, window.innerHeight),
      216.  
        1.5,
      217.  
        0.4,
      218.  
        0.85);
      219.  
         
      220.  
        bloomPass.threshold = params.bloomThreshold;
      221.  
        bloomPass.strength = params.bloomStrength;
      222.  
        bloomPass.radius = params.bloomRadius;
      223.  
         
      224.  
        composer = new THREE.EffectComposer(renderer);
      225.  
        composer.addPass(renderScene);
      226.  
        composer.addPass(bloomPass);
      227.  
         
      228.  
        addListners(camera, renderer, composer);
      229.  
        animate();
      230.  
        }
      231.  
         
      232.  
        function animate(time) {
      233.  
        analyser.getFrequencyData();
      234.  
        uniforms.tAudioData.value.needsUpdate = true;
      235.  
        step = (step + 1) % 1000;
      236.  
        uniforms.time.value = time;
      237.  
        uniforms.step.value = step;
      238.  
        composer.render();
      239.  
        requestAnimationFrame(animate);
      240.  
        }
      241.  
         
      242.  
        function loadAudio(i) {
      243.  
        document.getElementById("overlay").innerHTML =
      244.  
        '<div class="text-loading">正在下載音樂,請稍等...</div>';
      245.  
        const files = [
      246.  
        "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Simon_Panrucker/Happy_Christmas_You_Guys/Simon_Panrucker_-_01_-_Snowflakes_Falling_Down.mp3",
      247.  
        "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Dott/This_Christmas/Dott_-_01_-_This_Christmas.mp3",
      248.  
        "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/TRG_Banks/TRG_Banks_Christmas_Album/TRG_Banks_-_12_-_No_room_at_the_inn.mp3",
      249.  
        "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/Mark_Smeby/En_attendant_Nol/Mark_Smeby_-_07_-_Jingle_Bell_Swing.mp3"];
      250.  
         
      251.  
        const file = files[i];
      252.  
         
      253.  
        const loader = new THREE.AudioLoader();
      254.  
        loader.load(file, function (buffer) {
      255.  
        audio.setBuffer(buffer);
      256.  
        audio.play();
      257.  
        analyser = new THREE.AudioAnalyser(audio, fftSize);
      258.  
        init();
      259.  
        });
      260.  
         
      261.  
         
      262.  
         
      263.  
         
      264.  
        }
      265.  
         
      266.  
         
      267.  
        function uploadAudio(event) {
      268.  
        document.getElementById("overlay").innerHTML =
      269.  
        '<div class="text-loading">請稍等...</div>';
      270.  
        const files = event.target.files;
      271.  
        const reader = new FileReader();
      272.  
         
      273.  
        reader.onload = function (file) {
      274.  
        var arrayBuffer = file.target.result;
      275.  
         
      276.  
        listener.context.decodeAudioData(arrayBuffer, function (audioBuffer) {
      277.  
        audio.setBuffer(audioBuffer);
      278.  
        audio.play();
      279.  
        analyser = new THREE.AudioAnalyser(audio, fftSize);
      280.  
        init();
      281.  
        });
      282.  
        };
      283.  
         
      284.  
        reader.readAsArrayBuffer(files[0]);
      285.  
        }
      286.  
         
      287.  
        function addTree(scene, uniforms, totalPoints, treePosition) {
      288.  
        const vertexShader = `
      289.  
        attribute float mIndex;
      290.  
        varying vec3 vColor;
      291.  
        varying float opacity;
      292.  
        uniform sampler2D tAudioData;
      293.  
        float norm(float value, float min, float max ){
      294.  
        return (value - min) / (max - min);
      295.  
        }
      296.  
        float lerp(float norm, float min, float max){
      297.  
        return (max - min) * norm + min;
      298.  
        }
      299.  
        float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
      300.  
        return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
      301.  
        }
      302.  
        void main() {
      303.  
        vColor = color;
      304.  
        vec3 p = position;
      305.  
        vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );
      306.  
        float amplitude = texture2D( tAudioData, vec2( mIndex, 0.1 ) ).r;
      307.  
        float amplitudeClamped = clamp(amplitude-0.4,0.0, 0.6 );
      308.  
        float sizeMapped = map(amplitudeClamped, 0.0, 0.6, 1.0, 20.0);
      309.  
        opacity = map(mvPosition.z , -200.0, 15.0, 0.0, 1.0);
      310.  
        gl_PointSize = sizeMapped * ( 100.0 / -mvPosition.z );
      311.  
        gl_Position = projectionMatrix * mvPosition;
      312.  
        }
      313.  
        `;
      314.  
        const fragmentShader = `
      315.  
        varying vec3 vColor;
      316.  
        varying float opacity;
      317.  
        uniform sampler2D pointTexture;
      318.  
        void main() {
      319.  
        gl_FragColor = vec4( vColor, opacity );
      320.  
        gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );
      321.  
        }
      322.  
        `;
      323.  
        const shaderMaterial = new THREE.ShaderMaterial({
      324.  
        uniforms: {
      325.  
        ...uniforms,
      326.  
        pointTexture: {
      327.  
        value: new THREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`)
      328.  
        }
      329.  
        },
      330.  
         
      331.  
         
      332.  
        vertexShader,
      333.  
        fragmentShader,
      334.  
        blending: THREE.AdditiveBlending,
      335.  
        depthTest: false,
      336.  
        transparent: true,
      337.  
        vertexColors: true
      338.  
        });
      339.  
         
      340.  
         
      341.  
        const geometry = new THREE.BufferGeometry();
      342.  
        const positions = [];
      343.  
        const colors = [];
      344.  
        const sizes = [];
      345.  
        const phases = [];
      346.  
        const mIndexs = [];
      347.  
         
      348.  
        const color = new THREE.Color();
      349.  
         
      350.  
        for (let i = 0; i < totalPoints; i++) {
      351.  
        const t = Math.random();
      352.  
        const y = map(t, 0, 1, -8, 10);
      353.  
        const ang = map(t, 0, 1, 0, 6 * TAU) + TAU / 2 * (i % 2);
      354.  
        const [z, x] = polar(ang, map(t, 0, 1, 5, 0));
      355.  
         
      356.  
        const modifier = map(t, 0, 1, 1, 0);
      357.  
        positions.push(x + rand(-0.3 * modifier, 0.3 * modifier));
      358.  
        positions.push(y + rand(-0.3 * modifier, 0.3 * modifier));
      359.  
        positions.push(z + rand(-0.3 * modifier, 0.3 * modifier));
      360.  
         
      361.  
        color.setHSL(map(i, 0, totalPoints, 1.0, 0.0), 1.0, 0.5);
      362.  
         
      363.  
        colors.push(color.r, color.g, color.b);
      364.  
        phases.push(rand(1000));
      365.  
        sizes.push(1);
      366.  
        const mIndex = map(i, 0, totalPoints, 1.0, 0.0);
      367.  
        mIndexs.push(mIndex);
      368.  
        }
      369.  
         
      370.  
        geometry.setAttribute(
      371.  
        "position",
      372.  
        new THREE.Float32BufferAttribute(positions, 3).setUsage(
      373.  
        THREE.DynamicDrawUsage));
      374.  
         
      375.  
         
      376.  
        geometry.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
      377.  
        geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));
      378.  
        geometry.setAttribute("phase", new THREE.Float32BufferAttribute(phases, 1));
      379.  
        geometry.setAttribute("mIndex", new THREE.Float32BufferAttribute(mIndexs, 1));
      380.  
         
      381.  
        const tree = new THREE.Points(geometry, shaderMaterial);
      382.  
         
      383.  
        const [px, py, pz] = treePosition;
      384.  
         
      385.  
        tree.position.x = px;
      386.  
        tree.position.y = py;
      387.  
        tree.position.z = pz;
      388.  
         
      389.  
        scene.add(tree);
      390.  
        }
      391.  
         
      392.  
        function addSnow(scene, uniforms) {
      393.  
        const vertexShader = `
      394.  
        attribute float size;
      395.  
        attribute float phase;
      396.  
        attribute float phaseSecondary;
      397.  
        varying vec3 vColor;
      398.  
        varying float opacity;
      399.  
        uniform float time;
      400.  
        uniform float step;
      401.  
        float norm(float value, float min, float max ){
      402.  
        return (value - min) / (max - min);
      403.  
        }
      404.  
        float lerp(float norm, float min, float max){
      405.  
        return (max - min) * norm + min;
      406.  
        }
      407.  
        float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
      408.  
        return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
      409.  
        }
      410.  
        void main() {
      411.  
        float t = time* 0.0006;
      412.  
        vColor = color;
      413.  
        vec3 p = position;
      414.  
        p.y = map(mod(phase+step, 1000.0), 0.0, 1000.0, 25.0, -8.0);
      415.  
        p.x += sin(t+phase);
      416.  
        p.z += sin(t+phaseSecondary);
      417.  
        opacity = map(p.z, -150.0, 15.0, 0.0, 1.0);
      418.  
        vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );
      419.  
        gl_PointSize = size * ( 100.0 / -mvPosition.z );
      420.  
        gl_Position = projectionMatrix * mvPosition;
      421.  
        }
      422.  
        `;
      423.  
         
      424.  
        const fragmentShader = `
      425.  
        uniform sampler2D pointTexture;
      426.  
        varying vec3 vColor;
      427.  
        varying float opacity;
      428.  
        void main() {
      429.  
        gl_FragColor = vec4( vColor, opacity );
      430.  
        gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );
      431.  
        }
      432.  
        `;
      433.  
        function createSnowSet(sprite) {
      434.  
        const totalPoints = 300;
      435.  
        const shaderMaterial = new THREE.ShaderMaterial({
      436.  
        uniforms: {
      437.  
        ...uniforms,
      438.  
        pointTexture: {
      439.  
        value: new THREE.TextureLoader().load(sprite)
      440.  
        }
      441.  
        },
      442.  
         
      443.  
         
      444.  
        vertexShader,
      445.  
        fragmentShader,
      446.  
        blending: THREE.AdditiveBlending,
      447.  
        depthTest: false,
      448.  
        transparent: true,
      449.  
        vertexColors: true
      450.  
        });
      451.  
         
      452.  
         
      453.  
        const geometry = new THREE.BufferGeometry();
      454.  
        const positions = [];
      455.  
        const colors = [];
      456.  
        const sizes = [];
      457.  
        const phases = [];
      458.  
        const phaseSecondaries = [];
      459.  
         
      460.  
        const color = new THREE.Color();
      461.  
         
      462.  
        for (let i = 0; i < totalPoints; i++) {
      463.  
        const [x, y, z] = [rand(25, -25), 0, rand(15, -150)];
      464.  
        positions.push(x);
      465.  
        positions.push(y);
      466.  
        positions.push(z);
      467.  
         
      468.  
        color.set(randChoise(["#f1d4d4", "#f1f6f9", "#eeeeee", "#f1f1e8"]));
      469.  
         
      470.  
        colors.push(color.r, color.g, color.b);
      471.  
        phases.push(rand(1000));
      472.  
        phaseSecondaries.push(rand(1000));
      473.  
        sizes.push(rand(4, 2));
      474.  
        }
      475.  
         
      476.  
        geometry.setAttribute(
      477.  
        "position",
      478.  
        new THREE.Float32BufferAttribute(positions, 3));
      479.  
         
      480.  
        geometry.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
      481.  
        geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));
      482.  
        geometry.setAttribute("phase", new THREE.Float32BufferAttribute(phases, 1));
      483.  
        geometry.setAttribute(
      484.  
        "phaseSecondary",
      485.  
        new THREE.Float32BufferAttribute(phaseSecondaries, 1));
      486.  
         
      487.  
         
      488.  
        const mesh = new THREE.Points(geometry, shaderMaterial);
      489.  
         
      490.  
        scene.add(mesh);
      491.  
        }
      492.  
        const sprites = [
      493.  
        "https://assets.codepen.io/3685267/snowflake1.png",
      494.  
        "https://assets.codepen.io/3685267/snowflake2.png",
      495.  
        "https://assets.codepen.io/3685267/snowflake3.png",
      496.  
        "https://assets.codepen.io/3685267/snowflake4.png",
      497.  
        "https://assets.codepen.io/3685267/snowflake5.png"];
      498.  
         
      499.  
        sprites.forEach(sprite => {
      500.  
        createSnowSet(sprite);
      501.  
        });
      502.  
        }
      503.  
         
      504.  
        function addPlane(scene, uniforms, totalPoints) {
      505.  
        const vertexShader = `
      506.  
        attribute float size;
      507.  
        attribute vec3 customColor;
      508.  
        varying vec3 vColor;
      509.  
        void main() {
      510.  
        vColor = customColor;
      511.  
        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
      512.  
        gl_PointSize = size * ( 300.0 / -mvPosition.z );
      513.  
        gl_Position = projectionMatrix * mvPosition;
      514.  
        }
      515.  
        `;
      516.  
        const fragmentShader = `
      517.  
        uniform vec3 color;
      518.  
        uniform sampler2D pointTexture;
      519.  
        varying vec3 vColor;
      520.  
        void main() {
      521.  
        gl_FragColor = vec4( vColor, 1.0 );
      522.  
        gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );
      523.  
        }
      524.  
        `;
      525.  
        const shaderMaterial = new THREE.ShaderMaterial({
      526.  
        uniforms: {
      527.  
        ...uniforms,
      528.  
        pointTexture: {
      529.  
        value: new THREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`)
      530.  
        }
      531.  
        },
      532.  
         
      533.  
         
      534.  
        vertexShader,
      535.  
        fragmentShader,
      536.  
        blending: THREE.AdditiveBlending,
      537.  
        depthTest: false,
      538.  
        transparent: true,
      539.  
        vertexColors: true
      540.  
        });
      541.  
         
      542.  
         
      543.  
        const geometry = new THREE.BufferGeometry();
      544.  
        const positions = [];
      545.  
        const colors = [];
      546.  
        const sizes = [];
      547.  
         
      548.  
        const color = new THREE.Color();
      549.  
         
      550.  
        for (let i = 0; i < totalPoints; i++) {
      551.  
        const [x, y, z] = [rand(-25, 25), 0, rand(-150, 15)];
      552.  
        positions.push(x);
      553.  
        positions.push(y);
      554.  
        positions.push(z);
      555.  
         
      556.  
        color.set(randChoise(["#93abd3", "#f2f4c0", "#9ddfd3"]));
      557.  
         
      558.  
        colors.push(color.r, color.g, color.b);
      559.  
        sizes.push(1);
      560.  
        }
      561.  
         
      562.  
        geometry.setAttribute(
      563.  
        "position",
      564.  
        new THREE.Float32BufferAttribute(positions, 3).setUsage(
      565.  
        THREE.DynamicDrawUsage));
      566.  
         
      567.  
         
      568.  
        geometry.setAttribute(
      569.  
        "customColor",
      570.  
        new THREE.Float32BufferAttribute(colors, 3));
      571.  
         
      572.  
        geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));
      573.  
         
      574.  
        const plane = new THREE.Points(geometry, shaderMaterial);
      575.  
         
      576.  
        plane.position.y = -8;
      577.  
        scene.add(plane);
      578.  
        }
      579.  
         
      580.  
        function addListners(camera, renderer, composer) {
      581.  
        document.addEventListener("keydown", e => {
      582.  
        const { x, y, z } = camera.position;
      583.  
        console.log(`camera.position.set(${x},${y},${z})`);
      584.  
        const { x: a, y: b, z: c } = camera.rotation;
      585.  
        console.log(`camera.rotation.set(${a},${b},${c})`);
      586.  
        });
      587.  
         
      588.  
        window.addEventListener(
      589.  
        "resize",
      590.  
        () => {
      591.  
        const width = window.innerWidth;
      592.  
        const height = window.innerHeight;
      593.  
         
      594.  
        camera.aspect = width / height;
      595.  
        camera.updateProjectionMatrix();
      596.  
         
      597.  
        renderer.setSize(width, height);
      598.  
        composer.setSize(width, height);
      599.  
        },
      600.  
        false);
      601.  
         
      602.  
        }
      603.  
        </script>
      604.  
         
      605.  
        </body>
      606.  
         
      607.  
        </html>
       

      日歷

      鏈接

      個人資料

      藍藍設計的小編 http://www.li-bodun.cn

      存檔

      主站蜘蛛池模板: 四虎影在永久在线观看| 国产xxxx99真实实拍| 无码中文字幕加勒比高清| 在线播放无码字幕亚洲| 性一交一乱一伧国产女士spa| 国产一区二区波多野结衣| 亚洲区一区二区三区精品| 久久精品夜色噜噜亚洲av| 免费无码又爽又刺激高潮的视频免费| 自拍偷自拍亚洲精品播放| 亚洲精品国产精品国产自2022| 国产无套粉嫩白浆在线| 国产乱子伦精品免费女| 象山县| 久久国产精99精产国高潮| 999国产精品999久久久久久| 怡红院av亚洲一区二区三区h| 日韩精品亚洲专区在线播放| 在线看免费无码av天堂| 国产小视频a在线观看| 亚洲色欲色欲大片www无码| 无码成人一区二区三区| 国产成人亚洲综合网色欲网久下载| 色婷婷综合和线在线| 老司机久久99久久精品播放免费| 日夜啪啪一区二区三区| 日本熟妇人妻xxxxx-欢迎您| 日韩A级毛片一区二区三区| 亚洲国产高清在线一区二区三区| 亚洲aⅴ无码专区在线观看| 日本熟妇色xxxxx日本免费看| 亚洲午夜成人精品电影在线观看| 久久天堂综合亚洲伊人hd| 国产精品理论片在线观看| 国产午夜美女福利短视频| 福贡县| 国产成人精品一区二区三 | 建水县| 亚洲熟妇色xxxxx欧美老妇y| 久久精品只有这里有| 欧美乱人伦中文字幕在线 |