Rollup作者新作: Svelte Cubed!VR/AR 指日可待?

简介: Rollup作者新作: Svelte Cubed!VR/AR 指日可待?

在2021年11月20日,Svelte 召开了第四次虚拟会议。


image.png


而会议中最令我眼前一新的当然是 轮子哥 Rich-Harris 带来的 Svelte Cubed 了。


科普:轮子哥 Rich-Harris:Svelte、Rollup 作者


image.png


这个项目亮眼的地方,并不是因为其他的演讲者不好,也并不是因为轮子哥是 Svelte 作者的原因。而是因为他带来的 Svelte-Cubed 和我目前在公司负责项目的技术栈有非常相似的感觉。在公司由于需要开发一个 新 的 H5 项目,因此我采用了较为激进的 Svelte + Aframe/Three.js + Tailwind.css + Vite 的组合。整套组合下来,无论是开发体验还是最后生产包的体积都非常的美妙~  因此当我看到 轮子哥发布这个 新轮子 的时候,我无比激动,居然把我想要的组合直接集成到了 Svelte


然后我们来看看 Svelte-Cubed 面貌:


打开 https://svelte-cubed.vercel.app/ ,目前官网没有用自定义的域名,直接用了 vercel 的域名,猜测和 轮子哥去了 vercel  工作有关系。


image.png


我们来看看 cubed 官方的一些示例:


image.png


实战



我们来尝试一下自己写一个项目,首先初始化一个 svelte 项目


npm init svelte@next my-new-app
cd my-new-app
npm install
npm run dev


安装 Three.js 和 svelte-cubed


npm install three svelte-cubed


如果使用 TypeScript ,还需要引入 Three.js 的 ts 声明


npm install -D @types/three


打开 src/routes/index.svelte


<script>
 import * as THREE from 'three';
 import * as SC from 'svelte-cubed';
</script>
<SC.Canvas>
 <SC.Mesh geometry={new THREE.BoxGeometry()} />
 <SC.PerspectiveCamera position={[1, 1, 3]} />
</SC.Canvas>


然后运行 npm run dev


image.png


然后就报错了,通过查询,大概是因为没有设置一个 vite 选项。


打开 svelte.config.js ,加入关旭 vite ssr 的选项即可解决。


import adapter from '@sveltejs/adapter-auto';
/** @type {import('@sveltejs/kit').Config} */
const config = {
 kit: {
  adapter: adapter(),
  // hydrate the <div id="svelte"> element in src/app.html
  target: '#svelte',
  vite: {
   ssr: {
    noExternal: ["three"]
   }
  }
 }
};
export default config;


image.png


我们的项目就被运行起来了。


官方也明确说了,不会对 Three.js 对象进行包装,而是直接使用 Three.js 去创建并设置对象,因此需要在代码中引入 Three.js ,(个人感觉这样的好处是能够让我们没有成本地从其他非数据驱动的 Three.js 项目中,迁移到 Svelte-cubed 中)。


可以看到如果用 纯 Three.js 去写代码,将会比用Svelte-Cubed 多出好几倍的内容。随着时间的推移,命令式代码也会变得不太容易维护。


image.png



通过添加控制器,我们可以轻松进行交互。


打开 src/routes/index.svelte


<SC.Canvas antialias background={new THREE.Color('papayawhip')}>
 <SC.Mesh geometry={new THREE.BoxGeometry()} />
 <SC.PerspectiveCamera position={[1, 1, 3]} />
+ <SC.OrbitControls enableZoom={false} />
</SC.Canvas>


image.png


利用 Svelte 的数据驱动轻松修改 Three.js Objects.


<script>
 import * as THREE from 'three';
 import * as SC from 'svelte-cubed';
+
+ let width = 1;
+ let height = 1;
+ let depth = 1;
</script>
<SC.Canvas antialias background={new THREE.Color('papayawhip')}>
 <SC.Mesh
  geometry={new THREE.BoxGeometry()}
  material={new THREE.MeshStandardMaterial({ color: 0xff3e00 })}
+  scale={[width, height, depth]}
 />
 <SC.PerspectiveCamera position={[1, 1, 3]} />
 <SC.OrbitControls enableZoom={false} />
 <SC.AmbientLight intensity={0.6} />
 <SC.DirectionalLight intensity={0.6} position={[-2, 3, 2]} />
</SC.Canvas>
+<div class="controls">
+ <label><input type="range" bind:value={width} min={0.1} max={3} step={0.1} /> width</label>
+ <label><input type="range" bind:value={height} min={0.1} max={3} step={0.1} /> height</label>
+ <label><input type="range" bind:value={depth} min={0.1} max={3} step={0.1} /> depth</label>
+</div>
+
+<style>
+ .controls {
+  position: absolute;
+ }
+</style>


image.png


利用数据驱动,动画也可以快速添加。


<script>
 import * as THREE from 'three';
 import * as SC from 'svelte-cubed';
 let width = 1;
 let height = 1;
 let depth = 1;
+
+ let spin = 0;
+
+ SC.onFrame(() => {
+  spin += 0.01;
+ });
</script>
<SC.Canvas antialias background={new THREE.Color('papayawhip')}>
 <SC.Mesh
  geometry={new THREE.BoxGeometry()}
  material={new THREE.MeshStandardMaterial({ color: 0xff3e00 })}
  scale={[width, height, depth]}
