跳到正文

MY STUDY NOTES · ARXIV 2606.29395

NaLA: A 3D Native
LLM Layout Agent
for High-quality 3D Scene Generation

本页通过交互式 3D 示例和论文原图,介绍 NaLA 如何读取房间与资产点云,并为每件资产预测 位置、缩放和水平朝向

01 输入 房间与资产点云 02 方法 自回归 + 粗到细预测 03 输出 每件资产的 Pose 04 评估 物理、语义与美学
LIVE CONCEPT TOP VIEW / BEDROOM
输入:房间 + 资产点云
BED
DESK
CHAIR
输出 / Transform position [ 1.8, 0, -2.1 ] scale     [ 1.0, 1.0, 1.0 ] rotation  [ 0, 1.57, 0 ]

任务范围:从已有资产库中选择摆放参数,不负责生成新的 3D 模型。

01 / 输入数据房间与资产几何房间边界点云 + 每个 3D 资产的点云
02 / 模型处理编码并逐件规划先摆大件,再摆依赖它的小件
03 / 输出结果每件资产的 Poseposition + scale + yaw rotation

学习 01 / 3D 示例

比较文本描述输入
点云输入

下面使用 Three.js 演示三类空间关系:朝向、包含与房间边界。它用于解释方法差异,不是作者实验的逐帧复现;作者原图列在演示之后。

INTERACTIVE THREE.JS EXAMPLE 例子 1 · 圆桌与椅子朝向
NaLA / POINT-CLOUD INPUT
拖动旋转 · 滚轮缩放 · 点击物体看 Transform
6 / 6 朝向圆桌每把椅子的朝向都参考了桌面几何

ORIGINAL PAPER RESULTS

论文原图:对照上面的三类空间关系

图片来自论文原页,仅裁边;点击可放大
FIG. 3 / FINE-GRAINED GEOMETRY

左看“放进柜子”,右看“椅子朝向圆桌”

NaLA 能利用层板与圆桌的实际形状:盒子落在柜内层板上,椅子围绕圆桌朝向中心。基线只知道粗略语义关系,容易把盒子放到柜顶或把椅子朝向统一成错误方向。

  • 柜子示例体现 containment / supporting surface
  • 圆桌示例体现几何中心与 orientation
  • 这正是点云输入相对文字描述的价值
在原论文中打开这一页 ↗
放大的论文原图

学习 02 / 问题定义

文字或二维图像
不能完整表示3D 几何

常见方法先把 3D 模型转换成文字描述、包围盒或二维图片。这个过程会丢失层板、凹槽、支撑面和异形房间边界等细节。

常见基线TEXT-FIRST
“一张圆桌,大约 1 米宽” x: “1.23”
  • 不能直接表示桌面的曲率与可支撑区域
  • 连续坐标被拆成文字 token,不利于保持数值结构
  • 可能出现:碰撞、悬空或越过房间边界
NaLAPOINT-CLOUD INPUT
<ASSET_FEATURE> Pose = 粗格子 + 微调
  • 直接编码房间和资产点云,保留几何细节
  • 先选大概格子,再回归连续的精确偏移
  • 一次生成完整布局,不依赖后置优化器反复修

学习 03 / 核心方法

先预测粗位置,
再回归连续偏移

离散锚点用于确定大致网格和主朝向,连续残差用于补充精确位置、缩放与朝向偏移。

COARSE-TO-FINE LAB 拖动滑块,看看两步如何合成最终位置
演示网格为 10 × 8
论文标准设置 B = 20 / 轴
粗定位
最终位置
X → Z →
点云输入

PointBERT 编码资产,SPFormer 编码房间,再由 Q-Former 压成 LLM 能读的 3D token。

大件先摆

训练答案按体积从大到小排序:先有桌子,再决定花瓶放哪里,因果更自然。

两阶段学习

先在 3D-FRONT 学大布局,再在 Imaginarium 学小物件和细节,比混在一起学更好。

学习 04 / 完整流程

示例:一把椅子的
布局生成流程

五个步骤依次展示:读取几何、编码 Token、确定摆放顺序、预测粗细 Pose,以及写入 Three.js 场景。

