目录

Primitives

Ver.17.5
Houdini 关于 Primitives 的相关知识点


什么是Primitives

Houdini 中,Primitive 代表了几何体的单位。Houdini 中可以表示为 Primitive 的单位有:

除此之外还有一些可以用 Primitive 来表示的几何体。这些集合体相比起 Polygon 更有性能上的优势。

Polygons and meshes

Polygon 是由一系列的边(Edge)组成的,而这些边则由一系列的顶点(Vertex) 组成。

Mesh 是一系列有序的 Polygons 组成的。相比 PolygonsMesh 有好几个特点:

上面的两种几何表述方法有几个重要的属性:

Packed primitives

Overview

Packed Primitives 是一种在渲染时生成几何体的技术。该技术主要的目的是通过减少几何体副本的数量和只装载必要信息,来减少 Houdini 的内存使用量。

Packed Primitives 内嵌几何体的信息。该信息可以是存储于内存中的几何体的“实体”,也可以是某个几何体的引用,或者是某个几何体在硬盘中存储的位置(路径)。

MantraHoudini ViewportSolver 等等都能解读该信息,并且能高效的显示 / 渲染 / 利用这些信息。需要注意的是,Packed Primitives 不能被编辑,因为他们只是引用。如果需要修改 Packed Geometry,需要使用 Unpack 节点取出需要编辑的几何体,编辑之后使用 Pack 节点对其重新打包。

Packed Primitives 在渲染 / 模拟大量几何体时非常有用。在 DOP 中,如果几何体至始至终不会发生形变,那么我们可以考虑将几何体封装起来。

Packed Primitives 的种类

In-memory packed primitives

当我们使用 Pack 节点将几何体转换为 Packed Primitives 之后,我们获得了 In-memory packed primitives,并且嵌入一个映射到当前版本源几何体的引用(该 Packed Primitives 是不可编辑的)。

Packed disk primitives

packed disk primitive 是指嵌入了指向存储在硬盘中文件的引用的 Packed Primitives 。在浏览 / 渲染的时候,Mantra / viewport 会从硬盘中读取该文件(而不是从内存中读取)。Houdini 内置的文件类型 .bgeoAlembic,都是非常高效的,适合随机读取的文件类型。

我们可以使用 File 节点来进行 Packed Disk Primitives 的创建。与 in-memory packed primitive 相同,packed disk primitive 也是单个的、不可修改的 primitive。

Packed Disk Sequence primitives

Packed Disk Sequence primitivesPacked Disk primitives 类似。但对于 Packed Disk Sequence primitives,其引用的是一系列几何体的文件名和该序列的目录(index)。当 Mantra 读取 Packed Disk Sequence primitives 作为场景的一部分时,Mantra 会知道读取的是整个几何体序列(而不是当前帧的一个几何体)。因此,Mantra 可以在帧之间进行插值(interpolate)供运动模糊使用。因此,Packed Disk Sequence primitives 是一种对快速装载已绑定动画的几何体的解决方案,并且可以很好的支持运动模糊。

我们可以使用 File SOP 节点将文件按 Packed Disk Sequence primitives 的方式导入。

从技术上来讲,当我们装载 Packed Disk Sequence primitives 的时候,属于目标几何体序列的帧数 $F 已经被插值了。(这个插值处于帧范围之间)。

序列的目录(Sequence index)属性指定使用哪一帧(浮点帧)。初始值是 $FF -1$。我们可以使用 Packed Disk Edit 节点对其进行编辑。

默认情况下,当渲染长度超过 Packed Disk Sequence primitives 的序列长度时,该序列会自动循环至开始。该设定可以通过修改 primitive 属性 wrap 来进行控制(string 类型属性)。该属性有四种选项如下:

Packed fragments

如果 Packed Primitives 中包含 name 属性,那么每一个具有(分享)该 name 属性的几何体都被称为一个 Packed fragment Primitives,且所有的 Packed fragment Primitives 均包含指向源几何体的引用。也就是说,所有的 fragment 分享同一个几何体,但引用其子集(比如源几何体是一堵墙,那么 fragment 就引用的砖块,所有的砖块都来自同一堵墙。)

How to

我们只能以 material attribute 的方式在 GEO 层级使用 primitive attribute。 除了 material attribute(Houdini 按照特殊情况处理),primitive 层级的属性是不能在一般的场景中工作的,因为 Houdini 将 Packed 几何体视作单个 primitive 加上一个点。

Rendering

