ThreeJS-文件夹、线框、点击按钮触发函数(七)

news/2025/1/17 3:38:46/

代码:

<template>

  <div id="three_div"></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",

  components: {

    // vueQr,

    // glHome,

  },

  data() {

    return {};

  },

  mounted() {

    //使用控制器控制3D拖动旋转OrbitControls

    //控制3D物体移动

    //1.创建场景

    const scene = new THREE.Scene();

    console.log(scene);

    //2.创建相机

    const camera = new THREE.PerspectiveCamera(

      75,

      window.innerWidth / window.innerHeight,

      0.1,

      1000

    );

    //设置相机位置

    camera.position.set(0, 0, 10);

    //将相机添加到场景

    scene.add(camera);

    //添加物体

    //创建几何体

    const cubeGeometry = new THREE.BoxGeometry(2, 2, 2);

    const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });

    //根据几何体和材质创建物体

    const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);

    //将物体加入到场景

    scene.add(mesh);

    //添加坐标轴辅助器

    const axesHepler = new THREE.AxesHelper(5);

    scene.add(axesHepler);

    //初始化渲染器

    const render = new THREE.WebGLRenderer();

    //设置渲染器的尺寸

    render.setSize(window.innerWidth, window.innerHeight);

    //使用渲染器,通过相机将场景渲染进来

    //创建轨道控制器,可以拖动,控制的是摄像头

    const controls = new OrbitControls(camera, render.domElement);

    //设置控制阻尼,让控制器有更真实的效果

    controls.enableDamping = true;

    //将webgl渲染的canvas内容添加到body上

    document.getElementById("three_div").appendChild(render.domElement);

    //修改3D位置

    mesh.position.set(0, 0, 0);

    // render.render(scene, camera);

    //渲染下一帧的时候就会调用回调函数

    let renderFun = () => {

      //更新阻尼数据

      controls.update();

      //需要重新绘制canvas画布

      render.render(scene, camera);

      //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数

      //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果

      window.requestAnimationFrame(renderFun);

    };

    // window.requestAnimationFrame(renderFun);

    renderFun();

    //画布全屏

    window.addEventListener("dblclick", () => {

      if (document.fullscreenElement) {

        document.exitFullscreen();

      } else {

        //document.documentElement.requestFullscreen();

        render.domElement.requestFullscreen();

      }

    });

    //监听画面变化,更新渲染画面,(自适应的大小)

    window.addEventListener("resize", () => {

      //更新摄像机的宽高比

      camera.aspect = window.innerWidth / window.innerHeight;

      //更新摄像机的投影矩阵

      camera.updateProjectionMatrix();

      //更新渲染器宽度和高度

      render.setSize(window.innerWidth, window.innerHeight);

      //设置渲染器的像素比

      render.setPixelRatio(window.devicePixelRatio);

      console.log("画面变化了");

    });

    //创建gui

    const gui = new dat.GUI();

    //添加gui控制

    gui

      .add(mesh.position, "y")

      .min(0)

      .max(20)

      .step(0.01)

      .name("移动y轴坐标")

      .onChange((value) => {

        console.log("值被修改为", value);

      })

      .onFinishChange((value) => {

        console.log("完全停下来", value);

      });

    //修改物体的颜色

    const param = {

      color: "#ffff00",

      fn: () => {

        var animate1 = gsap.to(mesh.position, {

          x: 5,

          duration: 3,

          ease: "power1.out", //速度https://greensock.com/get-started/#easing

          repeat: -1, //设置成-1无限制循环

          yoyo: true, //往返运动

          delay: 2, //延迟两秒开始动画

          onComplete: () => {

            console.log("动画完成");

          },

          onStart: () => {

            console.log("动画开始");

          },

        });

        // //动态组件

        // window.addEventListener("dblclick", () => {

        //   console.log(animate1);

        //   if (animate1.isActive()) {

        //     animate1.pause(); //暂停

        //   } else {

        //     animate1.resume(); //恢复

        //   }

        // });

      },

    };

    gui.addColor(param, "color").onChange((value) => {

      mesh.material.color.set(value);

      console.log("颜色发生变化", value);

    });

    //控制物体是否显示

    gui.add(mesh, "visible").name("显示");

    //设置按钮点击触发耨个时间

    gui.add(param, "fn").name("点击立方体运行");

    //设置文件夹

    let folder =  gui.addFolder("文件夹");

    folder.add(mesh.material, "wireframe").name("线框")

  },

  methods: {

    paush(animate) {

      animate.pause();

    },

  },

};

</script>

<style scoped lang="scss">

</style>

效果:


http://www.ppmy.cn/news/37828.html

相关文章

Python 自建项目上传到 PyPI 之后通过 pip 可安装

Python 自建项目上传到 PyPI 之后通过 pip 可安装1. 登录 PyPI 网站2. 创建一个 Python 项目3. 文件信息LICENSEMANIFEST.inpyproject.tomlREADME.mdrequirements.txt4. 上传到 PyPI 上5. 查看1. 登录 PyPI 网站 官方网站: https://pypi.org/ 注册登录后可以进行查看文档: http…

Springboot异常统一处理,并保存异常日志到数据库中

一、为什么要进行统一异常处理 如果发生了异常我们应该让接口可以返回统一的结果。有好的展示给接口调用方。方便我们对异常进行记录&#xff0c;和错误排查。我们可能对某些异常比较关注&#xff0c;比如说我们监控某个IP或者用户一天发送短信的数量&#xff0c;当超出一定数…

二叉树的前序、中序、后序、层序遍历

1. 二叉树的前序遍历 前序遍历&#xff1a;根左右&#xff0c;即对于每一棵子树&#xff0c;先遍历其根节点&#xff0c;然后遍历其左子树&#xff0c;最后遍历其右子树 题目简述&#xff1a;给你二叉树的根节点root&#xff0c;返回它节点值的前序遍历。leetcode链接 思路一&a…

ToBeWritten之IoT静/动态环境搭建

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

【Docker学习笔记】9.Docker Machine及Swarm 集群管理

前言 本章介绍Docker Machine及Swarm 集群管理。 Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具&#xff0c;并可以使用 docker-machine 命令来管理主机。 Docker Machine 也可以集中管理所有的 docker 主机&#xff0c;比如快速的给 …

RK3568 buildroot文件系统下的三屏显示

启扬智能IAC-RK3568-Kit开发板基于瑞芯微RK3568四核Cortex-A55处理器&#xff0c;支持HDMI、LVDS、MIPI、EDP四种显示接口&#xff0c;能够实现三屏同显&#xff0c;三屏异显&#xff0c;满足智能广告机、智能终端、游戏设备、多屏互动、多媒体设备等多样化的显示需求。 三屏显…

MyBatis 03 -MyBatis映射

MyBatis映射1 ORM映射1.1 MyBatis自动ORM失效1.2 方案一&#xff1a;列的别名1.3 方案二&#xff1a;直接使用Map集合映射结果1.4 方案三&#xff1a;自定义结果映射&#xff08;ResultMap&#xff09;2 MyBatis高级映射2.1 数据库中表的关系2.2 OneToOne2.2.1 方案一&#xff…

QT常用控件——菜单栏和对话框

目录 引言 一,菜单栏 二,工具栏 三,对话框 QDialog 引言 QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基…