+  rotation={[0, spin, 0]}
 />
 <SC.PerspectiveCamera position={[1, 1, 3]} />
 <SC.OrbitControls enableZoom={false} />
 <SC.AmbientLight intensity={0.6} />
 <SC.DirectionalLight intensity={0.6} position={[-2, 3, 2]} />
</SC.Canvas>


image.png


总结



不过随着 Svelte-Cubed 的发布,也有不少的质疑,也有人认为这个东西并没有是真正意义上的"创造新事物",而只是编写了一些胶水层代码。


image.png


RH 也亲自进行了回复


image.png


简而言之,你使用Svelte Cubed的原因与你使用Svelte(或任何组件框架)本身的原因相同:声明性代码往往比指令性代码更健壮、更易读、更易维护。直接使用Three绝对没有错,但这相当于直接使用DOM。在某种程度上,很难跟踪没有被表达为层次结构的层次关系,而且管理整个应用程序的状态也成为一种负担。


此外,由于组件有一个可管理的生命周期,如果你使用Vite(或使用Vite的SvelteKit)这样的框架,你可以 "免费 "获得热模块重载这样的东西。一旦你尝试过用这种方式构建场景(例如,在你调整你所放大的物体的属性时保持你的相机位置),Cmd-R驱动的开发就会感觉很苍白了。  ——由 deepl.com 翻译


额外说明:声明式与函数式的区别,创建 div为例:1.声明式写法<div></div>2.函数式写法 document.createElement('div');


不过个人感觉,Svelte-Cubed 带来了以下优点


1.声明式带来的层级清晰

2.数据驱动能够带来遍历(写起来比 Three.js 快很多)

3.组件没有非常庞大的情况下,它的体积还非常的小(相比 React、Vue 需要引入一整个运行时就小很多)


既然 Svelte-Cubed 已经融合了 Three.js ,在 meta 概念崛起的年代,离 VR/AR 还会远吗?(事实上只要融合了 Three.js ,使用 Three.js 的生态来写 VR 就已经非常容易了)

最后再列几个在VR/AR 领域比较优秀的框架吧(如果大家对这方面感兴趣),aframe(与 Svelte 异曲同工之妙的声明式),react-three-fiber、babylon.js 。


参考



https://twitter.com/opensas/status/1464457228581326848

https://twitter.com/SvelteSociety/status/1463248727942971396

https://svelte-cubed.vercel.app/docs/getting-started

https://github.com/Rich-Harris/svelte-cubed

https://news.ycombinator.com/item?id=29310150

相关文章
|
11天前
|
前端开发 JavaScript API
惊呆了!这些前端技巧竟然能让你的网站支持AR/VR体验!
【10月更文挑战第31天】在数字化时代,用户对网页交互体验的要求日益提高,传统二维网页已难以满足需求。本文介绍如何利用前端技术,特别是Three.js,实现AR/VR体验,提升用户满意度和网站价值。通过示例代码,展示如何创建简单的3D场景,并探讨AR/VR技术的基本原理和常用工具,帮助开发者打造沉浸式体验。
25 6
|
13天前
|
Go vr&ar 图形学
重塑体验:AR/VR技术在游戏与娱乐行业的创新应用
【10月更文挑战第29天】本文探讨了AR/VR技术如何改变游戏与娱乐行业,介绍了AR和VR的基本概念及其在游戏和娱乐中的应用实例,包括《精灵宝可梦GO》的AR开发和VR视频播放器的实现代码,并展望了未来的发展趋势。
36 2
|
5月前
|
人工智能 编解码 5G
虚拟现实(VR)与增强现实(AR)的融合:开启全新交互时代
【6月更文挑战第17天】虚拟现实(VR)与增强现实(AR)融合成混合现实(MR),打造全新交互体验。MR结合VR的沉浸感和AR的现实增强,应用于教育、游戏、设计和营销,带来创新教学方式、沉浸式游戏体验和高效设计工具。尽管面临技术挑战,随着5G和AI的发展,MR有望引领未来交互的革命。
|
5月前
|
传感器 数据可视化 安全
【虚拟现实】二、主要的AR/VR硬件设备
【虚拟现实】二、主要的AR/VR硬件设备
95 3
|
2月前
|
5G 测试技术 语音技术
5G赋能沉浸式体验:VR/AR时代的网络基石
5G赋能沉浸式体验:VR/AR时代的网络基石
69 1
|
3月前
|
编解码 vr&ar 芯片
VR与AR:未来的科技趋势
【8月更文挑战第26天】VR与AR技术正以前所未有的速度发展,并在市场规模、技术创新、应用场景以及竞争格局等方面展现出强劲的增长潜力。随着技术的不断进步和应用场景的不断拓展,VR/AR/MR技术将为人们带来更加丰富的虚拟体验和更加便捷的生活方式。未来,我们有理由相信,VR与AR技术将在多个领域实现更广泛的应用和更深入的融合,成为推动社会进步的重要力量。
|
3月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
133 0
|
3月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
68 0
|
4月前
|
传感器 人工智能 数据可视化
虚拟现实(VR)与增强现实(AR)的技术革新:塑造未来的沉浸式体验
【7月更文挑战第24天】VR和AR作为两种前沿的沉浸式技术,正以前所未有的速度改变着我们的世界。随着技术的不断革新和应用的不断拓展,我们有理由相信,未来的VR和AR将为我们带来更多令人惊叹的体验和技术革新。
|
5月前
|
vr&ar
AR和VR的光学结构分别是什么?
【6月更文挑战第25天】AR和VR的光学结构分别是什么?
173 5