【问题标题】:Understanding 3D object transform property in ARKit了解 ARKit 中的 3D 对象变换属性
【发布时间】:2019-01-12 21:44:57
【问题描述】:

假设我在ViewDidLoad 中的场景根节点中添加了一个 3D 模型(例如狗)作为子节点。我打印出 dog 节点的 transformworldTransform 属性,它们都是 4x4 单位矩阵。

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

在任何变换下,我如何确定 1) 狗的正面朝向哪个方向,假设在 viewDidLoad 正面朝向 (0,0,-1) 方向,以及 2) 狗的高度和宽度?

【问题讨论】:

    标签: ios swift 3d scenekit arkit


    【解决方案1】:

    对变换矩阵的完整介绍是 a) 超出了简单 SO 答案的范围和 b) 3D 图形编程中的一个基本主题,您可以找到数以千计的或两本关于该主题的书籍、教程和资源。以下是两篇不错的文章:

    由于您在 SceneKit 中使用 ARKit,因此有许多方便的实用程序可用于处理变换,因此您通常不需要深入研究数学。

    狗的正面朝哪个方向?

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

    您可以从SCNNode.simdLocalFront 获得这个方向——注意它是一个静态/类属性,因为在本地空间中,所有节点的前面总是相同的方向。

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

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

    2. 使用 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)
    

    (但请注意,这是固有高度:例如,如果您有一个站立的人体模型,然后您将其旋转以使他们躺下,则该高度仍然是从头到脚的高度。)

    【讨论】:

    • 您好,我的宽度和深度值有误。只有高度是正确的。将其与 Xcode 中模型文件的场景图进行比较。你对此有什么想法吗?任何帮助或指导将不胜感激。
    猜你喜欢
    • 2021-09-03
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2023-03-28
    • 2017-12-14
    相关资源
    最近更新 更多