<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • 好看的圣誕樹(動態效果) 轉自 csdn

    2023-12-25    前端達人

    、制作方法 

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

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

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

     

    4.特別提醒:打開的時候電腦一定要處于聯網狀態
     

    三、源代碼

     
    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},$,${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.skdbbs.com

    存檔

    主站蜘蛛池模板: 欧美一区二区精品久久| 亚洲午夜久久久精品影院| 久久99精品久久久久久| 538国产精品一区二区在线| 国产精品视频一区二区噜噜| 久久精品99久久香蕉国产色戒| 亚洲人成国产精品无码| 欧洲精品码一区二区三区免费看 | 国产精品熟女高潮视频| 免费人成在线观看欧美精品 | 亚洲精品久久久www| 亚洲精品乱码久久久久久不卡| 午夜精品美女自拍福到在线| 老司机性色福利精品视频| 国产99视频精品一区| 99久久夜色精品国产网站| 久草热久草热线频97精品| 亚洲精品V欧洲精品V日韩精品 | 久久精品国产99久久久香蕉| 日本精品少妇一区二区三区| 蜜臀av无码人妻精品| 99精品福利国产在线| 91久久精品视频| 亚洲国产精品激情在线观看| 国产精品一区二区av不卡| 欧美成人精品高清在线播放| 国产成人精品免费大全| 久久国产精品一区二区| 国产成人精品久久二区二区| 国产成人精品无码片区在线观看| 无码精品黑人一区二区三区| 99精品在线观看| 国产精品午睡沙发系列| 人妻熟妇乱又伦精品视频 | 欧美国产成人精品一区二区三区| 国产A∨国片精品一区二区| 久久精品国产99国产精偷 | 国产伦精品一区二区三区女 | 亚洲国产精品综合久久网络| 久久久精品国产亚洲成人满18免费网站 | 国产成人精品久久二区二区|