亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

threeJs實(shí)現(xiàn)波紋擴(kuò)散及光標(biāo)浮動(dòng)效果詳解

 更新時(shí)間:2023年03月16日 17:18:22   作者:MicahZJ  
這篇文章主要為大家介紹了threeJs實(shí)現(xiàn)波紋擴(kuò)散及光標(biāo)浮動(dòng)效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

版本介紹

threejs版本

"version": "0.142.0",

vue版本

"version": "^3.0.0"

node版本

"version": "14.18.2"

正文

思路主要是:

  • 建立圓柱模型,記得把上下兩個(gè)面去除
  • 建立立標(biāo)模型
  • 模型放在public文件下的model文件夾中
  • 在動(dòng)畫里面做一個(gè)position.x,y,z的操作

效果如下

核心代碼

// 擴(kuò)散動(dòng)畫
this.group2.scale.x = this.group2.scale.x + 0.1
this.group2.scale.y = this.group2.scale.y - 0.01
this.group2.scale.z = this.group2.scale.z + 0.1
if(this.group2.scale.x > 10){
  this.group2.scale.x = 1
  this.group2.scale.y = 1
  this.group2.scale.z = 1
}
// 上下抖動(dòng)
const time = Date.now() * 0.005
this.group4.position.y = Math.cos( time ) * 1.75 + 2.25

導(dǎo)入即用

1. 新建一個(gè)ts文件

