Skip to content

ThingOrigin.js & three.js

创建场景对比

before

js
//引入three.js
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// 获取dom元素
let sceneDom = document.getElementById("TO")
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(75,sceneDom.clientWidth / sceneDom.clientHeight, 0.1, 1000);
camera.position.set(10, 10, 10);
// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, sceneDom.clientHeight);
renderer.setPixelRatio(window.devicePixelRatio);
sceneDom.appendChild(renderer.domElement);
// 添加轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;
// 创建网格辅助线
const gridHelper = new THREE.GridHelper(20, 20, 0x888888, 0x444444);
scene.add(gridHelper);
// 创建坐标轴辅助线
const axesHelper = new THREE.AxesHelper(10);
scene.add(axesHelper);
// 创建天空盒
const createSkybox = () => {
    const loader = new THREE.CubeTextureLoader();
    const texture = loader.load([
        './skybox/px.jpg',
        './skybox/nx.jpg',
        './skybox/py.jpg',
        './skybox/ny.jpg',
        './skybox/pz.jpg',
        './skybox/nz.jpg'
    ]);
    scene.background = texture;
};
// 调用天空盒函数
createSkybox();
// 添加环境光
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
// 添加方向光
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);
// 动画循环
function animate() {
    requestAnimationFrame(animate);
    controls.update();
    renderer.render(scene, camera);
}
// 处理窗口大小变化
window.addEventListener('resize', () => {
    camera.aspect = sceneDom.clientWidth / sceneDom.clientHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, sceneDom.clientHeight);
});
animate();

after

js
let TO = new ThingOrigin("TOScene", document.getElementById("TO"))

TOScene 为自定义的场景名称。

document.getElementById('TO') 为用于渲染的 dom 元素。

总结:通过简化API设计和提供预制组件,大幅减少了开发3D场景所需的代码量

控制模型旋转对比

before

js
// 定义目标旋转角度(弧度制)
const targetRotationY = Math.PI / 2; // 90度

// 创建 Tween 动画
// 定义旋转角度(以度为单位)
const startAngle = 0; // 起始角度
const endAngle = 90;  // 结束角度

// 创建Tween动画
const rotationTween = new TWEEN.Tween({ angle: startAngle })
    .to({ angle: endAngle }, 1000) // 1秒内从0度旋转到90度
    .easing(TWEEN.Easing.Quadratic.InOut) // 使用缓动函数
    .onUpdate(function() {
        // 将角度转换为弧度(Three.js使用弧度)
        const radians = THREE.MathUtils.degToRad(this.angle);
        // 更新模型1的旋转
        model1.rotation.y = radians;
    })
    .onComplete(function() {
        console.log('旋转动画完成');
    })
    .start();

after

js
//找到模型对象
let rotateModel = TO.scene.getObjectByProperty("name", "WS30-1") 
//模型绕y轴旋转180度,旋转时间为2秒
TO.animate.rotateAngle(rotateModel, 'y', 0, 180, 2000);

总结:对比来看,控制模型旋转代码就由原来的十几行代码简化为一行代码