在 Three.js 中,OBJExporter 是一个用于将 Three.js 中的场景导出为 OBJ 格式的类。

demo案例
在这里插入图片描述

在 Three.js 中,OBJExporter 是一个用于将 Three.js 中的场景导出为 OBJ 格式的类。下面是关于它的入参、出参、属性和方法的解释:

类名:OBJExporter

构造函数:
THREE.OBJExporter()
  • 说明: 创建一个 OBJExporter 实例。
方法:
  1. parse(object: Object3D) -> string

    • 说明: 将给定的 Three.js 3D 对象解析为 OBJ 格式的字符串。
    • 参数:
      • object (Object3D): 要导出的 Three.js 3D 对象。
    • 返回值: 包含导出对象的 OBJ 格式字符串。
  2. parseAsArray(object: Object3D) -> string[]

    • 说明: 将给定的 Three.js 3D 对象解析为 OBJ 格式的字符串数组,每个元素代表 OBJ 文件中的一行。
    • 参数:
      • object (Object3D): 要导出的 Three.js 3D 对象。
    • 返回值: 包含导出对象的 OBJ 格式字符串数组。
属性:
  • 暂无

示例用法:

// 创建 OBJExporter 实例
var exporter = new THREE.OBJExporter();

// 导出场景中的对象为 OBJ 格式字符串
var objStr = exporter.parse(scene);

// 导出场景中的对象为 OBJ 格式字符串数组
var objArray = exporter.parseAsArray(scene);

完整代码


