320 likes | 523 Views
许鹏飞. Interactive Architectural Modeling with Procedural Extrusions. 基于过程式挤出的交互式建筑建模. 简介. 目的: 针对复杂建筑曲面的交互式的、基于过程的建模系统 原因: 多级编辑,之前的编辑会根据随后的编辑做相应调整 有利于大型场景建模 交互与过程结合,易与用户使用. 简介. 交互方式与基本定义 Plan : 建筑平面图 每一条边有对应的 Profile 不同高度会发生变化 Profile : 轮廓线 单调上升,允许水平. 简介. 交互方式与基本定义 Overhangs : 屋檐
E N D
许鹏飞 Interactive Architectural Modeling with Procedural Extrusions 基于过程式挤出的交互式建筑建模
简介 • 目的: • 针对复杂建筑曲面的交互式的、基于过程的建模系统 • 原因: • 多级编辑,之前的编辑会根据随后的编辑做相应调整 • 有利于大型场景建模 • 交互与过程结合,易与用户使用
简介 • 交互方式与基本定义 • Plan:建筑平面图 • 每一条边有对应的Profile • 不同高度会发生变化 • Profile:轮廓线 • 单调上升,允许水平
简介 • 交互方式与基本定义 • Overhangs:屋檐 • 构建多条防止破坏profile的单调性 • Anchors:锚点 • Relative:在active plan上,到达指定高度则定位锚点 • Absolute: 在初始平面上,垂直水平面做射线与指定高度的平面的交点 • 插入边改变active plan • 插入模型,丰富模型细节
简介 • 交互方式与基本定义 • Plan Edits :在特定高度修改plan • Forced steps:插入固定的边 • Natural steps::提供一系列可插入的形状,自适应的 • Modeling Larger Environments:大规模建模 • Footprint根据环境赋予不同建筑类型 • 自动对建筑plan的边赋标签 • length ∈ {short,medium,long} • orientation ∈ {street,side,back} • 根据标签赋上对应类型的profile
基本思路 • 根据用户输入定义初始plan,profile,anchor等 • 维护一个从地基逐渐上升的sweep plane,其上的plan称为active plan • Active plan在上升过程根据每条边对应的profile进行挤出,并在发生profile改变方向,锚点插入,平面相交等事件发生时更新active plan。 • 最终得到所有事件发生时的plan,也就得到了表达整栋建筑模型的所有点
具体实现 • 定义 • Plan:将水平面分割为内外个区域,逆时针有向边包围图形内部,顺时针表示洞 • 第j个多变形有nj个角点,第i个点为 • 与下一点构成边 • 每条边对应一个方向平面 ,由角度θ限定
具体实现 • 定义 • Profile:用来控制边对应的方向平面的角度 • 有m个点表示为ti • ti与ti+1的连线和垂线沿顺时针方向的角度定义为θ • 且最终角大于0
具体实现 • 概要 • 输入: • Plan • Profile • Anchor • 输出: • Architectural shell(3d mesh)
具体实现 • 主循环
具体实现 • Plan data structure • 角点链表 • 有指向前后点的指针,和前后边的指针
具体实现 • 事件 • Generalized Intersection Event:通用相交事件 • Edge Direction Events:边方向事件 • Profile Offset Events: 偏移事件 • Anchor Events: 锚点事件
具体实现 • Generalized intersection event • 早期定义 • 边事件:边减为0 ,例1 • 分割事件:相邻面与另一不相邻面相交,例3 • 顶点事件:多于三个平面相交,例2 • 通用定义 • 都是顶点事件的变形
具体实现 • Generalized intersection event • 自动发生 • 拓扑的改变 • 在active plan 上拓扑的进行修改以保证不会发生自相交 • 事件检测 • 用膨胀边界的方法 • 问题: • 多个平面汇聚在一点(水平的),在一定范围内要当做一个事件处理 • 在近似同一高度上距离很远的两个相交事件可能互相干扰,要收集做统一处理
具体实现 • Generalized intersection event • 聚类 • 取出相交事件,聚集事件发生的z值在一定阈值内的事件 • 再通过在xy平面的投影,找出距离阈值满足的事件 • 失败情况:一系列点彼此满足阈值
具体实现 • Generalized intersection event • 链的构建 • 用与聚类后事件相关的边构建一个链的集合 • 链hi由相邻边构成 • 这些链在两种情况下更新活动平面:链内(intra-chain),和链间(inter-chain) • 链内(intra-chain):内部边缩为0 则去掉 • 链间(inter-chain): 链内只有一条边则加角点分为两条边,多条边则加点,顺次连接。最后去掉无关联的角点
具体实现 • Generalized intersection event • 筛选无效事件(filtering invalid events): • 在clustering 之前 移除无效的边 ,原因:用无边界的方向平面检测相交事件,可能在活动平面上有些边不会接近交点l • 在前一个事件中移除的边也要从边集f中移除。 • 最后如果边集小于3,事件忽略。 • 非连通事件(Local non connected event):大规模建模时,非连通的区域可能发生相交事件 • 链中边形成环,链被移除;如果有多于一个只有一条边的链,相关的边一定平行,相邻链中得几何体也要移除(形成一条脊),一个链嵌套在另一个链中,链间事件将失效,这时可以反转闭合链。但在现实建筑中没有这样的例子
具体实现 • Edge direction events • 根据profile更新边集的角度和方向平面 • standard:不等于正负90度 • 输入由单独角度构成,输入边集和新的角度 • 输出新的 active plan • horizontal:角度为正负90度 • 输入 • 与同一profile关联的边集f • 连续两角 • 距离d • 输出 • 新的 active plan
具体实现 • horizontal: • 新建临时plan,边 ,角 • 挤出,投影,替换
具体实现 • horizontal: • 更新角度 • 在同一高度发生多个边方向事件按用户创建顺序排序,用户可手动控制优先级
具体实现 • Profile offset events • 明确了屋檐的开始,难点在于过程定义,在更新active plan 的过程中避免自相交 • 输入 • disabled 布尔值,表明边关联的偏移区域是否要在输出中表现 • dist_insidedist_outside定义了向偏移边界里或外的距离和方向,正向外,负向内,要求同号 • Profile 定义了内外边的轮廓
具体实现 • Profile offset events • 步骤 • 用active plan 向 0平面投影得到temporary plan 其中边 eji投影得Eji和对应的profile_recursiveij它定义了 • z=0时 就能得到内边对应的扩展边 • z=1 时 得到外边对应的扩展边
具体实现 • Profile offset events • 步骤 • 执行 procedural extrusion, z=0到z=2 得到 外壳 shell 对 z=1 到 2之间的平面投影就 得到偏移区域,用来构建屋顶
具体实现 • Profile offset events • 步骤 • profile 更新 r为偏移区域的边集 为临时外壳的轮廓 • 移除面积为0或diabled=true的区域 • 最后合并相邻区域来阻止自交
具体实现 • Insertions into the polygon • Forced steps 插入固定 • 不能保证不自交可能产生无效的拓扑
具体实现 • Insertions into the polygon • Natural steps 依靠过程式挤出的递归解决
具体实现 • Ambiguities in Procedural Extrusions • 通常出现在同一侧的两相邻边合为一条线的时候
具体实现 • Ambiguities in Procedural Extrusions • 解决 • 以全局视角解决这种歧义 • 合并所有连续的共线的边,这个边采用有最高优先级的边的profile • 优先级方案 • 1最小得关联角度(-PI/2)的边有最大优先级 • 2用户定义