使用BufferGeometry生成酷炫!

代码:
<template><div class="container" ref="container"></div></template><script >import * as THREE from "three";import { ref } from "vue";//添加一个轨道控制器import { OrbitControls} from "three/examples/jsm/controls/OrbitControls";//导入动画库import gsap from "gsap";//导入dat.guiimport * as dat from "dat.gui";export default {name: 'App',data() {return {renderer: null,scene: null,camera: null,cube: null,clock: null,animate1: null,controls: null,gui: null}},mounted() {//1.创建场景const scene = new THREE.Scene();//2.创建相机(透视相机)/*** 构造器* PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )* fov — 摄像机视锥体垂直视野角度* aspect — 摄像机视锥体长宽比* near — 摄像机视锥体近端面* far — 摄像机视锥体远端面*/const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);//设置相机位置:x,y,z轴位置camera.position.set(0,0,10);//添加相机到场景中scene.add(camera);this.scene=scene;this.camera=camera;//3.添加物体//创建几何体// const cubeGeometry = new THREE.BoxGeometry(1,1,1);for(let i=0;i<50;i++){//每一个三角形需要3个顶点,每个顶点需要3个值const geometry = new THREE.BufferGeometry();const positionArray =new Float32Array(9);for(let j=0;j<9;j++){positionArray[j] = Math.random() * 10-5;}//设置顶点geometry.setAttribute('position',new THREE.BufferAttribute(positionArray,3));let color = new THREE.Color(Math.random(),Math.random(),Math.random());//创建材质const Material = new THREE.MeshBasicMaterial({color: color,transparent:true,opacity:0.5});//根据几何体和材质创建物体// const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);const mesh = new THREE.Mesh(geometry,Material);console.log(mesh);scene.add(mesh);}//创建6个顶点,3个点构造一个三角形,6个点构成2个三角形,2个三角形就是一个矩形/* const vertices =new Float32Array([-1.0,-1.0,1.0,1.0,-1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0]); *///将几何体添加到场景中//4.初始化渲染器const renderer = new THREE.WebGLRenderer();//设置渲染器的尺寸大小renderer.setSize(window.innerWidth,window.innerHeight);this.renderer=renderer;//将webgl渲染的canvas内容添加到div//document.body.append(renderer.domElement);this.$refs['container'].appendChild(renderer.domElement);//使用渲染器,通过相机将场景渲染进来renderer.render(scene,camera);//5.创建轨道控制器const controls = new OrbitControls(camera,renderer.domElement);//设置控制器阻尼,让控制器更有真实效果,必须在动画循环调用updatecontrols.enableDamping = true;this.controls=controls;//6.添加坐标轴辅助器//size -- (可选的) 表示代表轴的线段长度. 默认为 1.const axesHelper = new THREE.AxesHelper( 5 );scene.add( axesHelper );//双击控制屏幕进入全屏、退出全屏window.addEventListener("dblclick",()=>{const fullScreenElement =document.fullscreenElement;if(!fullScreenElement){//让画布对象全屏this.renderer.domElement.requestFullscreen();}else{//退出全屏,使用document对象document.exitFullscreen();}})//监听画面变化,更新渲染画面window.addEventListener("resize",()=>{console.log("画面变化了");//更新摄像头this.camera.aspect = window.innerWidth /window.innerHeight;//更新摄像机的投影矩阵this.camera.updateProjectionMatrix();//更新渲染器this.renderer.setSize(window.innerWidth,window.innerHeight);//设置渲染器的像素比this.renderer.setPixelRatio(window.devicePixelRatio);})this.renders();},methods: {renders(){this.controls.update();this.renderer.render(this.scene,this.camera);// requestAnimationFrame(this.renders());//此行代码会出现threejs requestAnimationFrame 导致的call stack超出上限的问题requestAnimationFrame(this.renders.bind(this));},}}</script><style>*{margin: 0;padding: 0;}.container{height: 100vh;width: 100vw;background-color: #f0f0f0;}</style>
原文作者:小南瓜开发平台;如有侵权,请联系管理员删除。