import * as THREE from "three";
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js";
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader.js";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js";
export default class ThreeD {
  private cylinderRadius: any; // 圓柱體半徑
  private cylinderOpacity: any; // 圓柱體透明度
  private cylinderMesh: any; // 圓柱網(wǎng)格
  private scene: any; // 場景
  private camera: any; // 相機(jī)
  private renderer: any; // 渲染器
  private group: any; // 新的組對象,控制模型
  private group2: any; // 圓柱體模組
  private group3: any; // 圓柱體模組-普通點(diǎn)
  private group4: any; // 點(diǎn)位模型
  private controls: any; // 創(chuàng)建控件對象
  private path: any; // 路徑
  private objName: any; // 模型
  private mtlName: any; // 材質(zhì)
  private cameraX: Number; // 相機(jī)x
  private cameraY: Number; // 相機(jī)y
  private cameraZ: Number; // 相機(jī)z
  private objSize: Number; // 模型倍數(shù)
  private modelSpeed: Number; // 旋轉(zhuǎn)速度
  private screenWidth: Number; // 旋轉(zhuǎn)速度
  private screenHeight: Number; // 旋轉(zhuǎn)速度
  constructor(
    cameraX: Number,
    cameraY: Number,
    cameraZ: Number,
    objSize: Number,
    modelSpeed: number
  ) {
    // this.path = path;
    // this.objName = objName;
    // this.mtlName = mtlName || null;
    this.cameraX = cameraX;
    this.cameraY = cameraY;
    this.cameraZ = cameraZ;
    this.objSize = objSize;
    this.screenWidth = 0
    this.screenHeight = 0
  }
  /**
   * 初始化
   * @param instance 容器dom
   */
  initThree(instance: HTMLElement | null) {
    // 場景寬高
    const width: any = instance && instance.clientWidth;
    const height: any = instance && instance.clientHeight;
    this.screenWidth = width;
    this.screenHeight = height;
    // 1. 創(chuàng)建場景對象Scene
    this.scene = new THREE.Scene();
    // 2. 創(chuàng)建相機(jī)對象fov 代表視角\aspect 寬高比\near 最近看到\far 最遠(yuǎn)看到
    this.camera = new THREE.PerspectiveCamera(50, width / height, 0.1, 200000);
    // 設(shè)置相機(jī)位置(眼睛位置或者說相機(jī)篇拍照位置x,y,z)
    this.camera.position.set(600, 300, 100);
    // 設(shè)置相機(jī)視角的角度
    this.camera.lookAt(0, 0, 0);
    // 3.創(chuàng)建組和模型
    this.group2 = new THREE.Group() // 組-總光圈
    this.group4 = new THREE.Group() // 組-光標(biāo)
    // 創(chuàng)建光圈-總的
    this.loadGlbCylinder('Cylinder2.glb', '0', true,10,0,0,0);
    // 標(biāo)注點(diǎn)
    this.loadGlbPoint('biaozhi.glb', '0', true,20);
    // 把group對象添加到場景中
    this.scene.add(this.group);
    this.scene.add(this.group2);
    this.scene.add(this.group3);
    this.scene.add(this.group4);
    // 4. 創(chuàng)建光源
    this.createPoint();
    // 5. 創(chuàng)建渲染器對象
    this.renderer = new THREE.WebGLRenderer();
    // 設(shè)置渲染器的大小
    this.renderer.setSize(Number(width), Number(height));
    // 增加背景顏色
    this.renderer.setClearColor(0xeeeeee, 0);
    // 將渲染器添加到div中
    instance && instance.append(this.renderer.domElement);
    // 7. 動(dòng)畫旋轉(zhuǎn)
    this.animate();
  }
  // 創(chuàng)建glb模型-圓柱體
  /**
   *
   * @param obj 文件名字
   * @param name 模型名字
   * @param showFlag 是否展示
   * @param scale 放大倍數(shù)
   * @param x
   * @param y
   * @param z
   */
  loadGlbCylinder(obj:string,
                  name:string,
                  showFlag:any,
                  scale:number,
                  x:number,
                  y:number,
                  z:number) {
    const dracoLoader = new DRACOLoader();
    dracoLoader.setDecoderPath("three/js/libs/draco/gltf/");
    const loader = new GLTFLoader();
    loader.setDRACOLoader(dracoLoader);
    loader.load(
      `model/${obj}`,
      (gltf) => {
        const model = gltf.scene;
        model.position.set(x, y, z); // 模型坐標(biāo)偏移量xyz
        model.scale.set(scale, scale, scale);
        model.name = name;
        model.visible = showFlag;
        model.traverse((object:any) => {
          if (object.isMesh) { // 開啟透明度
            object.material.transparent = true;//開啟透明
            object.material.opacity = 0.3;//設(shè)置透明度
          }
        })
        this.group2.add(model);
      },
      undefined,
      function (e) {
        console.error(e);
      }
    );
  }
  /**
   *  創(chuàng)建glb模型-圓柱體-普通
   * @param obj 文件名字
   * @param name 模型名字
   * @param showFlag 是否展示
   * @param scale 放大倍數(shù)
   * @param x
   * @param y
   * @param z
   */
  loadGlbPoint(obj:string,
               name:string,
               showFlag:any,
               scale:number) {
    const dracoLoader = new DRACOLoader();
    dracoLoader.setDecoderPath("three/js/libs/draco/gltf/");
    const loader = new GLTFLoader();
    loader.setDRACOLoader(dracoLoader);
    loader.load(
      `model/${obj}`,
      (gltf) => {
        const model = gltf.scene;
        model.position.set(0, 0, 0); // 模型坐標(biāo)偏移量xyz
        model.scale.set(scale, scale, scale);
        model.name = name;
        model.visible = showFlag;
        model.traverse((object:any) => {
          if (object.isMesh) { // 開啟透明度
            object.material.transparent = true;//開啟透明
            object.material.opacity = 1;//設(shè)置透明度
          }
        })
        this.group4.add(model);
      },
      undefined,
      function (e) {
        console.error(e);
      }
    );
  }
  // 創(chuàng)建光源
  createPoint() {
    //環(huán)境光
    const ambientLight = new THREE.AmbientLight(0xffffff, 1);
    // ambientLight.position.set(400, 200, 300);
    this.scene.add(ambientLight);
  }
  // 動(dòng)畫效果
  animate() {
    const clock = new THREE.Clock();
    // 渲染
    const renderEvent = () => {
      // const spt = clock.getDelta() * 1000; // 毫秒
      // console.log("一幀的時(shí)間:毫秒", spt);
      // console.log("幀率FPS", 1000 / spt);
      //循環(huán)調(diào)用函數(shù),請求再次執(zhí)行渲染函數(shù)render,渲染下一幀
      requestAnimationFrame(renderEvent);
      // 將場景和攝像機(jī)傳入到渲染器中
      this.renderer.render(this.scene, this.camera);
      // 圍繞物體y軸自轉(zhuǎn)
      // this.group.rotation.y -= 0.002;
      // 圓柱體擴(kuò)散動(dòng)畫
      this.group2.scale.x = this.group2.scale.x + 0.5
      this.group2.scale.y = this.group2.scale.y - 0.01
      this.group2.scale.z = this.group2.scale.z + 0.5
      if(this.group2.scale.x > 50){
        this.group2.scale.x = 1
        this.group2.scale.y = 1
        this.group2.scale.z = 1
      }
      // 上下移動(dòng)
      const time = Date.now() * 0.005
      this.group4.position.y = Math.cos( time ) * 1.75 + 2.25
    };
    renderEvent();
  }
}

