SceneKit 中的复杂形状

Complex shapes in SceneKit

在 SceneKit 中,程序员可以通过输入以下代码创建 node/object:

SCNBox* box = [SCNBox boxWithWidth:1 height:1 length:1 chamferRadius:0.1]; // define a geometry
SCNNode* boxNode = [SCNNode nodeWithGeometry:box]; // make this geometry into a 3D node
[scene.rootNode addChildNode:boxNode]; // add the node into the scene

你得到一个长方体节点,尺寸为 1x1x1 单位,倒角半径为 0.1。它看起来几乎像一个圆圈。

但是,我想渲染比长方体、球体或圆柱体更复杂的形状。例如,我想将一块拼图渲染到屏幕上。

我该怎么做?我知道可以通过用贝塞尔曲线定义 SCNShape(结合 NSBezierCurve)。如果我想将一组顶点加载到几何体中并将其设置为 material,我该怎么做?

我是 3D 编程新手。我以前玩过球体和简单的形状。我可能会以错误的方式将拼图块渲染到屏幕上。

目前 Scene Kit 仅用于渲染几何体并且几何体生成工具非常有限,尽管 Model I/O 的引入似乎是支持更复杂的 3D 建模功能的第一步。

您是正确的,对于简单的形状,您可以使用 Scene Kit 基本几何形状(长方体、球体等)或 SCNShapeNSBezierCurve 用于带斜面的 3D 挤压和倒角。对于更复杂的几何形状,您有几个选择:

第三方 3D 建模软件 可用于创建几何图形,在某些情况下还可以创建动画,然后可以将其直接导入 Scene Kit。很多人似乎都在使用 Sketchup,因为它免费且易于使用。它适用于基本形状,但它的功能非常有限。我建议使用 Blender,它也是免费的,但可以创建几何图形和网格,还允许您创建动画和可以直接导入的 materials。它确实有一个陡峭的学习曲线,但一旦你破解了它,它就是一个很好的资产。

这种软件最适合关卡、人物、风景等复杂的几何图形。它确实有一个缺点,即一旦导入就相当不动态,因为每个网格看起来都一样,例如,如果您将一块岩石创建为一块风景,您将需要创建很多岩石的变化,或者让游戏中的每块石头看起来都一样。

通过使用 SCNGeometrySourceSCNGeometryElement 类 在 Scene Kit 中生成它。这些本质上是 3D space 中的一系列点(每个点都是 SCNVector3),它们定义了网格的角或顶点。然后,通过将点放入数组并定义应将哪些点连接在一起以形成三角形或网格元素,将它们连接到网格中。这是作为另一个 SCNVector3 向量数组给出的,其中向量的每个部分都指向顶点数组中的一个索引。 [0, 1, 2] 的向量会用数组索引 0、1 和 2 中的点创建一个三角形。关于如何执行此操作,有 tutorials

这样做的好处是能够创建随机几何体,方法是创建一组伪随机点,然后将它们组合起来创建您的网格。然后,您可以使用 Model I/O 烘烤环境遮挡(假设 Apple 已修复此问题,我尚未检查)并继续使用 Model I/O 来创建非常逼真的 material。这意味着您可以有效地创建任何您想要的东西。继上一个示例之后,您可以程序化地生成看起来各不相同的岩石。您可以使用它来生成几乎无限数量的拼图可能性。

作为旁注,几何和 material 是 3D 建模中的两个不同的东西,而且当你刚刚开始时,你似乎在你的问题中混淆了它们。几何体是定义对象形状的网格,material 定义光线如何与该网格交互以产生其最终外观。一个几何图形可以附加一个或多个 material 以产生您想要的结果。

您选择的选项实际上取决于您想要实现的目标。对于随机性,第二个选择更好,对于质量,第一个选择是最好的。 我觉得我现在有点胡扯所以我会在这里结束。