```html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>three.js webgl - exporter - obj</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
    <div id="info">
        <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - exporter - obj
    </div>

    <!-- 使用 importmap 定义模块导入路径 -->
    <script type="importmap">
        {
            "imports": {
                "three": "../build/three.module.js",
                "three/addons/": "./jsm/"
            }
        }
    </script>

    <!-- 导入 Three.js 和相关模块 -->
    <script type="module">
        // 导入所需的 Three.js 模块
        import * as THREE from 'three';
        import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
        import { OBJExporter } from 'three/addons/exporters/OBJExporter.js';
        import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

        // 初始化相机、场景、渲染器等
        let camera, scene, renderer;
        const params = {
            addTriangle: addTriangle,
            addCube: addCube,
            addCylinder: addCylinder,
            addMultiple: addMultiple,
            addTransformed: addTransformed,
            addPoints: addPoints,
            exportToObj: exportToObj
        };

        init(); // 初始化
        animate(); // 启动渲染循环

        function init() {
            // 创建渲染器
            renderer = new THREE.WebGLRenderer();
            renderer.setPixelRatio(window.devicePixelRatio);
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);

            // 创建相机
            camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000);
            camera.position.set(0, 0, 400);

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

            // 添加环境光
            const ambientLight = new THREE.AmbientLight(0xffffff);
            scene.add(ambientLight);

            // 添加定向光
            const directionalLight = new THREE.DirectionalLight(0xffffff, 2.5);
            directionalLight.position.set(0, 1, 1);
            scene.add(directionalLight);

            // 创建 GUI
            const gui = new GUI();

            // 添加几何体选项
            let h = gui.addFolder('Geometry Selection');
            h.add(params, 'addTriangle').name('Triangle');
            h.add(params, 'addCube').name('Cube');
            h.add(params, 'addCylinder').name('Cylinder');
            h.add(params, 'addMultiple').name('Multiple objects');
            h.add(params, 'addTransformed').name('Transformed objects');
            h.add(params, 'addPoints').name('Point Cloud');

            // 添加导出选项
            h = gui.addFolder('Export');
            h.add(params, 'exportToObj').name('Export OBJ');

            gui.open(); // 默认展开 GUI

            addGeometry(1); // 添加默认几何体

            window.addEventListener('resize', onWindowResize); // 监听窗口大小变化

            // 添加轨道控制器
            const controls = new OrbitControls(camera, renderer.domElement);
            controls.enablePan = false;
        }

        // 将场景导出为 OBJ 格式
        function exportToObj() {
            const exporter = new OBJExporter();
            const result = exporter.parse(scene);
            saveString(result, 'object.obj');
        }

        // 添加不同类型的几何体
        function addGeometry(type) {
            // 清空场景中的原有对象
            for (let i = 0; i < scene.children.length; i ++) {
                const child = scene.children[i];
                if (child.isMesh || child.isPoints) {
                    child.geometry.dispose();
                    scene.remove(child);
                    i --;
                }
            }

            // 根据类型添加几何体
            if (type === 1) {
                const material = new THREE.MeshLambertMaterial({ color: 0x00cc00 });
                const geometry = generateTriangleGeometry();
                scene.add(new THREE.Mesh(geometry, material));
            } else if (type === 2) {
                const material = new THREE.MeshLambertMaterial({ color: 0x00cc00 });
                const geometry = new THREE.BoxGeometry(100, 100, 100);
                scene.add(new THREE.Mesh(geometry, material));
            } else if (type === 3) {
                const material = new THREE.MeshLambertMaterial({ color: 0x00cc00 });
                const geometry = new THREE.CylinderGeometry(50, 50, 100, 30, 1);
                scene.add(new THREE.Mesh(geometry, material));
            } else if (type === 4 || type === 5) {
                const material = new THREE.MeshLambertMaterial({ color: 0x00cc00 });
                const geometry = generateTriangleGeometry();
                const mesh = new THREE.Mesh(geometry, material);
                mesh.position.x = -200;
                scene.add(mesh);
                const geometry2 = new THREE.BoxGeometry(100, 100, 100);
                const mesh2 = new THREE.Mesh(geometry2, material);
                scene.add(mesh2);
                const geometry3 = new THREE.CylinderGeometry(50, 50, 100, 30, 1);
                const mesh3 = new THREE.Mesh(geometry3, material);
                mesh3.position.x = 200;
                scene.add(mesh3);
                if (type === 5) {
                    mesh.rotation.y = Math.PI / 4.0;
                    mesh2.rotation.y = Math.PI / 4.0;
                    mesh3.rotation.y = Math.PI / 4.0;
                }
            } else if (type === 6) {
                const points = [0, 0, 0, 100, 0, 0, 100, 100, 0, 0, 100, 0];
                const colors = [0.5, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0.5, 0];
                const geometry = new THREE.BufferGeometry();
                geometry.setAttribute('position', new THREE.Float32BufferAttribute(points, 3));
                geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));
                const material = new THREE.PointsMaterial({ size: 10, vertexColors: true });
                const pointCloud = new THREE.Points(geometry, material);
                pointCloud.name = 'point cloud';
                scene.add(pointCloud);
            
        }

        // 添加创建三角形几何体的函数
        function addTriangle() {
            addGeometry(1);
        }

        // 添加创建立方体几何体的函数
        function addCube() {
            addGeometry(2);
        }

        // 添加创建圆柱体几何体的函数
        function addCylinder() {
            addGeometry(3);
        }

        // 添加创建多个几何体的函数
        function addMultiple() {
            addGeometry(4);
        }

        // 添加创建变换后几何体的函数
        function addTransformed() {
            addGeometry(5);
        }

        // 添加创建点云的函数
        function addPoints() {
            addGeometry(6);
        }

        // 创建一个隐藏的下载链接元素,用于保存文件
        const link = document.createElement('a');
        link.style.display = 'none';
        document.body.appendChild(link);

        // 保存 Blob 对象到文件
        function save(blob, filename) {
            link.href = URL.createObjectURL(blob);
            link.download = filename;
            link.click();
        }

        // 将字符串保存为文件
        function saveString(text, filename) {
            save(new Blob([text], { type: 'text/plain' }), filename);
        }

        // 窗口大小变化时更新相机和渲染器大小
        function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        }

        // 动画循环
        function animate() {
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
        }
    </script>
</body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4月1日起,未备案App小程序将下架

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最后2天了、最后2天了。 从2024年4月1日起&#xff0c;工信部要求所有的APP、小程序都要备案&#xff0c;否则下架、关停、限制更新。这是去年8月份出的新规&#xff0c;没想到十个月这么快就过去了。 现在广东省…

面向对象:多态

文章目录 一、什么是多态二、构成多态的条件2.1什么是虚函数2.1如何构成虚函数的重写&#xff08;原理层面上叫&#xff1a;重写&#xff09;2.2父类指针的调用 三、多态调用父类指针出现的情况四、构成多态的一种特殊情况&#xff08;协变&#xff09;五、析构函数构成的多态六…

jmeter性能压测的标准和实战中会遇到的问题

1.性能标准建议 CPU 使用率&#xff1a;不超过 70% 内存使用率&#xff1a;不超过 70% 磁盘&#xff1a;%util到达80%严重繁忙 &#xff08;os.disIO.filesystem.writeKbPS 每秒写入的千字节&#xff09; 响应时间&#xff1a;95%的响应时间不超过8000ms 事务成功率&#xff1a…

EXCEL 通过FILES函数获取指定路径中的所有文件名

FILES函数 用途 获取指定文件路径中的所有文件名。 语法 FILES(“路径\*.*”)指定从哪个路径下返回一个文件名。 *.*是通配符&#xff0c;代表所有类型的文件&#xff0c;第一个*是文件名的通配符&#xff0c;第二个* 是文件的后缀名&#xff0c;表示文件类型&#xff0c;如…

【c++】简单的日期计算器

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…

手机真机连接USB调试adb不识别不显示和TCPIP连接问题

手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 &#xff0c;其他型号手机在开发人员模式打开等方式可能略有不同&#xff0c;需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…

CKS之安全沙箱运行容器:gVisor

目录 一、gVisor介绍 二、gVisor架构 三、gVisor使用前置条件 四、Docker中使用gVisor 五、containerd中使用gVisor 六、Kubernetes结合gVisor使用 一、gVisor介绍 gVisor是Google开源的一种容器沙箱技术&#xff0c;其设计初衷是在提供较高安全性的同时&#xff0c;尽量…

二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点

目录 策略模式【Strategy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 代理模式【Proxy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 单例模式【Singleton Pattern】 定义 举例说明 核心思想 适用场景 优缺点 多例模式【Multition Pattern】…

【2023】kafka在linux和docker安装(kafka-1)

目录&#x1f4bb; 一、linux安装kafka1. 安装jdk2. 上传解压到/usr/local目录下3、使用kafka 二、docker安装kafka1. 下载2. 安装zookeeper3. 安装kafka 一、linux安装kafka 环境主机 mac m2、虚拟机Ubuntu22.04.4 1. 安装jdk yum install -y java-1.8.0-openjdk.x86_64下载k…

.NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数

前言&#xff1a; 本次要讲的是使用.Net HttpClient拼接multipark/form-data形式post上传文件和相关参数&#xff0c;并接收到上传文件成功后返回过来的结果&#xff08;图片地址&#xff0c;和是否成功&#xff09;。可能有很多人会说用ajax不是就可以轻松的实现吗&#xff1f…

最优算法100例之16-连续子数组的最大和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入一个整型数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 题…

Datacom HCIP笔记-OSPF协议 之二

链路&#xff1a;路由器之间的相连的链路 状态&#xff1a;链路上的参数在某一时刻的状态 单边邻居 one way&#xff1f; 收到对端发来的hello报文&#xff0c;其中没有自己的router id LSA类型&#xff1a; 1类LSA&#xff1a;描述路由器自身加入到ospf进程中的直连链路的状态…

wps没保存关闭了恢复数据教程

有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失&#xff0c;不知道wps没保存关闭了怎么恢复数据&#xff0c;其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能&#xff0c;不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

书生·浦语全链路开源开放体系 第二期

文章目录 大模型背景大模型开发流程InternLM 2.0SFT与RLHFInternLM2主要亮点 书生浦语全链路开源开放体系数据-书生万卷InternLM-Train微调 XTuner评测工具 OpenCompass部署 LMDeploy智能体 Lagent智能体工具箱 AgentLego 大模型背景 专用模型&#xff1a;针对特定的任务&…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

【ReadPapers】A Survey of Large Language Models

LLM-Survey的llm能力和评估部分内容学习笔记——思维导图 思维导图 参考资料 A Survey of Large Language Models论文的github仓库

适用于 Windows 的 6 个最佳视频转换器

视频转换器可以帮助您在设备上转换和播放不受支持的视频格式。它还可以方便地减小视频文件大小、以通用格式组织所有视频或与其他人共享文件以在不同设备上播放。 Windows 有大量视频转换器可供选择。虽然有些是免费的&#xff0c;但其他一些则提供迎合专业用户的高级功能。在…

深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络&#xff08;图-1&#xff09;&#xff1a; 图-1 可以很直观的看到&#xff0c;随着层数的增加Error也在逐渐降低&#xff0c;因此深度是非常重要的&#xff0c;但是学习更好的网络模型和堆叠层数一样简单吗&#xff1f;通过实现表明&#xff08;图-2&…

神经网络 各个模块介绍(Pytorch 07)

一 网络层和块 单个神经网络&#xff08;1&#xff09;接受一些输入&#xff1b;&#xff08;2&#xff09;生成相应的标量输出&#xff1b;&#xff08;3&#xff09;具有一组相关 参数&#xff08;parameters&#xff09;&#xff0c;更新这些参数 可以优化某目标函数。 当…