我的个人主页现在是一间可以点击的小屋。书架、显示器、奖牌、海报和房门不只是装饰,它们分别对应博客、项目、经历、荣誉与个人介绍。

从真实房间开始

小屋的布局来自我在校外居住的真实房间。桌子和双显示器位于一侧,床占据另一侧,衣柜、书架、冰箱和窗帘沿墙排列。网页没有追求完全写实,而是保留这些最容易识别的空间关系,再将它们转化为简洁的矢量线稿。

用于设计个人主页的真实房间照片
图 1 · 真实的小屋

网页中的桌子、床、衣柜、窗帘与地毯都来自这间真实房间。

两个主要参考项目

设计过程中主要参考了两个开源项目:

  1. Animnia/pure-line-room 提供了纯线条房间的视觉方向。它说明即使不依赖复杂材质,也可以通过轮廓、透视和留白建立清晰的空间感。
  2. MmzMing/3D-HOME 展示了房间物件的组织方式、对象高亮和点击反馈。项目的在线页面也帮助我理解固定全景与对象聚焦之间的切换逻辑。

把个人内容放进房间

相比在页面上继续堆叠导航栏和卡片,我希望访客通过房间中的物件理解内容:

房间物件对应内容
书架博客文章
主横屏科研项目
左侧竖屏实习与个人经历
三枚奖牌荣誉与奖项
墙上海报About Me
窗户个人链接
房门个人网站 About 页面

冰箱、窗帘、空调、椅子和被子则保留为生活化交互。

简洁的设计思路

1. 固定全景,而不是自由漫游

页面使用固定的正交镜头,访客进入后可以立刻看到房间全貌。点击物件时镜头只做有限聚焦,不提供自由旋转。这样既能维持构图,也能避免访客在三维空间里迷失。

移动端使用单独调整过的固定镜头,而不是直接裁切桌面画面。

2. 线稿为主,颜色只负责识别

房间主体使用轮廓线、低透明度色块和少量阴影。绿色地毯、木色床铺、紫灰色衣柜与彩色书脊负责区分物件,但不会覆盖线稿结构。

可点击物件不再依赖常驻的小圆点,而是在鼠标接近时显示轮廓高亮。访客仍然能发现交互区域,页面也不会一直布满提示标记。

3. 交互应当符合物件本身

房间中的操作尽量使用现实世界里的动作:窗帘被拉开,冰箱门向外转动,被子折叠,椅子移动,空调和墙面灯开关切换状态。声音只在点击后播放,悬停不会触发音效。

音效目前以合成效果和少量本地音频为主,重点是给动作提供反馈,而不是持续制造环境噪声。

4. 昼夜模式

大门旁放置了一个实体灯开关。关灯后,背景、线稿、文字和内容面板会切换到夜间配色,显示器保留亮度并向桌面投射柔和冷光。

小屋与博客共用同一个主题状态:在博客切换黑夜模式后进入小屋,房间会自动关灯;在小屋拨动开关后返回博客,博客也会保持相同主题。

线稿风格可交互小屋的白天模式
图 2 · 白天模式

白天使用暖白背景、深色轮廓和克制的物件配色。

线稿风格可交互小屋的黑夜模式
图 3 · 黑夜模式

夜间压低房间亮度,同时保留显示器光线与浅色界面边框。

实现方式

这个页面并不是先在建模软件中制作完整房间,再把模型导入网页。它更像在代码里搭积木:用长方体、平面和线条拼出床、桌子、衣柜与显示器,再用少量图片补充海报和屏幕内容。Three.js 主要负责把这些物件放进同一个三维空间,并处理镜头、动画和鼠标交互。

实现时主要遵循了五个思路。

1. 把房间当成一张有纵深的插画

页面没有让访客自由旋转镜头,而是提前选定一个最容易看清房间布局的轴测视角。这个视角弱化了“近大远小”的透视变化,床、桌子和书架即使处于不同距离,也能保持稳定、清晰的比例。

因此,这里使用三维空间不是为了模拟游戏,而是为了得到一张可以聚焦、可以点击、具有前后关系的立体插画。技术上采用正交相机(OrthographicCamera),但真正重要的是:构图优先于自由度

2. 用简单形状表达物件,而不是追求完整写实

家具由基础几何体构成,轮廓线负责说明结构,低透明度色块负责区分材质和功能。例如,衣柜只需要柜体、门板和把手就能被识别;书架依靠层板和不同颜色的书脊建立特征。

这种方法牺牲了一部分细节,却让所有物件保持统一的线稿语言。后续调整布局时,也可以直接修改尺寸和坐标,不必重新制作和导出模型。

3. 把“看见的物件”和“可以点击的区域”分开

线稿家具通常很细,直接要求访客准确点击门把手或显示器边框,操作会很困难。因此,每个可交互物件外面都有一个看不见、略大的点击区域。鼠标接近时,页面再显示物件轮廓高亮。

这样,视觉模型可以继续保持纤细,交互区域却足够宽容。访客点击的是一个容易命中的区域,看到的仍然是自然的房间物件。

4. 用状态变化表现动作

房间交互不是播放预制视频,而是记录每个物件当前处于什么状态,再让它从一个状态平滑过渡到另一个状态。例如:窗帘从闭合移动到两侧,冰箱门围绕铰链旋转,被子从展开变为折叠,墙面开关翻转后房间进入夜间。

这种方式让动作可以反复执行,也方便让声音、文字提示和视觉状态保持一致。

5. 让房间服从网站,而不是成为孤立页面

小屋和博客共用同一个昼夜设置,因此在任一页面切换主题,另一边都会保持相同状态。桌面端和手机端则分别设置镜头与界面位置:桌面强调完整空间,手机优先保证主要物件和操作入口可见,而不是简单裁掉桌面画面的两侧。

这套方案的优点是轻量、容易修改,也方便继续把真实房间里的物件加入网页。它的边界也很清楚:家具比例、前后遮挡和镜头构图仍然需要手工调整;复杂材质、物理碰撞和完全真实的灯光并不是当前重点。

结尾

感谢以下两个参考项目及其作者的开源,欢迎参观我的小屋:https://howillmakeit.github.io/