Skip to content

杂乱无章的三角

🕒 Published at:

本篇没有新的api设计,主要利用之前学的BufferGeometry和BufferAttribute来实现一堆随机的三角

js
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

//场景
const scene = new THREE.Scene();

for (let i = 0; i < 20; i++) {
  // 创建一个模型
  const geometry = new THREE.BufferGeometry(); //创建一个几何体对象
  //类型数组创建顶点数据
  const vertices = new Float32Array(9);
  for (let index = 0; index < 9; index++) {
    vertices[index] = Math.random() * 10 - 5;
  }
  // 创建属性缓冲区对象
  const attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,表示一个顶点的xyz坐标
  // 设置几何体attributes属性的位置属性
  geometry.attributes.position = attribue;

  const color = new THREE.Color(Math.random(), Math.random(), Math.random());

  const material = new THREE.MeshBasicMaterial({
    color: color,
    side: THREE.DoubleSide,
    transparent: true,
    opacity: Math.random()
  });

  const mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh); //模型对象添加到场景中
}

//渲染器和相机
const width = window.innerWidth;
const height = window.innerHeight;
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
camera.position.set(22, 4, 13);
camera.lookAt(0, 0, 0);

const renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);

// 渲染循环
function render() {
  renderer.render(scene, camera);
  requestAnimationFrame(render);
}
render();

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

// 画布跟随窗口变化
window.onresize = function () {
  renderer.setSize(window.innerWidth, window.innerHeight);
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
};