ThreeJs功能演示——多少体操纵导入导出

打印 上一主题 下一主题

主题 999|帖子 999|积分 2997

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、内部创建多少体导出编辑能力
1)支持内部创建的面、正方体、球体

内部创建物体时,如果是三维物体,要创建聚集形状geometry,和对应的材质material。再一起创建一个三维物体。
  1.         // 存储创建的几何体列表
  2.         const geometries = [];
  3.         createPlane()
  4.         createCube()
  5.         createSphere()
  6.         addGUIForGeometry(geometries)
  7.         // 几何体创建函数
  8.         function createPlane() {
  9.                 const geometry = new THREE.PlaneGeometry(1,1);
  10.                 const material = new THREE.MeshBasicMaterial({color:0xffff00, side:THREE.DoubleSide})
  11.                 const plane = new THREE.Mesh(geometry, material)
  12.                 plane.name = "Plane";
  13.                 plane.position.set(-1, -1, -1)
  14.                 scene.add(plane)
  15.                 geometries.push(plane)
  16.                 return plane;
  17.         }
  18.         // 创建正方体
  19.         function createCube() {
  20.                 const geometry = new THREE.BoxGeometry(1, 1, 1 );
  21.                 const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
  22.                 const cube = new THREE.Mesh( geometry, material );
  23.                 cube.name = 'Cube';
  24.                 scene.add( cube );
  25.                 geometries.push(cube);
  26.                 return cube;
  27.         }
  28.         // 创建球体
  29.         function createSphere() {
  30.                 const geometry = new THREE.SphereGeometry( 1, 32, 32 );
  31.                 const material = new THREE.MeshBasicMaterial( {color: 0x0000ff} );
  32.                 const sphere = new THREE.Mesh( geometry, material );
  33.                 sphere.name = 'Sphere';
  34.                 sphere.position.set(2,2,2)
  35.                 scene.add( sphere );
  36.                 geometries.push(sphere);
  37.                 return sphere;
  38.         }
复制代码
2)支持多少体的位置、角度、比例调解

通过GUI控制器调解创建物体的位置、角度、放大比例信息。
  1.         // GUI控制器
  2.         function addGUIForGeometry(geometryArr) {
  3.                 const gui = new GUI();
  4.                 gui.add({x:0}, 'x', -10, 10).name('Position X').onChange((value)=>{
  5.                         for (let element of geometryArr) {
  6.                                 console.log(element.position)
  7.                                 element.position.set(value, element.position.y, element.position.z)
  8.                         }
  9.                         animate()
  10.                 });
  11.                 gui.add({scale:1}, 'scale', 0.1, 10).name('Scale').onChange((value)=>{
  12.                         for (let element of geometryArr) {
  13.                                 element.scale.set(value, value, value)
  14.                         }
  15.                         animate()
  16.                 });
  17.                 gui.add({rotateX:0}, "rotateX",  -Math.PI, Math.PI).name("Rotate X").onChange((value)=>{
  18.                         for (let element of geometryArr) {
  19.                                 element.rotation.set(value, element.rotation.y, element.rotation.z)
  20.                         }
  21.                         animate()
  22.                 })
  23.                 gui.open();
  24.         }
复制代码
3)支持多少体批量导出、重新导入

将3D物体的位置、形状、角度、放大序列化到json文件,支持导出。
导入时,根据物体的类型分别创建3D模型
  1.         // 导入几何体
  2.         function importGeometries() {
  3.                 const input = document.createElement('input');
  4.                 input.type = 'file';
  5.                 input.accept = '.json';
  6.                 input.addEventListener('change', (event) => {
  7.                         const file = event.target.files[0];
  8.                         if (file) {
  9.                                 const reader = new FileReader();
  10.                                 reader.onload = (e) => {
  11.                                         const geometriesData = JSON.parse(e.target.result);
  12.                                         geometriesData.forEach(data => {
  13.                                                 let geometry;
  14.                                                 let material;
  15.                                                 switch (data.type) {
  16.                                                         case 'Mesh':
  17.                                                                 switch (data.name) {
  18.                                                                         case 'Plane':
  19.                                                                                 geometry = new THREE.PlaneGeometry(data.geometryData.vertices, data.geometryData.indices);
  20.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0xffff00, side: THREE.DoubleSide });
  21.                                                                                 break;
  22.                                                                         case 'Cube':
  23.                                                                                 geometry = new THREE.BoxGeometry(data.geometryData.vertices, data.geometryData.indices);
  24.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
  25.                                                                                 break;
  26.                                                                         case 'Sphere':
  27.                                                                                 geometry = new THREE.SphereGeometry(data.geometryData.vertices, data.geometryData.indices);
  28.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0x0000ff });
  29.                                                                                 break;
  30.                                                                 }
  31.                                                                 const mesh = new THREE.Mesh(geometry, material);
  32.                                                                 mesh.name = data.name;
  33.                                                                 mesh.position.fromArray(data.position);
  34.                                                                 mesh.rotation.fromArray(data.rotation);
  35.                                                                 mesh.scale.fromArray(data.scale);
  36.                                                                 scene.add(mesh);
  37.                                                                 geometries.push(mesh);
  38.                                                                 break;
  39.                                                 }
  40.                                         });
  41.                                 };
  42.                                 reader.readAsText(file);
  43.                         }
  44.                 });
  45.                 input.click();
  46.         }
