在 Three.js 中,`USDZExporter` 类用于将场景导出为 USDZ 格式,这是一种用于在 iOS 平台上显示增强现实(AR)内容的格式。

news2024/11/24 16:23:06

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

在 Three.js 中,USDZExporter 类用于将场景导出为 USDZ 格式,这是一种用于在 iOS 平台上显示增强现实(AR)内容的格式。下面是关于 USDZExporter 的入参、出参、方法和属性的讲解:

入参 (Parameters):

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

出参 (Return Value):

  1. Promise: parse 方法返回一个 Promise 对象,该 Promise 在导出完成时解析为导出的 USDZ 文件的二进制数据。

方法 (Methods):

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

  2. parse(scene: THREE.Scene): Promise: parse 方法用于将给定的 Three.js 场景对象转换为 USDZ 格式。它接受一个 THREE.Scene 实例作为参数,表示要导出的场景,并返回一个 Promise 对象,该对象在导出完成时解析为导出的 USDZ 文件的二进制数据。

完整代码

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - USDZ exporter</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">
		<style>
			body {
				background-color: #eee;
			}
			#info {
				color: #222;
			}
			a {
				color: #00f
			}
			#button {
				position: absolute;
				bottom: 15px;
				left: calc(50% - 40px);

			}
		</style>
	</head>

	<body>
		<div id="info">
			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - USDZ exporter<br />
			Battle Damaged Sci-fi Helmet by
			<a href="https://sketchfab.com/theblueturtle_" target="_blank" rel="noopener">theblueturtle_</a>
		</div>

		<a id="link" rel="ar" href="" download="asset.usdz">
			<img id="button" width="100" src="files/arkit.png">
		</a>

		<script type="importmap">
			{
				"imports": {
					"three": "../build/three.module.js",
					"three/addons/": "./jsm/"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three';

			import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; // 导入 OrbitControls
			import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js'; // 导入 RoomEnvironment

			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; // 导入 GLTFLoader
			import { USDZExporter } from 'three/addons/exporters/USDZExporter.js'; // 导入 USDZExporter
			import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; // 导入 GUI

			let camera, scene, renderer;

			const params = {
				exportUSDZ: exportUSDZ // 导出 USDZ 文件的函数
			};

			init(); // 初始化函数
			render(); // 渲染函数

			function init() {

				renderer = new THREE.WebGLRenderer( { antialias: true } ); // 创建 WebGL 渲染器
				renderer.setPixelRatio( window.devicePixelRatio ); // 设置像素比率
				renderer.setSize( window.innerWidth, window.innerHeight ); // 设置渲染器尺寸
				renderer.toneMapping = THREE.ACESFilmicToneMapping; // 设置色调映射
				document.body.appendChild( renderer.domElement ); // 将渲染器的 DOM 元素添加到文档中

				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.25, 20 ); // 创建透视摄像机
				camera.position.set( - 2.5, 0.6, 3.0 ); // 设置摄像机位置

				const pmremGenerator = new THREE.PMREMGenerator( renderer ); // 创建 PMREMGenerator

				scene = new THREE.Scene(); // 创建场景
				scene.background = new THREE.Color( 0xf0f0f0 ); // 设置场景背景色
				scene.environment = pmremGenerator.fromScene( new RoomEnvironment( renderer ), 0.04 ).texture; // 设置环境贴图

				const loader = new GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' ); // 创建 GLTFLoader
				loader.load( 'DamagedHelmet.gltf', async function ( gltf ) { // 加载 GLTF 模型
					scene.add( gltf.scene ); // 将加载的模型添加到场景中

					const shadowMesh = createSpotShadowMesh(); // 创建阴影网格
					shadowMesh.position.y = - 1.1; // 设置阴影网格位置
					shadowMesh.position.z = - 0.25; // 设置阴影网格位置
					shadowMesh.scale.setScalar( 2 ); // 设置阴影网格缩放
					scene.add( shadowMesh ); // 将阴影网格添加到场景中

					render(); // 渲染场景

					// 导出 USDZ

					const exporter = new USDZExporter(); // 创建 USDZExporter
					const arraybuffer = await exporter.parse( gltf.scene ); // 将场景导出为 USDZ 格式
					const blob = new Blob( [ arraybuffer ], { type: 'application/octet-stream' } ); // 创建 Blob 对象

					const link = document.getElementById( 'link' ); // 获取下载链接元素
					link.href = URL.createObjectURL( blob ); // 设置下载链接的 href 属性为导出的 USDZ 文件的 URL

				} );

				const controls = new OrbitControls( camera, renderer.domElement ); // 创建 OrbitControls
				controls.addEventListener( 'change', render ); // 添加控制器变化事件监听器
				controls.minDistance = 2; // 设置控制器最小距离
				controls.maxDistance = 10; // 设置控制器最大距离
				controls.target.set( 0, - 0.15, - 0.2 ); // 设置控制器焦点
				controls.update(); // 更新控制器

				window.addEventListener( 'resize', onWindowResize ); // 添加窗口大小调整事件监听器

				const isIOS = /iPad|iPhone|iPod/.test( navigator.userAgent ); // 检查是否为 iOS 设备

				if ( isIOS === false ) { // 如果不是 iOS 设备

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

					gui.add( params, 'exportUSDZ' ).name( 'Export USDZ' ); // 添加导出 USDZ 按钮到 GUI
					gui.open(); // 打开 GUI

				}

			}

			function createSpotShadowMesh() {

				const canvas = document.createElement( 'canvas' ); // 创建 canvas 元素
				canvas.width = 128; // 设置 canvas 宽度
				canvas.height = 128; // 设置 canvas 高度

				const context = canvas.getContext( '2d' ); // 获取 2D 渲染上下文
				const gradient = context.createRadialGradient( canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2 ); //

 创建径向渐变
				gradient.addColorStop( 0.1, 'rgba(130,130,130,1)' ); // 添加颜色停止
				gradient.addColorStop( 1, 'rgba(255,255,255,1)' ); // 添加颜色停止

				context.fillStyle = gradient; // 设置填充样式为渐变
				context.fillRect( 0, 0, canvas.width, canvas.height ); // 绘制矩形

				const shadowTexture = new THREE.CanvasTexture( canvas ); // 创建纹理对象

				const geometry = new THREE.PlaneGeometry(); // 创建平面几何体
				const material = new THREE.MeshBasicMaterial( { // 创建基础网格材质
					map: shadowTexture, blending: THREE.MultiplyBlending, toneMapped: false
				} );

				const mesh = new THREE.Mesh( geometry, material ); // 创建网格对象
				mesh.rotation.x = - Math.PI / 2; // 设置网格旋转

				return mesh; // 返回网格对象

			}

			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight; // 设置摄像机宽高比
				camera.updateProjectionMatrix(); // 更新摄像机投影矩阵

				renderer.setSize( window.innerWidth, window.innerHeight ); // 更新渲染器尺寸

				render(); // 渲染场景

			}

			function exportUSDZ() {

				const link = document.getElementById( 'link' ); // 获取下载链接元素
				link.click(); // 模拟点击下载链接

			}

			//

			function render() {

				renderer.render( scene, camera ); // 渲染场景

			}

		</script>

	</body>
