vue three基础知识笔记

1、安装依赖

cnpm i three gsap dat.gui three-orbit-controls --save

2、使用

<template>
  <div class="home" ref="container"> </div>
</template>
<script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as dat from "dat.gui";
export default {
  name: 'Home',
  data() {
    return {
      container:null,
      camera: null,
      scene: null,
      renderer: null,
      mesh: null,
      controls:null
    }
  },
  mounted () {
    //初始化
    this.init();
    //动画
    this.animate(); 
    //初始化gui
    this.initGUI()
    // 监听画面变化(放置代码末尾)
    window.addEventListener("resize", () => {
      //更新摄像头
      this.camera.aspect = this.container.clientWidth / this.container.clientHeight;
      // 更新摄像机投影矩阵
      this.camera.updateProjectionMatrix();
      // 更新渲染器
      this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
      // 设置渲染器像素比
      this.renderer.setPixelRatio(window.devicePixelRatio);
    }); 

  },
  methods: {
    init() {
      this.container = this.$refs.container;
      
      //创建场景
      this.scene = new THREE.Scene();
       //设置相机
      this.camera = new THREE.PerspectiveCamera(75,this.container.clientWidth / this.container.clientHeight,0.1,1000);
      this.camera.position.set(0, 0, 10);// 设置相机位置
      this.scene.add(this.camera);// 添加相机到场景中
      //  创建网格模型
      const geometry = new THREE.BoxGeometry(3, 3, 3); //创建一个立方体几何对象Geometry
      const material = new THREE.MeshLambertMaterial({
        color: 0x00ff00,
       // wireframe:true,//线框
      }); //材质对象Material
      this.mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh关联几何体和材质
      this.scene.add(this.mesh); //网格模型添加到场景中
      //设置光源
      const point = new THREE.PointLight(0xffffff); //点光源
      point.position.set(300, 400, 500); //点光源位置
      this.scene.add(point); //点光源添加到场景中
      const ambient = new THREE.AmbientLight(0x444444);//环境光
      this.scene.add(ambient); //环境光添加到场景中
      //创建渲染器对象
      this.renderer = new THREE.WebGLRenderer();
      this.renderer.setSize(this.container.clientWidth, this.container.clientHeight); //设置渲染区域尺寸
      //renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
      // 将webgl渲染的canvas内容添加到body
      this.container.appendChild(this.renderer.domElement); 
      // 添加轨道控制器
      this.controls = new OrbitControls(this.camera, this.renderer.domElement);
      this.controls.enableDamping = true;// 设置轨道自然
      this.controls.update() // 设置惯性
      // 添加坐标轴辅助器
      const axesHelper = new THREE.AxesHelper(5);
      this.scene.add(axesHelper); 
      
     
    },
    initGUI(){
      // 应用图形界面更改变量
        const gui = new dat.GUI();
        gui.add(this.mesh.position, "x").min(0) // 最小值.max(5) // 最大值.step(0.05) // 调节的精度.name("移动x坐标") // 属性名.onChange((value) => { //监听回调console.log("值被修改了:", value);});

        // 修改物体的颜色
        const params = {color: "#fff",fn: () => {gsap.to(this.mesh.position, {x: 5,ease: "power1.out",duration: 5,repeat: -1,yoyo: true,});},
        };
        gui.addColor(params, "color").onChange((value) => {this.mesh.material.color.set(value)
        });

        // 设置是否显示目标物
        gui.add(this.mesh, "visible").name("是否显示");

        // 添加文件夹
        var folder = gui.addFolder("设置立方体");
        // 将配置材质的属性加入folder文件夹
        folder.add(this.mesh.material, "wireframe");
        // 将点击触发某个事件的方法加入到folder文件夹
        folder.add(params, "fn").name("立方体运动"); 

    },
    animate() {
      this.controls.update();
      // this.mesh.rotation.y += 0.005;
      // 将几何体旋转
      //gsap.to(this.mesh.position, { x: 2 * Math.PI, duration: 5, repeat: -1 }); 
      gsap.to(this.mesh.position, {
          x: 5, // 沿x轴移动5个像素
          ease: 'power3', // 使用***模式进行移动
          duration:3, // 持续时间5秒
          repeat: -1, // 循环执行
          yoyo: true, // 动画流畅度优化
          onComplete:()=>{}//动画完毕后调用的函数
      });
      this.renderer.render(this.scene, this.camera);// 渲染下一帧的时候就调用
      requestAnimationFrame(this.animate);
    }

  },
}
</script>
<style lang="scss" scoped>
.home{
  width: 100%;
  height: 100%;
  background: #000;
  overflow: hidden;
}
</style>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值