使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

news/2024/11/16 21:34:43/

前言

假设您正在现有项目中集成这些包,而该项目的构建工具为 Webpack 或 Vite。同时,您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法,请随时留言。

安装

npm install three @types/three @react-three/fiber @react-three/drei @mkkellogg/gaussian-splats-3d

设置两个标头

gaussian-splats-3d内部使用Worker和SharedArrayBuffer(共享内存)。
对于顶级文档,需要设置两个标头来实现你网站的跨源隔离:

  • Cross-Origin-Opener-Policy 设置为 same-origin(来保护你的源站点免受攻击)
  • Cross-Origin-Embedder-Policy 设置为 require-corp 或 credentialless(保护受害者免受你的源站点的影响)
webpack设置标头
{"devServer":{"headers": {"Cross-Origin-Embedder-Policy": "require-corp","Cross-Origin-Opener-Policy": "same-origin"}}
}
vite设置标头
npm i -D vite-plugin-cross-origin-isolation
import { defineConfig } from "vite";export default defineConfig({plugins: [{name: "configure-response-headers",configureServer: (server) => {server.middlewares.use((_req, res, next) => {res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");res.setHeader("Cross-Origin-Opener-Policy", "same-origin");next();});},},],
});

创建一个组件

useViewer.ts

import { useCallback, useEffect } from 'react';
import * as GaussianSplats3D from '@mkkellogg/gaussian-splats-3d';
import { Scene } from 'three';interface Options {scene: Scene;
}
export const useViewer= ({ scene }: Options) => {const init = useCallback(() => {const viewer = new GaussianSplats3D.DropInViewer();viewer.addSplatScenes([{path: 'assets/bonsai-7k-mini.splat',splatAlphaRemovalThreshold: 20}],true);scene.add(viewer);}, [scene]);useEffect(() => {init();}, []);
};
import React, { useRef } from 'react';
import { Canvas } from '@react-three/fiber';
import { OrbitControls } from '@react-three/drei';
import { PerspectiveCamera, Scene, Vector3 } from 'three';
import { useViewer } from '@/hooks/useWorkRoom';function setupCamera() {const camera = new PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 500);camera.position.set(0, -4, 0);camera.lookAt(new Vector3().fromArray([0, 0, 0]));camera.up = new Vector3().fromArray([0, -1, -0.6]).normalize();return camera;
}function setupScene() {const scene = new Scene();return scene;
}export const Dashboard = () => {const scene = useRef<Scene>(setupScene());const camera = useRef<PerspectiveCamera>(setupCamera());useViewer({ scene: scene.current });return (<Canvas scene={scene.current} camera={camera.current}><OrbitControls /></Canvas>);
};export default Dashboard;

效果

在这里插入图片描述


http://www.ppmy.cn/news/1547548.html

相关文章

Django数据写入MySQL数据库

将 Django 模型写入 MySQL 数据库的步骤与写入其他数据库类型基本相同。以下是详细的步骤和示例&#xff0c;帮助你在 Django 项目中配置 MySQL 数据库并写入数据。 1. 安装 MySQL 和相关依赖 首先&#xff0c;确保你已经安装了 MySQL 数据库服务器和 mysqlclient 包。mysqlc…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集&#xff0c;这个数据集的总数据量是5934条&#xff0c;标签为anger、fear、joy三种情感的其中一种&#xff0c;很明显是一个多分类任务。这里&#xff0c;我们将使用微调技巧进行深度学习建模&#xff0c;同时我们会比…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用&#xff0c;简化繁琐的抓包流程。 一键生成去更新IPA&#xff08;手机安装后&#xff0c;去除App Store的更新检测&#xff09;。 软件界面 支持系统 Windows 10/Windows 8/Windows 7&#xff08;由于使用了Fiddler库&#xff0c;因此需要.Net环境…

CAP与BASE分布式理论

CAP理论 C&#xff1a;Consistency 一致性&#xff1a;指强一致性&#xff0c;分布式系统中的所有节点在同一时刻具有同样的值、都是最新的数据副本&#xff0c;一致性保证了不管向哪台服务器写入数据&#xff0c;其他的服务器能实时同步数据 强一致性&#xff1a;写入数据的时…

C++11新特性:lambda表达式,包装器,新的类功能

1. lambda表达式 1.1 基本语法 lambda表达式本质上是一个匿名函数对象&#xff0c;但是和普通函数不一样他可以定义在函数内部。 lambda表达式使用层而言没有类型&#xff0c;所以我们一般使用auto或者模板参数定义的对象去接收lambda对象。 lambda表达式的格式如下&#x…

高级java每日一道面试题-2024年11月04日-Redis篇-Redis如何做内存优化?

如果有遗漏,评论区告诉我进行补充 面试官: Redis如何做内存优化? 我回答: 在Java高级面试中&#xff0c;关于Redis如何做内存优化的问题&#xff0c;可以从以下几个方面进行详细解答&#xff1a; 一、Redis内存优化概述 Redis内存优化主要是指通过一系列策略和技术&#…

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…