PLYExporter 是用于导出 Three.js 场景中几何体数据为 PLY 格式的类。

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

PLYExporter 是用于导出 Three.js 场景中几何体数据为 PLY 格式的类。下面是关于 PLYExporter 的属性、方法、入参和出参的讲解:

属性 (Properties):

  1. None: 通常情况下,PLYExporter 没有公开的属性,它主要是通过方法来执行导出操作。

方法 (Methods):

  1. constructor(): 构造函数,用于创建 PLYExporter 实例。

  2. parse(scene: THREE.Scene): string: parse 方法用于将给定的 Three.js 场景对象转换为 PLY 格式的字符串表示。它接受一个 THREE.Scene 实例作为参数,表示要导出的场景。

入参 (Parameters):

  1. scene: THREE.Scene 类型的参数,表示要导出为 PLY 格式的 Three.js 场景对象。

出参 (Return Values):

  1. string: parse 方法返回一个字符串,该字符串包含了表示给定场景中几何体数据的 PLY 格式内容。

完整代码


```html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>three.js webgl - exporter - ply</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 - ply
    </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 { PLYExporter } from 'three/addons/exporters/PLYExporter.js';
        import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

        // 定义场景、相机、渲染器和导出器变量
        let scene, camera, renderer, exporter, mesh;

        // 导出参数对象,包含不同导出格式的方法
        const params = {
            exportASCII: exportASCII,
            exportBinaryBigEndian: exportBinaryBigEndian,
            exportBinaryLittleEndian: exportBinaryLittleEndian
        };

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

        function init() {
            // 创建透视相机
            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100);
            camera.position.set(4, 2, 4);

            // 创建场景,设置背景和雾效
            scene = new THREE.Scene();
            scene.background = new THREE.Color(0xa0a0a0);
            scene.fog = new THREE.Fog(0xa0a0a0, 4, 20);

            // 创建 PLYExporter 实例
            exporter = new PLYExporter();

            // 添加光源和地面
            const hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444, 3);
            hemiLight.position.set(0, 20, 0);
            scene.add(hemiLight);

            const directionalLight = new THREE.DirectionalLight(0xffffff, 3);
            directionalLight.position.set(0, 20, 10);
            directionalLight.castShadow = true;
            directionalLight.shadow.camera.top = 2;
            directionalLight.shadow.camera.bottom = -2;
            directionalLight.shadow.camera.left = -2;
            directionalLight.shadow.camera.right = 2;
            scene.add(directionalLight);

            const ground = new THREE.Mesh(new THREE.PlaneGeometry(40, 40), new THREE.MeshPhongMaterial({ color: 0xcbcbcb, depthWrite: false }));
            ground.rotation.x = -Math.PI / 2;
            ground.receiveShadow = true;
            scene.add(ground);

            const grid = new THREE.GridHelper(40, 20, 0x000000, 0x000000);
            grid.material.opacity = 0.2;
            grid.material.transparent = true;
            scene.add(grid);

            // 创建几何体和材质,设置顶点颜色
            const geometry = new THREE.BoxGeometry();
            const material = new THREE.MeshPhongMaterial({ vertexColors: true });
            const colors = geometry.getAttribute('position').array.slice();
            for (let i = 0, l = colors.length; i < l; i++) {
                if (colors[i] > 0) colors[i] = 0.5;
                else colors[i] = 0;
            }
            geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3, false));

            // 创建网格对象并添加到场景中
            mesh = new THREE.Mesh(geometry, material);
            mesh.castShadow = true;
            mesh.position.y = 0.5;
            scene.add(mesh);

            // 创建渲染器并添加到页面中
            renderer = new THREE.WebGLRenderer({ antialias: true });
            renderer.setPixelRatio(window.devicePixelRatio);
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.shadowMap.enabled = true;
            document.body.appendChild(renderer.domElement);

            // 创建轨道控制器
            const controls = new OrbitControls(camera, renderer.domElement);
            controls.target.set(0, 0.5, 0);
            controls.update();

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

            // 创建 GUI 控件
            const gui = new GUI();
            gui.add(params, 'exportASCII').name('Export PLY (ASCII)');
            gui.add(params, 'exportBinaryBigEndian').name('Export PLY (Binary BE)');
            gui.add(params, 'exportBinaryLittleEndian').name('Export PLY (Binary LE)');
            gui.open(); // 默认展开 GUI
        }

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

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

        // 导出为 ASCII 格式
        function exportASCII() {
            exporter.parse(mesh, function (result) {
                saveString(result, 'box.ply');
            });
        }

        // 导出为二进制格式(大端)
        function exportBinaryBigEndian() {
            exporter.parse(mesh, function (result) {
                saveArrayBuffer(result, 'box.ply');
            }, { binary: true });
        }

        // 导出为二进制格式(小端)
        function exportBinaryLittleEndian() {
            exporter.parse(mesh, function (result) {
                saveArrayBuffer(result, 'box.ply');
            }, { binary: true, littleEndian: true });
        }

        // 创建用于下载的链接元素,并点击触发下载
        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);
        }

        // 将 ArrayBuffer 保存为文件
        function saveArrayBuffer(buffer, filename) {
            save(new Blob([buffer], { type: 'application/octet-stream' }), filename);
        }
    </script>
</body>
</html>

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

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

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

相关文章

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…

设计模式7--建造者模式

定义 案例一 案例二 优缺点

STM32 软件I2C方式读取AS5600磁编码器获取角度例程

STM32 软件I2C方式读取AS5600磁编码器获取角度例程 &#x1f516;本例程使用正点原子例程作为工程模板创建。 &#x1f4d8; 硬件电路部分 &#x1f33f;原理图部分&#xff1a; &#x1f33f;PCB布线和电路 ✨注意事项&#xff1a;有些硬件需要I2C上拉&#xff0c;否则检…

学习transformer模型-Input Embedding 嵌入层的简明介绍

今天介绍transformer模型的Input Embedding 嵌入层。 背景 嵌入层的目标是使模型能够更多地了解单词、标记或其他输入之间的关系。 从头开始嵌入Embeddings from Scratch 嵌入序列需要分词器tokenizer、词汇表和索引&#xff0c;以及词汇表中每个单词的三维嵌入。Embedding a s…

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…

Java 学习和实践笔记(51):基本的冒泡排序算法和优化的冒泡排序算法

常见的算法的可视动画演示效果可在这个网址查看&#xff1a; visualising data structures and algorithms through animation - VisuAlgo 基本的冒泡排序算法很简单&#xff0c;假定有10个数需要排序&#xff0c;那么就需要跑10轮&#xff0c;在每一轮里&#xff0c;都依次进…

攻防世界-Web(catcat-new)

任意文件读取漏洞是指攻击者通过在应用程序中输入非法的文件名或路径&#xff0c;从而获取未授权的文件读取权限的漏洞。攻击者可以利用此漏洞来读取系统文件、敏感数据或其他用户数据。这种漏洞通常是由于程序没有正确地检查用户的输入而引起的。建议开发人员在编写应用程序时…

Android adb ime 调试输入法

目录 前言列出所有输入法仅列出输入法 id列出所有输入法的所有信息 启用/禁用 输入法启用输入法禁用输入法 切换输入法还原输入法 前言 安装多个输入法后&#xff0c;可以在设置里进行切换。 既然是开发&#xff0c;能用命令就就命令~ ime 帮助说明&#xff1a; ime <c…

HarmonyOS 应用开发之Stage模型绑定FA模型ServiceAbility

本小节介绍Stage模型的两种应用组件如何绑定FA模型ServiceAbility组件。 UIAbility关联访问ServiceAbility UIAbility关联访问ServiceAbility和UIAbility关联访问ServiceExtensionAbility的方式完全相同。 import common from ohos.app.ability.common; import hilog from o…

vue系统——v-html

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-html指令</title> </head> <body&…

快速上手Spring Cloud 十七:深入浅出的学习之旅

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

【SpringCloud】认识微服务

目 录 一.服务架构演变单体架构分布式架构服务治理微服务总结 二.微服务技术对比微服务结构微服务技术对比企业需求 三.SpringCloud 一.服务架构演变 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点&#xff1a; 架…

JavaScript高级 —— 学习(三)

一、深入面向对象 分为面向过程和面向对象两种&#xff0c;面向过程是以步骤来划分问题&#xff0c;在这儿不做过多描述。 &#xff08;一&#xff09;面向对象介绍 把事务分解成一个个对象&#xff0c;由对象之间分工合作&#xff0c;面向对象是以对象功能来划分问题&#…

本地项目上传到GitHub

本文档因使用实际项目提交做为案例&#xff0c;故使用xxx等字符进行脱敏&#xff0c;同时隐藏了部分输出&#xff0c;已实际项目和命令行输出为准 0、 Git 安装与GitHub注册 1&#xff09; 在下述地址下载Git&#xff0c;安装一路默认下一步即可。安装完成后&#xff0c;随便…

开源知识库平台Raneto--使用Docker部署Raneto

文章目录 一、Raneto介绍1.1 Raneto简介1.2 知识库介绍 二、阿里云环境2.1 环境规划2.2 部署介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Raneto镜像五、部署Raneto知识库平台5.1 创建挂载目录5.2 编辑config.js文件5.…

金三银四面试题(八):JVM常见面试题(2)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中​JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 JRE、JDK、JVM 及JIT 之间有什么不同&#xff1f; JRE 代表Java 运行时&#xff08;Java run-time&#…

Vue 05 Vuex

Vue 学习 Vue 05 vuex01 介绍02 工作原理&#xff08;原理图&#xff09;使用 03 案例求和补充HTML 纯vue实现vuex使用 04 getters配置项05 mapState 与 mapGetters补&#xff1a;ES6语法mapState使用mapGetters总结 06 mapActions 与 mapMutationsmapMutationsmapActions总结 …

最新Java面试题1【2024中级】

互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字节跳动Java面试题-大数据方向 6&#xff1a;百度Java面试题 7&#xff1a;蚂蚁金服Java…

深入理解 Hadoop 上的 Hive 查询执行流程

在 Hadoop 生态系统中&#xff0c;Hive 是一个重要的分支&#xff0c;它构建在 Hadoop 之上&#xff0c;提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集&#xff0c;包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…

java数组与集合框架(一) -- 数据结构,数组

数据结构 概述 为什么要讲数据结构&#xff1f; 任何一个有志于从事IT领域的人员来说&#xff0c;数据结构&#xff08;Data Structure&#xff09;是一门和计算机硬件与软件都密切相关的学科&#xff0c;它的研究重点是在计算机的程序设计领域中探讨如何在计算机中组织和存储…