Packed Primitives 在渲染中是非常有用的。Packed Primitives 允许我们生成 IFD,并且渲染更快,内存 / 硬盘空间使用更少。

Material assignment

当我们对标准的几何体指定材质的时候,我们可以在两个层级下应用材质:

当 Houdini 生成场景描述文件(IFD)的时候,Houdini 会检查对象和几何体中与材质相关属性;因此 Houdini 知道哪个 shader 需要包含在这个 IFD 中。 但当我们使用 Packed Primitives 的时候,Houdini 还提供了第三种渠道来应用材质:通过嵌入在 Packed Primitives 中的 Material attributes 来应用材质。该层级的材质将覆盖之前提到的几何体层级与对象层级应用的材质。

不过当 Houdini 生成 IFD 文件的时候,Houdini 并不会查看这个 Material attribute 属性(可能因为是文件太大,扫描起来太慢)。因此,Houdini 不会将该 Material attribute 对应的 shader 添加到 IFD 中。只有当 Mantra 解包(Unpack)这些 Packed Primitives 的时候(处于 render time),Houdini 才能进行对材质的搜索。因此,如果之前并无匹配的材质属性,那么渲染出来的模型很可能就会缺失材质: 为解决这个问题,我们需要告诉 Houdini 将所有场景中的 Shader 信息包括到 IFD 中(不管是什么层级中应用的)。我们可以开启 Save all SHOPS 选项(在 Mantra 中)。这样的话,只要 Packed primitives 带有 shader,那么就一定会出现在渲染的结果中。

Displacement and subdivision surfaces

Displacement shadingSubdivision Surface 的处理上,Houdini 采用了同样的策略对待 Packed Primitives 和一般的几何体。但当我们主要使用 Packed Primitives 时候,我们需要考虑 Dicing(分治?)。

Attributes

How Material / Vel works

Mantra 会为 Packed primitives 建立一棵虚拟的对象树,然后会将对应的 material attribute 拷贝到该书上的每一个虚拟的对象(如果这些虚拟的对象都没有 material attribute 的话)。因此 几何体对象上的 materials 将会正确的应用到 Packed primitives 上;vel 同理。

可以通过 Render State(VOP)/ renderstate (VEX)访问在 Packed primitives 上的属性。

默认情况下 Houdini 不会查看 Packed primitives 中的 material 属性。在 Mantra 中启用 Declare all SHOPs 可以修复该问题,但也会导致 IFD 体积增大。

Polygon soup

Polygon soup 也是 Polygon 的一种。这种几何数据结构特点在于:

由于 Polygon soup 独特的结构,它的建模和渲染速度会更快,而使用的内存会更少

不过 Polygon soup 对于面数较小的几何体并不是一个比较好的选项:因为 Polygon soup 有较大的管理开销,如果面数较小,处理速度反而会普通的 Polygon 慢一些。

一些需要注意的事情:


具体对比的细节可以参考 When to use polygon soups, packed primitives, or regular polygons?

MetaBall

Metaball 实质上是一个隐式曲面(Implicit Surface),其一大特点是可以平滑的合并两个曲面。这使得 Metaball 在制作血液或者外表和怪异的几何体上有明显的优势。

NURBS and Bezier splines

注:有关的详细信息请查询WIKI Pedia。

NURBS,全名 Non-Uniform Rational B-Spline,是一种用控制顶点Control Vertices)定义的光滑曲线。 NURBS 所描述的曲线总是光滑的,连续的,无论描述其的顶点处于任何位置。因此 使用 NURBS 维护曲面有一个很明显的优势:你可以随意的拖动曲线中的顶点,而这些操作并不会导致几何体的纠缠(比如面相交)或者几何体的不连续(比如破面)。







Bezier 曲线相对与 NURBS 更加简单,而且允许定义的曲线在顶点处不连续,使用起来更加方便。

Parameterization

上节说过 NURBS 是由控制顶点形成的一种曲面;而控制顶点如何形成不一样的曲面呢?这一点是通过一个向量 Knots 来实现的。

待完善

顺序和角度

待完善

Quadratic primitive shapes

Houdini 支持 Primitive Spheres / Ellipsoids, Circles / Ellipses, 和 Tubes / Cone。这些几何体都被一个点定义:他们的中心点。这些几何体都支持移动,旋转,和缩放。
这些几何体都非常轻便,可以在如下的应用中使用:

需要注意的是,Quadratic primitive shapes 并不具有拓扑结构,因此一些基于拓扑结构的操作节点是不会起作用的。

参考文章