vue3使用Threejs不生效找不到THREE,换个版本试试

一、版本

“three”: “^0.152.2”,

二、3D粒子波浪效果

<template>
  <div class="LatheBufferGeometry"></div>
</template>
<script>
import * as THREE from "three"
export default {
  name: 'LatheBufferGeometry',
  setup() {

    var SEPARATION = 100, AMOUNTX = 50, AMOUNTY = 50;

    var container;
    var camera, scene, renderer;

    var particles, particle, count = 0;

    var mouseX = 0, mouseY = 0;

    var windowHalfX = window.innerWidth / 2;
    var windowHalfY = window.innerHeight / 2;

    // setTimeout(() => {
    //   console.log(THREE)
    //   init();
    //   animate();
    // }, 10000)


    // function init() {

    //   container = document.createElement('div');
    //   document.body.appendChild(container);

    //   camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
    //   camera.position.z = 1000;

    //   scene = new THREE.Scene();

    //   particles = new Array();

    //   var PI2 = Math.PI * 2;
    //   var material = new THREE.ParticleCanvasMaterial({

    //     color: 0xffffff,
    //     program: function (context) {

    //       context.beginPath();
    //       context.arc(0, 0, 1, 0, PI2, true);
    //       context.fill();

    //     }

    //   });

    //   var i = 0;

    //   for (var ix = 0; ix < AMOUNTX; ix++) {

    //     for (var iy = 0; iy < AMOUNTY; iy++) {

    //       particle = particles[i++] = new THREE.Particle(material);
    //       particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2);
    //       particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2);
    //       scene.add(particle);

    //     }

    //   }

    //   renderer = new THREE.CanvasRenderer();
    //   renderer.setSize(window.innerWidth, window.innerHeight);
    //   container.appendChild(renderer.domElement);

    //   document.addEventListener('mousemove', onDocumentMouseMove, false);
    //   document.addEventListener('touchstart', onDocumentTouchStart, false);
    //   document.addEventListener('touchmove', onDocumentTouchMove, false);

    //   //

    //   window.addEventListener('resize', onWindowResize, false);

    // }

    // function onWindowResize() {

    //   windowHalfX = window.innerWidth / 2;
    //   windowHalfY = window.innerHeight / 2;

    //   camera.aspect = window.innerWidth / window.innerHeight;
    //   camera.updateProjectionMatrix();

    //   renderer.setSize(window.innerWidth, window.innerHeight);

    // }

    // //

    // function onDocumentMouseMove(event) {

    //   mouseX = event.clientX - windowHalfX;
    //   mouseY = event.clientY - windowHalfY;

    // }

    // function onDocumentTouchStart(event) {

    //   if (event.touches.length === 1) {

    //     event.preventDefault();

    //     mouseX = event.touches[0].pageX - windowHalfX;
    //     mouseY = event.touches[0].pageY - windowHalfY;

    //   }

    // }

    // function onDocumentTouchMove(event) {

    //   if (event.touches.length === 1) {

    //     event.preventDefault();

    //     mouseX = event.touches[0].pageX - windowHalfX;
    //     mouseY = event.touches[0].pageY - windowHalfY;

    //   }

    // }

    // //

    // function animate() {

    //   requestAnimationFrame(animate);

    //   render();


    // }

    // function render() {

    //   camera.position.x += (mouseX - camera.position.x) * .05;
    //   camera.position.y += (- mouseY - camera.position.y) * .05;
    //   camera.lookAt(scene.position);

    //   var i = 0;

    //   for (var ix = 0; ix < AMOUNTX; ix++) {

    //     for (var iy = 0; iy < AMOUNTY; iy++) {

    //       particle = particles[i++];
    //       particle.position.y = (Math.sin((ix + count) * 0.3) * 50) + (Math.sin((iy + count) * 0.5) * 50);
    //       particle.scale.x = particle.scale.y = (Math.sin((ix + count) * 0.3) + 1) * 2 + (Math.sin((iy + count) * 0.5) + 1) * 2;

    //     }

    //   }

    //   renderer.render(scene, camera);

    //   count += 0.1;

    // }



    const init = () => {
      container = document.createElement('div')
      document.body.appendChild(container)
      camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000)
      camera.position.z = 1000
      scene = new THREE.Scene()

      // 添加背景图
      // const texture = new THREE.TextureLoader().load(require('../assets/img/index/home-bg.png'))
      // scene.background = texture

      particles = []
      const PI2 = Math.PI * 1
      const material = new THREE.SpriteMaterial({
        color: '#DFF9FE',
        program: (context) => {
          context.beginPath()
          context.arc(0, 0, 1, 0, PI2, true)
          context.fill()
        }
      })

      let i = 0
      for (let ix = 0; ix < AMOUNTX; ix++) {
        for (let iy = 0; iy < AMOUNTY; iy++) {
          particle = particles[i++] = new THREE.Sprite(material)
          particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2)
          particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2)
          scene.add(particle)
        }
      }
      renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
      // 设置透明度
      renderer.setClearAlpha(0.2)
      renderer.setSize(window.innerWidth, window.innerHeight)
      container.appendChild(renderer.domElement)

      document.addEventListener('mousemove', onDocumentMouseMove, false)
      document.addEventListener('touchstart', onDocumentTouchStart, false)
      document.addEventListener('touchmove', onDocumentTouchMove, false)
      window.addEventListener('resize', onWindowResize, false)
    }

    const onWindowResize = () => {
      windowHalfX = window.innerWidth / 2
      windowHalfY = window.innerHeight / 2
      camera.aspect = window.innerWidth / window.innerHeight
      camera.updateProjectionMatrix()
      renderer.setSize(window.innerWidth, window.innerHeight)
    }

    const onDocumentMouseMove = (event) => {
      mouseX = event.clientX - windowHalfX
      mouseY = event.clientY - windowHalfY
    }

    const onDocumentTouchStart = (event) => {
      if (event.touches.length === 1) {
        event.preventDefault()
        mouseX = event.touches[0].pageX - windowHalfX
        mouseY = event.touches[0].pageY - windowHalfY
      }
    }

    const onDocumentTouchMove = (event) => {
      if (event.touches.length === 1) {
        event.preventDefault()
        mouseX = event.touches[0].pageX - windowHalfX
        mouseY = event.touches[0].pageY - windowHalfY
      }
    }

    const animate = () => {
      // stats.begin()
      // stats.end()
      requestAnimationFrame(animate)
      render()
    }

    const render = () => {
      camera.position.x += (mouseX - camera.position.x) * 0.05
      camera.position.y += (-mouseY - camera.position.y) * 0.05
      camera.lookAt(scene.position)

      let i = 0
      for (let ix = 0; ix < AMOUNTX; ix++) {
        for (let iy = 0; iy < AMOUNTY; iy++) {
          particle = particles[i++]
          particle.position.y = (Math.sin((ix + count) * 0.3) * 50) + (Math.sin((iy + count) * 0.5) * 50)
          particle.scale.x = particle.scale.y = (Math.sin((ix + count) * 0.3) + 1) * 2 + (Math.sin((iy + count) * 0.5) + 1) * 2
        }
      }

      renderer.render(scene, camera)
      count += 0.1
    }

    setTimeout(() => {
      console.log(THREE)
      // 初始化
      init()
      animate()
    }, 1000)



  }
}
</script>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中使用Three.js建立一个3D农田,你可以按照以下步骤进行: 1. 首先,确保你已经安装了Vue 3和Three.js。你可以使用以下命令进行安装: ``` npm install vue@next three ``` 2. 在Vue项目的入口文件(通常是`main.js`)中,导入VueThree.js: ```javascript import { createApp } from 'vue'; import * as THREE from 'three'; ``` 3. 创建一个Vue组件来容纳Three.js的场景。在该组件中,你可以使用Three.js的API来创建3D场景、模型和材质等。下面是一个简单的示例: ```javascript <template> <div ref="canvas"></div> </template> <script> export default { mounted() { // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 5; // 创建渲染器 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); this.$refs.canvas.appendChild(renderer.domElement); // 创建立方体 const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube = new THREE.Mesh(geometry, material); scene.add(cube); // 渲染场景 function animate() { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); } animate(); }, }; </script> ``` 这个示例中,我们创建了一个简单的场景,包含一个立方体,并通过动画让其旋转起来。你可以根据自己的需求,使用Three.js提供的各种功能来创建农田的模型和材质。 注意:以上示例只是一个简单的起点,你可以根据自己的需求进一步扩展和定制。在实际开发中,你可能需要加载外部模型、应用纹理、调整光照等。 希望这个示例可以帮助你开始在Vue 3中使用Three.js创建3D农田!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值