室内场景的3D模型自动生成正在改变家装设计、房产展示和游戏关卡制作的工作流。所谓AI驱动的方案,本质是把房间布局看作一个带约束的预测问题:输入可以是户型图纸、文字描述或者空房间点云,输出则是包含墙体结构、地面材质以及每件家具位置、朝向和尺寸的可用场景文件。相比传统手工建模,这类方法把大量隐性经验规则写进了模型损失函数,让机器学会像设计师一样留通道、避遮挡、重对称。

房间布局的底层表示与生成逻辑
要让AI理解房间,第一步是把物理空间转成机器能处理的表示。最常见的是栅格化俯视图,把户型转成多通道图像,每个通道代表墙、门、窗或不同功能分区。另一种是用图结构,节点是房间或家具,边表示相邻或包含关系。前者方便接卷积网络,后者更适合用图神经网络做关系推理。实际工程中常把两者结合,先用图像模型提结构,再投影成图做优化。
生成阶段多采用条件扩散模型。以文本生成为例,用户输入“北欧风两室一厅,客厅放L型沙发”,语言模型先把这句话编码成向量,扩散模型在去噪过程中不断对照该向量调整墙体走向和家具bbox。为了保证合理性,训练时会加入碰撞损失:任意两个家具bbox交并比超过阈值就惩罚。下面是一段简化版的碰撞检测代码,用于训练时过滤明显错误的布局。
import numpy as np
def bbox_iou(box_a, box_b):
# box格式: [x1, y1, x2, y2]
xa1 = max(box_a[0], box_b[0])
ya1 = max(box_a[1], box_b[1])
xa2 = min(box_a[2], box_b[2])
ya2 = min(box_a[3], box_b[3])
inter = max(0.0, xa2 - xa1) * max(0.0, ya2 - ya1)
area_a = (box_a[2] - box_a[0]) * (box_a[3] - box_a[1])
area_b = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1])
return inter / (area_a + area_b - inter + 1e-6)
def check_collision(boxes, threshold=0.05):
n = len(boxes)
for i in range(n):
for j in range(i + 1, n):
if bbox_iou(boxes[i], boxes[j]) > threshold:
return False
return True
sofa = [0.0, 0.0, 2.0, 0.9]
table = [1.8, 0.1, 2.6, 0.7]
print(check_collision([sofa, table]))
这种表示方式的好处是可微、可组合。当模型生成的初稿违反人体工学,比如床正对卫生间门,后处理模块可以用规则脚本修正,而不必重新跑大模型。很多开源项目如FloorGAN、HouseDiffusion都沿用了类似思路,只是在条件注入方式和解码器上有差异。
家具摆放的约束优化与语义关联
家具不是随机撒点,而是要符合语义关联。电视通常正对沙发,书桌靠窗获取自然光,餐桌离厨房近。AI方案一般把这些关系写成软约束,在布局解码后做梯度下降或采样优化。比如用能量函数:关联家具距离过远加分,朝向错误加分,最后选能量最低的配置。相比纯生成模型,这种两阶段做法更稳定,也方便用户手动改几件再自动重排其余。
另一个关键是尺寸适配。模型如果从训练集学来的是大平层家具尺寸,直接套到小户型会满地塞不下。成熟系统会先根据房间面积缩放家具库,再用背包思路挑选出最匹配的组合。下面示例展示如何按房间面积过滤家具候选。
furniture_catalog = {
'sofa': {'min_area': 8.0, 'w': 2.0, 'h': 0.9},
'bed': {'min_area': 6.0, 'w': 1.5, 'h': 2.0},
'desk': {'min_area': 3.0, 'w': 1.2, 'h': 0.6}
}
def filter_by_room(area):
selected = []
for name, spec in furniture_catalog.items():
if area >= spec['min_area']:
selected.append(name)
return selected
print(filter_by_room(10.5))
在真实产品中,还会引入用户偏好权重。同一个客厅,有人要健身区就压缩餐厅,有人要儿童玩耍角就空出中央。通过前端滑块把权重回传优化器,能在秒级给出新摆位。这种人机协同比全自动更落地,也减少了后期返工。
从生成结果到可用3D资产的流水线对接
模型吐出的bbox和类别标签只是中间态,最终要变成带网格、材质和灯光的3D场景。常见做法是接Blender的Python接口,用脚本把每个bbox实例化成预设的glb模型,再自动打光、烘焙阴影。如果目标平台是Web,则用Three.js加载相同glb,配合射线检测做点击交互。整条流水线可以用消息队列串起来,前端传图,后端跑模型,资产库取模型,渲染节点出图。
这里有个容易踩的坑:AI给的朝向角是相对于房间坐标系的,而资产库模型可能有自己的初始前向。不统一就会摆出侧躺的衣柜。解决方法是约定所有glb导出时前向为正Z,并在放置代码里做四元数换算。示例代码如下。
function placeModel(glb, box, roomRotation) {
const x = (box.x1 + box.x2) / 2;
const z = (box.y1 + box.y2) / 2;
glb.position.set(x, 0, z);
const targetY = box.angle + roomRotation;
glb.rotation.y = targetY;
return glb;
}
当场景需要漫游时,还要做碰撞体简化,不能用高精度网格做物理检测,否则浏览器会卡。一般用box碰撞体替代,和AI输出的bbox复用即可。经过上述环节,一张图进、可交互3D出的闭环就完成了,这也是当前室内AI生成工具最核心的工程价值。
AI_3D_modelroom_layoutfurniture_placement修改时间:2026-08-17 16:00:34