现在:读取房间和椅子的真实形状 TOP VIEW / 同一把黄色椅子
空房间
床 / 大件 ①
桌 / 中件 ②
先选这个格子
粗位置
再微调 0.23 m
椅子 / ③
✓ 布局完成
待摆资产库
CHAIR_03
不是“椅子”两个字
而是椅子表面的 3D 点
POINTBERT 把很多几何点
压成少量 Token
<ID_03><ASSET_FEATURE><POS_TOKEN>
先放床再放桌最后放椅子
写入你的 Three.js 场景 chair.position.set(2.2, 0, -1.4) chair.rotation.y = 1.57
本步骤的作用 把房间、床、桌、椅子的真实表面采样成点云。 输入 = 房间边界点 + 每件资产的表面点
STEP 01 / GEOMETRY

先把房间和模型采样成点云

输入不是一段“这是一张床”的描述,而是物体表面真实的 3D 点,以及地面、墙、天花板的边界。

学习 05 / 实验结果

从四类指标查看
模型的实验结果

论文测试 20 类场景,每类 3 个案例,平均每个场景约 20 件资产;还用了 20 名研究生和 AI 评分。

越低越好 · 越界率 OOB 1.16%

LayoutGPT 为 18.19%。点云输入保留了房间边界的几何信息。

NaLA 1.16LayoutGPT 18.19
越高越好 · 人类总体评分 / 5 3.69

该组四种方法中数值最高;LayoutVLM 为 3.47。

越高越好 · 人类语义合理性 / 5 3.48

椅子朝桌子、盒子进柜子——不是只做到“不穿模”。

越高越好 · 人类美学评分 / 5 3.42

该组对比中数值最高,反映语义与视觉评价较好。

指标说明

物理合理性需要分别比较

碰撞率上 Holodeck 更低(0.10% vs 0.86%),悬空率上 Holodeck 也是 0%。Holodeck / LayoutVLM 使用约束进行多轮后处理,NaLA 则采用单次端到端生成。论文主要比较的是:速度、边界理解、语义和视觉评价之间的综合表现

数据来自论文 Table 1;标准误和完整评测设置请以原文为准。查看表格 ↗

学习 06 / 与你的技术栈对应

NaLA 输出与 Three.js
Transform 的对应关系

在 Vite + 原生 JavaScript + Three.js 项目中,模型输出可以映射到 Object3D 的 position、scale 和 rotation.y。

nala-layout-adapter.js
const roomPoints = sampleSceneBounds(scene);
const assetPoints = sampleGeometry(mesh.geometry);

const input = {
  roomPoints,
  assets: [{ id: mesh.uuid, points: assetPoints }]
};

论文使用专门的点云编码器。对你的场景,数据源可以从 BufferGeometry 和房间碰撞边界离线采样。

在当前项目中的建议落地顺序
  1. 01 / 离线编辑器原型让 Agent 生成 JSON transform,先验证输入与输出格式。
  2. 02 / 几何校验使用 Three.js Box3 或物理引擎检查碰撞和越界。
  3. 03 / 模型训练评估论文依赖点云编码器、7B LLM、布局数据集与训练流程,需要单独评估复现成本。

学习 07 / 适用范围与限制

当前主要面向
室内资产布局

01 / 任务边界布局已有资产

资产库需要预先存在;材质、建模、灯光和玩法逻辑不属于该方法的核心任务。

02 / 数据范围稀有场景数据较少

论文中的电脑房和诊所案例显示:稀有物件关系学习不足时,可能出现悬空或比例异常。

03 / 姿态自由度仅预测绕 y 轴旋转

设定为 y-up,暂不覆盖贴墙画框、倾斜道具等完整 6DoF 姿态。

04 / 评测范围实验集中于室内布局

卧室、客厅和会议室等结果,不能直接推断到复杂地形、动态机关或战斗关卡。

课程小结

NaLA 直接编码房间与资产点云,并通过“离散锚点 + 连续残差”预测每件资产的 Pose。
打开原论文 ↗ 返回我的学习笔记