百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Threlte.js:Svelte 开始全面拥抱 Three.js!

liebian365 2025-01-13 15:22 17 浏览 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

今天给大家带来的主题是 Threlte,即 Svelte 生态的渲染器和组件库,用于在 Svelte 应用程序中以声明式和状态驱动的方式构建和渲染 Three.js 场景。话不多说,直接开始!

1.什么是 Threlte

Threlte 是 Svelte 的渲染器和组件库,用于在 Svelte 应用程序中以声明式和状态驱动的方式构建和渲染 Three.js 场景。

Threlte 的灵感来自于 react-three-fiber 的合理默认、Sveltes 反应性模型和 Svelte Cubed 的简单性和有效性。

Threlte 提供严格类型化的组件,可以快速、轻松地构建具有深度反应性和开箱即用交互性的 Three.js 场景。它还提供构建块(building blocks),以便在需要时快速扩展 Threlte。

但是,值得注意的是,Threlte 仍在积极开发中,后续可能会有突破性的变化, 更新前请检查发布说明。 安全起见,请使用 npm i @threlte/core --save-exact 安装 Threlte 以锁定版本,@threlte/extras 和 @threlte/rapier 也是如此。

目前 Threlte 在 Github 上通过 MIT 协议开源,有超过 1k 的 star、是一个值得关注的前端开源项目。

2.为什么需要 Threlte

svelte 已经有 three.js 组件库,但是 threlte 在某些方面有所不同:

合理的默认值

在介绍 threlte 之前需要重点介绍下 React-Three-Fiber,其是 ThreeJS 的 React 渲染器。使用可重用、独立的组件以声明方式构建场景,这些组件对状态做出反应,易于交互并且可以参与 React 的生态。

npm install three @types/three @react-three/fiber

与 react-three-fiber 非常相似,threlte 会将合理的默认值设置为 Three.js WebGLRenderer、所有颜色和纹理等,这使开发者可以轻松遵循色彩接收和准确性方面的最佳实践。 threlte 还通过其 <Layers> 组件使可见性管理变得非常容易。

统一帧循环(Unified frame loop)

默认情况下,threlte 仅在需要时渲染场景:如果 prop 发生更改而需要渲染场景,场景中存在任何交互式对象,或者 threlte 在任何组件中使用 useFrame。

丰富的互动性

threlte 使得可以在 Three.js 对象上使用事件,就好像它们是常规 DOM 元素一样:

 <Mesh
 … Interactive
on:click={onClick}>

开发者还可以监听对象离开或进入视口:

<Mesh
… viewportAware
on :viewportenter={onViewportEnter}>

TypeScript 支持

所有 threlte 组件都是用 TypeScript 编写的,因此类型支持是一等公民。

EffectComposer 支持

使用 <Pass pass={new GlitchPass()} /> 添加 Pass,threlte 将负责设置默认 RenderPass 并渲染到 EffectComposer 而不是 WebGLRenderer。

文本渲染

在文本渲染时候,threlte 使用 troika-three-text。

troika-two-text 包使用有符号距离场 (SDF) 和使用标准导数的抗锯齿功能,在 Three.js 场景中提供高质量的文本渲染。

troika-two-text 不依赖于预先生成的 SDF 纹理,而是直接使用 Typr 解析字体文件(.ttf、.otf、.woff),并在使用字形时即时生成 SDF 图集。 它还可以处理正确的字距调整、连字字形替换、从右到左/双向布局以及阿拉伯语等连接脚本。 所有字体解析、SDF 生成和字形布局均在 Web Worker 中执行,以防止丢帧。

生成 SDF 后,它会组装一个定位所有字形的几何体,并使用正确的着色器代码修补任何 Three.js 材质以渲染 SDF。 这意味着开发者仍然可以受益于 Three.js 内置材质的所有功能,例如光照、基于物理的渲染、阴影和雾。

<Text text="Hello World" />

自动处置

Svelte 了解组件生命周期,因此 Threlte 将尝试通过对所有已卸载对象调用 dispose(如果存在)以及对场景中其他任何地方未使用的所有属性递归调用 dispose 来释放资源。

访问所有区域

  • 绑定到 three.js 对象实例 <Mesh … bind:mesh>
  • 访问渲染器 const { renderer, invalidate } = useThrelte()

同时 threlte 非常易于扩展。

Tree-shakeble

React-Three-Fiber 非常擅长使用 Three.js 类作为 JSX 组件。 这意味着对某个 Three.js 版本没有硬依赖,并且 Three.js 中可能的所有内容也都被 React-Three-Fiber 覆盖了。

然而,有一个缺点:react-Three-Fiber 在运行时查找 Three.js 类。 这意味着即使 react-Three-Fiber 应用程序只使用了 Three.js 的一小部分,开发者也需要完整地提供 Three.js。