复制代码
2、整体代码

  1. <!DOCTYPE html><html lang="en"><head>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, initial-scale=1.0">        <title>Three.js 多少体操纵示例</title>        <style>                body { margin: 0; overflow: hidden; }                #camera-info {                        position: absolute;                        top: 10px;                        left: 10px;                        background-color: rgba(0, 0, 0, 0.5);                        color: white;                        padding: 10px;                        font-family: Arial, sans-serif;                }        </style></head><body><div id="camera-info"></div><script type="importmap">        {                "imports": {                        "three": "./three.js-master/build/three.module.js",                        "three/addons/": "./three.js-master/examples/jsm/"                }        }</script><script type="module">        import * as THREE from "three"        import { OrbitControls } from 'three/addons/controls/OrbitControls.js';        import { GUI } from 'three/addons/libs/lil-gui.module.min.js';        // 1) 创建画布        const scene = new THREE.Scene();        scene.background = new THREE.Color( 0xa0a0a0 );        const renderer = new THREE.WebGLRenderer();        renderer.setSize(window.innerWidth, window.innerHeight);        document.body.appendChild(renderer.domElement);        // 2) 设置 camera 位置,朝向角度        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);        camera.position.set(0, 0, 20); // 设置相机位置        camera.lookAt(scene.position); // 让相机朝向场景中心        // 设置控制轨道        const controls = new OrbitControls( camera, renderer.domElement );        controls.target.set( 0, 0.1, 0 );        controls.update();        controls.minDistance = 0.5;        controls.maxDistance = 1000;        controls.maxPolarAngle = 0.5 * Math.PI;        // 5) 支持动态显示摄像头位置、角度、缩放信息        const cameraInfo = document.getElementById('camera-info');        function updateCameraInfo() {                cameraInfo.innerHTML = `                摄像头信息:<br>                位置: (${camera.position.x.toFixed(2)}, ${camera.position.y.toFixed(2)}, ${camera.position.z.toFixed(2)})<br>                角度: (${camera.rotation.x.toFixed(2)}, ${camera.rotation.y.toFixed(2)}, ${camera.rotation.z.toFixed(2)})<br>                缩放: ${camera.zoom.toFixed(2)}            `;        }        updateCameraInfo();        // 渲染循环        function animate() {                requestAnimationFrame(animate);                updateCameraInfo();                renderer.render(scene, camera);        }        animate();        // 存储创建的几何体列表
  2.         const geometries = [];
  3.         createPlane()
  4.         createCube()
  5.         createSphere()
  6.         addGUIForGeometry(geometries)
  7.         // 几何体创建函数
  8.         function createPlane() {
  9.                 const geometry = new THREE.PlaneGeometry(1,1);
  10.                 const material = new THREE.MeshBasicMaterial({color:0xffff00, side:THREE.DoubleSide})
  11.                 const plane = new THREE.Mesh(geometry, material)
  12.                 plane.name = "Plane";
  13.                 plane.position.set(-1, -1, -1)
  14.                 scene.add(plane)
  15.                 geometries.push(plane)
  16.                 return plane;
  17.         }
  18.         // 创建正方体
  19.         function createCube() {
  20.                 const geometry = new THREE.BoxGeometry(1, 1, 1 );
  21.                 const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
  22.                 const cube = new THREE.Mesh( geometry, material );
  23.                 cube.name = 'Cube';
  24.                 scene.add( cube );
  25.                 geometries.push(cube);
  26.                 return cube;
  27.         }
  28.         // 创建球体
  29.         function createSphere() {
  30.                 const geometry = new THREE.SphereGeometry( 1, 32, 32 );
  31.                 const material = new THREE.MeshBasicMaterial( {color: 0x0000ff} );
  32.                 const sphere = new THREE.Mesh( geometry, material );
  33.                 sphere.name = 'Sphere';
  34.                 sphere.position.set(2,2,2)
  35.                 scene.add( sphere );
  36.                 geometries.push(sphere);
  37.                 return sphere;
  38.         }        // GUI控制器
  39.         function addGUIForGeometry(geometryArr) {
  40.                 const gui = new GUI();
  41.                 gui.add({x:0}, 'x', -10, 10).name('Position X').onChange((value)=>{
  42.                         for (let element of geometryArr) {
  43.                                 console.log(element.position)
  44.                                 element.position.set(value, element.position.y, element.position.z)
  45.                         }
  46.                         animate()
  47.                 });
  48.                 gui.add({scale:1}, 'scale', 0.1, 10).name('Scale').onChange((value)=>{
  49.                         for (let element of geometryArr) {
  50.                                 element.scale.set(value, value, value)
  51.                         }
  52.                         animate()
  53.                 });
  54.                 gui.add({rotateX:0}, "rotateX",  -Math.PI, Math.PI).name("Rotate X").onChange((value)=>{
  55.                         for (let element of geometryArr) {
  56.                                 element.rotation.set(value, element.rotation.y, element.rotation.z)
  57.                         }
  58.                         animate()
  59.                 })
  60.                 gui.open();
  61.         }        function handleKeyDown(event) {                switch (event.key) {                        case 'e':                                exportToJSON(geometries)                                break;                        case 'r':                                clearGeometries(geometries)                                break;                        case 'i':                                importGeometries(geometries)                                break;                }        }        document.addEventListener('keydown', handleKeyDown);        function exportToJSON(geometryList) {                const geometriesData = geometryList.map(geometry => {                        return {                                name: geometry.name,                                position: geometry.position.toArray(),                                rotation: geometry.rotation.toArray(),                                scale: geometry.scale.toArray(),                                // 根据多少体类型添加更多特定信息                                type: geometry.type,                                geometryData: geometry.geometry.toJSON()                        };                });                const blob = new Blob([JSON.stringify(geometriesData)], { type: 'application/json' });                const url = URL.createObjectURL(blob);                const a = document.createElement('a');                a.href = url;                a.download = 'geometries.json';                document.body.appendChild(a);                a.click();                document.body.removeChild(a);                URL.revokeObjectURL(url);        }        // 清除多少体        function clearGeometries(geoArr) {                geometries.forEach(geometry => scene.remove(geometry));                geometries.length = 0;        }        // 导入几何体
  62.         function importGeometries() {
  63.                 const input = document.createElement('input');
  64.                 input.type = 'file';
  65.                 input.accept = '.json';
  66.                 input.addEventListener('change', (event) => {
  67.                         const file = event.target.files[0];
  68.                         if (file) {
  69.                                 const reader = new FileReader();
  70.                                 reader.onload = (e) => {
  71.                                         const geometriesData = JSON.parse(e.target.result);
  72.                                         geometriesData.forEach(data => {
  73.                                                 let geometry;
  74.                                                 let material;
  75.                                                 switch (data.type) {
  76.                                                         case 'Mesh':
  77.                                                                 switch (data.name) {
  78.                                                                         case 'Plane':
  79.                                                                                 geometry = new THREE.PlaneGeometry(data.geometryData.vertices, data.geometryData.indices);
  80.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0xffff00, side: THREE.DoubleSide });
  81.                                                                                 break;
  82.                                                                         case 'Cube':
  83.                                                                                 geometry = new THREE.BoxGeometry(data.geometryData.vertices, data.geometryData.indices);
  84.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
  85.                                                                                 break;
  86.                                                                         case 'Sphere':
  87.                                                                                 geometry = new THREE.SphereGeometry(data.geometryData.vertices, data.geometryData.indices);
  88.                                                                                 material = new THREE.MeshBasicMaterial({ color: 0x0000ff });
  89.                                                                                 break;
  90.                                                                 }
  91.                                                                 const mesh = new THREE.Mesh(geometry, material);
  92.                                                                 mesh.name = data.name;
  93.                                                                 mesh.position.fromArray(data.position);
  94.                                                                 mesh.rotation.fromArray(data.rotation);
  95.                                                                 mesh.scale.fromArray(data.scale);
  96.                                                                 scene.add(mesh);
  97.                                                                 geometries.push(mesh);
  98.                                                                 break;
  99.                                                 }
  100.                                         });
  101.                                 };
  102.                                 reader.readAsText(file);
  103.                         }
  104.                 });
  105.                 input.click();
  106.         }</script></body></html>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表