首页 文章

了解 ARKit 中的 3D 对象变换属性

提问于
浏览
1

假设我将一个 3D 模型(如狗作为子节点)添加到ViewDidLoad中的场景根节点。我打印出狗节点的transformworldTransform属性,这两个属性都只是 4x4 身份矩阵。

在旋转,缩放和定位之后,我transformworldTransform属性。我无法理解如何阅读它们。哪一列指的是位置,大小或方向?

在任何变换下,我如何计算 1)狗的前方朝向哪个方向,假设在viewDidLoad中前方面向(0,0,-1)方向,2)狗的高度和宽度?

1 回答

  • 2

    对变换矩阵的完整介绍是:a)超出简单 SO 答案的范围,b)3D 图形编程中的基本主题,您可以找到关于该主题的大量或两本书籍,教程和资源。这是两个体面的写作:

    但是,由于您在 SceneKit 中使用 ARKit,因此有许多便利工具可用于变换,因此您通常不需要深入研究数学。

    狗的前方面向哪个方向?

    节点始终在其局部坐标空间中朝向(0,0,-1)“面向”。 (请注意,这是 SceneKit 的“面向”的内在概念,它可能会或可能不会映射到任何自定义资源的设计方式.如果您已导入 OBJ,DAE 或任何在 3D 创作工具中构建的文件,并且在该工具中狗的鼻子指向(0,0,-1),你的狗正对着“右”way.)

    您可以从SCNNode.simdLocalFront获取此方向 - 请注意它是 static/class 属性,因为在本地空间中,前端对于所有节点始终是相同的方向。

    您可能更感兴趣的是节点自己的“前方”概念如何转换为世界空间 - 也就是说,相对于场景的其他部分,狗面向哪个方向。以下是两种方法:

    • 兑换 simdLocalFront到世界空间,你可以用任何其他向量的方式:node.convert(node.simdLocalFront, to: nil)。 (请注意,如果您将to参数保留为 nil,则转换为 world space.)

    • 使用simdWorldFront属性,它为您进行转换。

    狗的高度和宽度?

    高度和宽度与变换无关。变换会告诉您(主要)某些东西在哪里以及它面向哪个方向。

    但是,假设您没有缩放节点,则它在局部空间中的边界框描述了它在世界空间中的尺寸:

    let (min, max) = node.boundingBox
    let height = abs(max.y - min.y)
    let width = abs(max.x - min.x)
    let depthiness = abs(max.z - min.z)
    

    (注意这是内在的高度,但是:如果你有一个人站立的模型,然后你旋转它们让它们躺下,这个高度仍然是 head-to-toe.)

相关问题