gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:58:59 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

which direction the front of the dog is facing?

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

你可以从SCNNode.simdLocalFront得到这个方向— 注意它是一个静态/类属性,因为在局部空间中,所有节点的前向始终是相同的方向。

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

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

  2. 使用 simdWorldFront属性,它会为您进行转换。

the height and width of the dog?

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

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

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)

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

关于ios - 了解 ARKit 中的 3D 对象变换属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com