</html>

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题&#xff1a;# Error loading design解决&#xff0c;是tb文件中没加&#xff1a;timescale 1&#xff0c;一直走下来&#xff0c;在modelsim中出现了下面问题2&#xff0c;rtl文件、tb文件2.1&#xff0c;rtl代码2.2&#xff0c;tb测试2.3&a…

C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 本地化构建能够本地化的用户界面 每…

Day5-

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

封装表格组件,最后一列动态生成 vue3子组件通过slot传值向父组件

将表格二次封装&#xff0c;方便以后开发中的复用。每次只需调用表格组件后&#xff0c;在父组件中往子组件标签上写入dataSource&#xff08;表格数据&#xff09;和columns&#xff08;表格列标题&#xff09;即可。 此案例中最后一列是删除按钮&#xff0c;动态生成&#xf…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前&#xff0c;我们需要了解什么是dpi分辨率&#xff0c;简单来说&#xff0c;分辨率是指图像中包含的像素数量&#xff0c;分辨率越高&#xff0c;图像就越清晰&#xff0c;常见的分辨率包括72dpi、96dpi和300dpi等&#xff0c;在打印照片或者一些考试平台对图片…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

【论文阅读】DETR 论文逐段精读

【论文阅读】DETR 论文逐段精读 文章目录 【论文阅读】DETR 论文逐段精读&#x1f4d6;DETR 论文精读【论文精读】&#x1f310;前言&#x1f4cb;摘要&#x1f4da;引言&#x1f9ec;相关工作&#x1f50d;方法&#x1f4a1;目标函数&#x1f4dc;模型结构⚙️代码 &#x1f4…

