一个简单的立方体

three
2023-10-15 12:35:09

这一个系列文章将准备多个例子来说明threejs当中的一些概念和用法,采用vue3为基础框架,示例不影响对框架的选择。

在vue模板当中,统一使用<div ref="container"></div>作为three渲染对象显示的容器,后续内容以此为基础。

在这个例子当中绘制一个立方体,用于说明一个简单的three程序的运行过程。

代码如下:

↓ 会员用户可见内容 ↓
ts 复制代码
import { WebGLRenderer , Scene, PointLight, OrthographicCamera, BoxGeometry, MeshLambertMaterial, Mesh } from "three"
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入轨道控制器
import { onMounted, ref, unref } from "vue";

const container = ref<HTMLDivElement>() // 容器

// 创建一个渲染器  
const renderer = new WebGLRenderer()

const width = 480
const height = 320
renderer.setSize(width, height)
renderer.setClearColor("white", 1) // 将整个画布设置成纯白色

onMounted(() => {
    unref(container)?.append(renderer.domElement)

    // 创建场景
    const scene = new Scene() 

    // 设置灯光
    const light = new PointLight("red")
    light.position.set(400, 800, 100)
    scene.add(light)


    // 设置相机
    const rate = width / height
    const s = 120;

    const camera = new OrthographicCamera(-s * rate,
        s * rate, s, -s, 1, 1000)
    camera.position.set(400, 800, 300);
    camera.lookAt(scene.position)

    // 创建一个立方体,并绑定材质
    const boxGeometry = new BoxGeometry(100, 100, 100)
    const meshLambertMaterial = new MeshLambertMaterial({ color: 0xFFBF00 })
    const mesh = new Mesh(boxGeometry, meshLambertMaterial)

    scene.add(mesh)

    // 创建轨道控制器
    new OrbitControls(camera, renderer.domElement);

    function render() {
        renderer.render(scene, camera); //执行渲染操作
        requestAnimationFrame(render);//请求再次执行渲染函数render,渲染下一帧
    }

    render();
})

一般而言,创建一个三维的threejs程序必须存在的三要素:场景、相机、渲染器

本示例涉及的步骤如下:

  1. 创建渲染器 const renderer = new WebGLRenderer()
  2. 将渲染器追加到页面元素容器 unref(container)?.append(renderer.domElement)
  3. 创建场景 const scene = new Scene()
  4. 设置一个光源 const light = new PointLight("red")
  5. 设置相机 const camera = new OrthographicCamera(-s * rate, s * rate, s, -s, 1, 1000)
  6. 创建材质
  7. 创建轨道控制器 new OrbitControls(camera, renderer.domElement);,通常在需要看车软件、电商软件看到物品360度旋转,基本上这样实现就可以了。

这算是一个初步的demo,对于初学者而言,涉及的知识较多,后续将逐步在一些示例当中分解

本章节源代码收录在demo-01.vue 文件当中