胶带与日常混沌:用代码构建沉浸式交互体验

本文深入解析Lax Chee的实验性作品集网站,揭秘如何通过BVH射线检测、实时路径绘制和设备自适应优化等技术,将日常生活中的混沌转化为流畅的数字化互动体验。

Lax Space:用胶带与日常混沌设计

Lax Chee邀请我们深入了解他的实验性作品集幕后,在这里,胶带、设计和代码将日常混沌转化为有趣的数字体验。

初衷与灵感

在完成一系列更注重实用性而非趣味性的商业项目后,我决定将我的作品集网站作为实验新想法的空间。我的目标很明确:第一,必须具有交互性并包含3D元素;第二,需要吸引你的注意力;第三,必须在不同设备上表现良好。

这个网站的想法是如何产生的?来自日常时刻。确切地说,是在卫生间里。我20个月大的好奇宝宝有一天在我使用卫生间时闯了进来,高兴地将长长的卫生纸卷展开铺满地板。这个场景混乱、有趣,观看时却出奇地令人愉悦。随着混乱的扩大,想法也随之产生:这种与物体玩耍、近乎淘气的互动可以重新构想为数字体验。

当然,卫生纸不太符合美学要求,所以想法转向了胶带。胶带更酷,更符合项目所需的能量。概念确定后,过程转向草图、设计和编码。

设计原则

随着胶带在屏幕上展开,事物很容易感觉混乱和视觉沉重。为了平衡这种能量,界面被刻意保持简单和干净。目标是让视觉效果占据中心舞台,同时给用户足够的留白空间来漫游和玩耍。

体验中还融入了交互层。动画响应用户操作,创造运动和互动的感觉。隐藏的触感,比如倒带选项、围绕元素轨道运行,或指示未见项目的闪烁点。

  • 按空格键可倒带胶带卷,使其可以再次绘制新路径
  • 按Tab键可解锁轨道视图,允许从不同角度探索场景

构建体验

构建沉浸式、交互式的作品集是一回事。使其在不同设备上流畅运行是另一回事。近70%的精力用于优化体验和榨取每一滴性能。结果是一个表面看起来有趣的网站,但在底层,它由一系列系统驱动,旨在保持快速、响应迅速和可访问。

01. 实时路径绘制

核心魔力在于实时路径绘制。鼠标或触摸移动被捕获并通过射线投射投影到3D空间。点通过Catmull-Rom曲线平滑处理,创建在展开时感觉自然的流动路径。几何体是实时生成的,为每个用户提供独特的绘图,可以从不同角度倒带、重放或探索。

02. BVH射线检测

为了保持这些交互的快速性,BVH射线检测介入。系统首先检查较大的边界框,而不是测试场景中的每个三角形,将数千次计算减少到仅几次。这种优化通常保留给游戏引擎,将复杂的几何体以平滑的60fps带入浏览器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 首先,我们通过添加BVH加速使几何体变得"智能"
useEffect(() => {
  if (planeRef.current && !bvhGenerated.current) {
    const plane = planeRef.current
    
    // 步骤1:为平面创建BVH树结构
    const generator = new StaticGeometryGenerator(plane)
    const geometry = generator.generate()
    
    // 步骤2:构建加速结构
    geometry.boundsTree = new MeshBVH(geometry)
    
    // 步骤3:用支持BVH的版本替换旧几何体
    if (plane.geometry) {
      plane.geometry.dispose() // 清理旧几何体
    }
    plane.geometry = geometry
    
    // 步骤4:启用快速射线检测
    plane.raycast = acceleratedRaycast
    
    bvhGenerated.current = true
  }
}, [])

03. LOD + 动态设备检测

系统检测每个设备的能力、GPU功率、可用内存,甚至CPU核心,并实时调整质量设置。高端机器获得完整体验,而移动设备享受仍然感觉流畅和吸引人的精简版本。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const [isLowResMode, setIsLowResMode] = useState(false)
const [isVeryLowResMode, setIsVeryLowResMode] = useState(false)

// 检测低端设备并启用低分辨率模式
useEffect(() => {
  const detectLowEndDevice = () => {
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
    const isLowMemory = (navigator as any).deviceMemory && (navigator as any).deviceMemory < 4
    const isLowCores = (navigator as any).hardwareConcurrency && (navigator as any).hardwareConcurrency < 4
    const isSlowGPU = /(Intel|AMD|Mali|PowerVR|Adreno)/i.test(navigator.userAgent) && !/(RTX|GTX|Radeon RX)/i.test(navigator.userAgent)

    const canvas = document.createElement('canvas')
    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') as WebGLRenderingContext | null
    let isLowEndGPU = false
    let isVeryLowEndGPU = false

    if (gl) {
      const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
      if (debugInfo) {
        const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
        isLowEndGPU = /(Mali-4|Mali-T|PowerVR|Adreno 3|Adreno 4|Intel HD|Intel UHD)/i.test(renderer)
        isVeryLowEndGPU = /(Mali-4|Mali-T6|Mali-T7|PowerVR G6|Adreno 3|Adreno 4|Intel HD 4000|Intel HD 3000|Intel UHD 600)/i.test(renderer)
      }
    }

    const isVeryLowMemory = (navigator as any).deviceMemory && (navigator as any).deviceMemory < 2
    const isVeryLowCores = (navigator as any).hardwareConcurrency && (navigator as any).hardwareConcurrency < 2

    const shouldEnableVeryLowRes = isVeryLowMemory || isVeryLowCores || isVeryLowEndGPU
    
    if (shouldEnableVeryLowRes) {
      setIsVeryLowResMode(true)
      setIsLowResMode(true)
    } else if (isMobile || isLowMemory || isLowCores || isSlowGPU || isLowEndGPU) {
      setIsLowResMode(true)
    }
  }

  detectLowEndDevice()
}, [])

04. 保活帧系统 + 节流几何更新

确保平滑性能而不会耗尽电池或使CPU过载。帧仅在需要时渲染,然后在交互后保持稳定节奏以保持一切响应迅速。正是这种趣味性和精确性之间的平衡使网站对用户来说感觉轻松。

创作者

Lax Space是我的名字Lax和致力于创造性的Space的组合。它既是一个作品集,也是一个游乐场,是设计和代码以有趣、好玩和无压力方式相遇的中心。

我来自新加坡,在那里开始创意工作,然后移居日本。我的目标很简单:探索新想法,从不同角度学习,挑战旧思维方式。被日本及其他地区一些最具启发性的创作者包围,在创意和技术上推动了我的工作更进一步。

设计和代码构成了我工具包的一部分,将它们融合在一起使得可以打造平衡功能与美学的体验。每个项目都是尝试新事物、实验和推动数字设计边界的机会。

我渴望与其他创意人士联系。如果Lax Space的某些内容引起了你的兴趣,让我们聊聊!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计