Django源码之路由匹配(下)——图解逐步分析底层源码

目录 1. 前言 2. 路由匹配全过程分析 2.1 请求的入口 2.2 request的封装 2.3 response的源头 2.4 handler的获取 2.5 获取resolver对象 2.6 路由进行匹配 3. 小结 1. 前言 在上一篇文章中&#xff0c;我们谈到了路由的定义&#xff0c;通过URLPattern路由路径对象和Rou…

c/c++ | socket tcp client server

突然想着&#xff0c;花一个socket tcp 客户-服务通信 这应该是很经典的流程了吧 感觉还是要训练这种随手画图的能力&#xff0c;毕竟文字的描述还是不及图片强烈 参考01

基于深度学习的停车场车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 上图测试结果如下图所示&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 image imread(image_test\test.jpg); image2 image;%图…

九河云携手华为云推出海外电商解决方案,一体化解决出海问题

随着国内竞争的日益激烈&#xff0c;国内企业的出海热情正在逐步提高。国外尤其是东南亚等地区&#xff0c;正在成为企业营收的新增长点。九河云携手华为云为客户带来了海外电商部署方案。华为云作为增长最快的云服务提供商&#xff0c;秉持着为客户提供最优质服务的原则&#…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段&#xff0c;其中Word文档因其强大的功能性而广受欢迎。然而&#xff0c;在网络分享、版本控制、代码阅读及编写等方面&#xff0c;Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…

vue改名为威优易?

文章目录 vue改名为威优易&#xff1f; 祝大家愚人节快乐哇&#xff01; 哈哈&#xff0c;大家愚人节快乐&#xff01;看来我刚刚的“爆料”确实把大家吓了一跳&#xff0c;Vue.js要改名为“威优易”&#xff1f;这纯粹是官方在这个愚人节使者开的一个小小玩笑啦&#xff01; …

修改Gradio界面中按钮Submit、Clear,Flag为中文,修改additional_inputs标签。

展示如图 Submit、Clear、additional_inputs标签 Submit、Clear修改 修改gradio库中interface.py additional_inputs标签 同一文件下 flag修改 flag展示

vscode批量编辑行头行尾

ctrlf查找那儿将最后的星星选中即为正则表达式模式 ^ 表示行头$ 表示行尾 例如&#xff0c;在行首添加大括号{ &#xff1a; vsCode中可以使用正则表达式模式找到换行。指定字符替换成换行&#xff0c;在替换字符串里将换行用\n表示就可以了。 查找换行符也是在查找那儿使用\…

【C语言进阶】- 内存函数

内存函数 1.1 内存函数的使用1.2 memcpy函数的使用1.3 memcpy函数的模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现2.3 memcmp函数的使用2.4 memset函数的使用 1.1 内存函数的使用 内存函数就是对内存中的数据进行操作的函数 1.2 memcpy函数的使用 void* memcpy ( …

机器学习: 绪论(基础概念)

文章目录 一、机器学习做什么二、机器学习的基本术语2.1、数据相关2.1.1、数据集2.1.2、特征&#xff08;Feature&#xff09;2.1.3、样本空间&#xff08;Sample Space&#xff09; 2.2、任务相关2.2.1、分类2.2.2、回归2.2.3、聚类2.2.4、监督学习和无监督学习 三、机器学习思…

在CentOS 8.5.2111下安装vncserver

# 参考&#xff1a; 如何在 CentOS 8/RHEL 8 上安装配置 VNC 服务器 安装CentOS 8.5.2111 及 vncserver # 标准安装步骤 安装GNOME桌面环境使用屏幕号:1。安装VNC服务器&#xff08;tigervnc-server tigervnc&#xff09;设置VNC密码设置VNC服务器配置文件开启vnc服务。开放防…

设计模式25--策略模式

定义 案例一 案例二 优缺点