S04E01: RealityKit 中的自定义几何体

872 阅读2分钟

说明

RealityKit 是苹果的下一代 AR 开发框架,目前功能还并不完善,但是简单好用易上手,视觉效果好性能也比较高。目前(WWDC2021 后),已经支持了自定义几何体生成,还可以简单几句代码就添加法线和 UV 的可视化支持。

法线 xyz 坐标范围原为 [-1, +1],转换到 [0, 1] 后即可用 RGB 颜色值表示;UV 的 xy 坐标本来就是 [0, 1],可直接用 RGB 中前两位表示。

代码

RealityKit 内置了一些基础几何体,比如 Box, Sphere 等,基本使用如下:

var m = PhysicallyBasedMaterial()
m.baseColor = .init(tint: .white, texture: .init(try! TextureResource.load(named: "number.jpeg", in: nil)))
        
let mesh = MeshResource.generateBox(size: 0.2)
let model = ModelEntity(mesh:mesh,materials: [m])
model.position.y = 0.05
model.name = "model"
modelAnchor.addChild(model)

虽然,更复杂的几何体一般是从外部工具导入。但用代码来计算生成一些自定义几何体可以更酷更灵活。基本过程如下:

  • 创建 MeshDescriptor
  • 填充数据,一般有:顶点 positions,索引 indices,法线 normals,和贴图坐标 TextureCoordinates 也叫 UV
  • 指定类型为 三角形.triangles(indices)
  • 根据 MeshDescriptor 生成 Mesh
var meshDescriptor = MeshDescriptor()
var positions: [SIMD3<Float>] = []
var normals: [SIMD3<Float>] = []
var uvs: [SIMD2<Float>] = []
var indices: [UInt32] = []
meshDescriptor.positions = MeshBuffers.Positions(positions)
meshDescriptor.normals = MeshBuffers.Normals(normals)
meshDescriptor.textureCoordinates = MeshBuffers.TextureCoordinates(uvs)
meshDescriptor.primitives = .triangles(indices)

let mesh = try? MeshResource.generate(from: [meshDescriptor])

在接下来的系列文章中,我将向大家展示如何用几何算法,来构造自定义几何体,并在 RealityKit 中使用。

参考

原本这个计算几何系列已经基本完结了,但最近受到下面两个项目的启发,现在又重新开始了第四季 S04 的更新。其实对我帮助最大的是 RealityGeometries 这个项目,而 Satin 项目则演示了更多种几何体的生成,再加上我自己想到的一些几何体,就形成了新的几何体生成系列文章。