2. 在要用的頁面導(dǎo)入

  • 在頁面建立dom
<div class="zong-model" ref="dom"></div>
  • 導(dǎo)入js
import ThreeD from "@/utils/threeD_fixed";
  • 在onmounted中使用
threeObj = new ThreeD(8, 50, 60, 1, 2);
dom.value && threeObj.initThree(dom.value);

以上就是threeJs實(shí)現(xiàn)波紋擴(kuò)散及光標(biāo)浮動(dòng)效果詳解的詳細(xì)內(nèi)容,更多關(guān)于threeJs波紋擴(kuò)散光標(biāo)浮動(dòng)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • TS 類型兼容教程示例詳解

    TS 類型兼容教程示例詳解

    這篇文章主要為大家介紹了TS 類型兼容教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 微信小程序 前端源碼邏輯和工作流詳解

    微信小程序 前端源碼邏輯和工作流詳解

    這篇文章主要介紹了微信小程序 前端源碼邏輯和工作流詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • response body加密如何破解方法詳解

    response body加密如何破解方法詳解

    這篇文章主要為大家介紹了response body加密如何破解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Canvas如何判斷點(diǎn)在形狀內(nèi)及內(nèi)置API性能詳解

    Canvas如何判斷點(diǎn)在形狀內(nèi)及內(nèi)置API性能詳解

    這篇文章主要為大家介紹了Canvas如何判斷點(diǎn)在形狀內(nèi)及內(nèi)置API性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 微信小程序 教程之模板

    微信小程序 教程之模板

    這篇文章主要介紹了微信小程序 模板的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • 使用純JavaScript封裝一個(gè)消息提示條功能示例詳解

    使用純JavaScript封裝一個(gè)消息提示條功能示例詳解

    這篇文章主要為大家介紹了使用純JavaScript封裝一個(gè)消息提示條功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • JS繼承與工廠構(gòu)造及原型設(shè)計(jì)模式詳解

    JS繼承與工廠構(gòu)造及原型設(shè)計(jì)模式詳解

    這篇文章主要為大家介紹了JS繼承與工廠構(gòu)造及原型設(shè)計(jì)模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • JS數(shù)組去重詳情

    JS數(shù)組去重詳情

    這篇文章主要介紹JS數(shù)組去重,關(guān)于去重實(shí)際應(yīng)用中,最常用的方法就是使用Set,也可以使用第三方庫lodash來處理,下面一起來看看文章是怎么介紹JS數(shù)組去重的
    2021-11-11
  • 微信小程序 picker-view 組件詳解及簡單實(shí)例

    微信小程序 picker-view 組件詳解及簡單實(shí)例

    這篇文章主要介紹了微信小程序 picker-view 組件詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 一文解析Express框架view對象使用

    一文解析Express框架view對象使用

    這篇文章主要介紹了Express框架view對象使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評論