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

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>

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

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

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

相关文章

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

WSL Ubuntu20 使用1panelSSH连接失败(SSH服务初始化配置)

文章目录 安装网络工具ssh配置ssh服务安装 配置信息&#xff08;命令行&#xff09;配置信息&#xff08;可视化&#xff09;基础配置&#xff08;可省过&#xff09;高级配置&#xff08;必须&#xff09; 面板中终端配置SSH连接 安装网络工具 安装net工具apt install net-to…

行人重识别项目 | 基于Pytorch实现ReID行人重识别算法

项目应用场景 面向行人重识别场景&#xff0c;项目具有轻量化 (训练的时候也只需要 2GB 的显存占用)、性能好 (只使用 softmax 损失就能够达到 Rank188.24%, mAP70.68%)&#xff0c;另外提供友好的上手项目流程教程 项目效果&#xff1a; 项目流程 > 具体参见项目内README.…

书生·浦语大模型全链路开源体系-第2课

书生浦语大模型全链路开源体系-第2课 书生浦语大模型全链路开源体系-第2课相关资源实战部署InternLM2-Chat-1.8B模型准备环境下载模型运行案例 实战部署InternLM2-Chat-7B模型准备环境下载模型及案例代码运行cli案例代码运行web案例代码配置SSH公钥信息配置SHH隧道连接 熟悉 Hu…

Echarts实现高亮某一个点

背景 接口会返回所有点的数据&#xff0c;以及最优点的数据。产品要求在绘制图形后&#xff0c;高亮最优点&#xff0c;添加一个红色的样式&#xff0c;如图。点击select选择器时&#xff0c;可选择不同指标和花费对应的关系。 以下介绍实现思路 1、自定义配置选择器的数据源…

稀碎从零算法笔记Day36-LeetCode:H指数

有点绕的一个题&#xff0c;题目描述的有点奇怪&#xff08;可以看下英文&#xff1f;&#xff09; 题型&#xff1a;数组、模拟 链接&#xff1a;274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 citations &am…

ArcGIS Pro怎么进行挖填方计算

在工程实施之前&#xff0c;我们需要充分利用地形&#xff0c;结合实际因素&#xff0c;通过挖填方计算项目的标高&#xff0c;以达到合理控制成本的目的&#xff0c;这里为大家介绍一下ArcGIS Pro中挖填方计算的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…

Android仿高德首页三段式滑动

最近发现很多app都使用了三段式滑动&#xff0c;比如说高德的首页和某宝等物流信息都是使用的三段式滑动方式&#xff0c;谷歌其实给了我们很好的2段式滑动&#xff0c;就是BottomSheet&#xff0c;所以这次我也是在这个原理基础上做了一个小小的修改来实现我们今天想要的效果。…

13.5k star, 免费开源 Markdown 编辑器

13.5k star, 免费开源 Markdown 编辑器 分类 开源分享 项目名: Editor.md -- Markdown 编辑器 Github 开源地址&#xff1a; https://github.com/pandao/editor.md 在线测试地址&#xff1a; Editor.md - 开源在线 Markdown 编辑器 完整实例&#xff1a; HTML Preview(mark…

LLaMA-Factory微调(sft)ChatGLM3-6B保姆教程

LLaMA-Factory微调&#xff08;sft&#xff09;ChatGLM3-6B保姆教程 准备 1、下载 下载LLaMA-Factory下载ChatGLM3-6B下载ChatGLM3windows下载CUDA ToolKit 12.1 &#xff08;本人是在windows进行训练的&#xff0c;显卡GTX 1660 Ti&#xff09; CUDA安装完毕后&#xff0c…

iPhone设备中查看应用程序崩溃日志的最佳实践与经验分享

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

RT-Thread 学习二:基于 RT Thread studio (联合cubemx)的stm32l475VETX pwm 呼吸灯实验

1、基于芯片创建呼吸灯项目 基于rtthread studio 可以帮助我们创建好底层驱动&#xff0c;我们只需要做简单配置 2、配置pwm 设备 基于芯片生成的项目默认只打开了 uart 和 pin的驱动&#xff0c;对于其它硬件驱动需要自行配置&#xff1b; 对于pwm和设备的驱动分为四步&am…

深入理解数据结构——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

将 Elasticsearch 向量数据库引入到数据上的 Azure OpenAI 服务(预览)

作者&#xff1a;来自 Elastic Aditya Tripathi Microsoft 和 Elastic 很高兴地宣布&#xff0c;全球下载次数最多的向量数据库 Elasticsearch 是公共预览版中 Azure OpenAI Service On Your Data 官方支持的向量存储和检索增强搜索技术。 这项突破性的功能使你能够利用 GPT-4 …

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;从左下角或者右上角元素出发&#xff0c;来寻找target。解题思路二&#xff1a;右上角元素&#xff0c;代码解题思路三&#xff1a;暴力也能过解题思路四&#xff1a;二分…

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…

蓝桥杯真题:成绩统计

这题思路简单&#xff0c;但是输出结果的位置容易出错&#xff0c;题目要求四舍五入&#xff0c;所以要用Math.round&#xff08;&#xff09;的方法

【MySQL】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…

软件工程知识体系 Chapter3 软件构造

介绍 软件构造一词指的是通过编码、验证、单元测试、集成测试和调试等组合详细创建工作软件的过程。 软件构建知识领域&#xff08;KA&#xff09;与所有其他KA都有关联&#xff0c;但它与软件设计和软件测试的关联最为紧密&#xff0c;因为软件构建过程涉及重要的软件设计和…