而 threlte 不会在运行时查找 Three.js 类,因此与 Three.js 本身相比其功能受到限制。 然而,它试图涵盖 Three.js 的大多数用例,并提供功能组件以使扩展 threlte 尽可能容易。 因此,打包器能够对 tree-shake threlte 并在某种程度上限制 Three.js 的哪些部分被打包。

3.快速入门 Threlte

安装 Threlte

Threlte 由 4 个软件包组成,可以单独安装和使用。 所有项目都需要@threlte/core 和三个包,而其他包是可选的。

  • @threlte/core 和 three.js : 必需,是 three.js 和核心库,以声明式和状态驱动的方式构建 Three.js 场景。
  • @threlte/preprocess:Threlte 的预处理器提供自动导入和改进的开发人员体验。
  • svelte-sequential-preprocessor : 外部包,如果还需要运行其他预处理器,则需要它。
  • @threlte/extras: 扩展核心功能的组件、工具、hooks 等。
  • @threlte/rapier:在 Threlte 中使用 Rapier 物理引擎的组件和钩子。
  • @threlte/theatre:在 Threlte 中使用动画库 Theatre.js 的组件和钩子。
  • @types/three : 外部包,Three.js 的 TypeScript 类型。

使用 npm、pnpm、yarn 或您喜欢的任何其他包管理器安装包。

npm i -D three @threlte/core @threlte/preprocess svelte-sequential-preprocessor @threlte/extras @threlte/rapier @dimforge/rapier3d-compat @threlte/theatre @theatre/core @theatre/studio @types/three

配置

第一步调整 svelte.config.js,将 Threlte 的预处理器以及 svelte-sequential-preprocessor 添加到 Svelte 配置中:

import seqPreprocessor from 'svelte-sequential-preprocessor'
import { preprocessThrelte } from '@threlte/preprocess'
	preprocess: seqPreprocessor([preprocess(), preprocessThrelte()])
}
export default config

接着调整 vite.config.js,如果将 Threlte 与 SvelteKit 一起使用,需要调整 Vite 配置,以防止通过 vites 外部化步骤将 three 和 troika-three-text 外部化用于 SSR。

// vite.config.js
const config = {
  // …
  ssr: {
    noExternal: ["three", "troika-three-text"],
  },
};

构建第一个 Scene

如下面代码所示:

<script>
	import { Canvas, InteractiveObject, OrbitControls, T } from '@threlte/core'
	import { spring } from 'svelte/motion'
	import { degToRad } from 'three/src/math/MathUtils'

	const scale = spring(1)
</script>

<div>
	<Canvas>
		<T.PerspectiveCamera makeDefault position={[10, 10, 10]} fov={24}>
			<OrbitControls maxPolarAngle={degToRad(80)} enableZoom={false} target={{ y: 0.5 }} />
		</T.PerspectiveCamera>

		<T.DirectionalLight castShadow position={[3, 10, 10]} />
		<T.DirectionalLight position={[-3, 10, -10]} intensity={0.2} />
		<T.AmbientLight intensity={0.2} />

		<!-- Cube -->
		<T.Group scale={$scale}>
			<T.Mesh position.y={0.5} castShadow let:ref>
				<!-- Add interaction -->
				<InteractiveObject
					object={ref}
					interactive
					on:pointerenter={() => ($scale = 2)}
					on:pointerleave={() => ($scale = 1)}
				/>

				<T.BoxGeometry />
				<T.MeshStandardMaterial color="#333333" />
			</T.Mesh>
		</T.Group>

		<!-- Floor -->
		<T.Mesh receiveShadow rotation.x={degToRad(-90)}>
			<T.CircleGeometry args={[3, 72]} />
			<T.MeshStandardMaterial color="white" />
		</T.Mesh>
	</Canvas>
</div>

关于 Threlte 更多组件、hooks 等的用法本文不再展开,可以参考文末的资料自行阅读。

3.本文总结

本文主要和大家介绍 Threlte,即 Svelte 生态的渲染器和组件库,用于在 Svelte 应用程序中以声明式和状态驱动的方式构建和渲染 Three.js 场景。相信通过本文的阅读,大家对 Threlte 会有一个初步的了解。

因为篇幅有限,关于 Threlte 的更多用法和特性文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏,您的支持是我不断创作的动力。

参考资料

https://github.com/threlte/threlte

https://threlte.xyz/features#easily-extendable

https://threlte.xyz/rapier/auto-colliders#properties

https://github.com/pmndrs/react-three-fiber

https://github.com/protectwise/troika/tree/main/packages/troika-three-text

https://threlte.xyz/

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: