如何使用 RealityKit 在 3d 空间中的两点之间创建一条线?
Scenekit 中有在两点之间创建直线的示例,但是使用 RealityKit 基本上没有。
为了创建这条线,我创建了一个矩形模型实体并将其放置在我的第一个触摸点和当前触摸点之间。从这里开始,我需要做的就是旋转矩形以面向当前触摸点。但是,使用simd_quatf(from: to:)并不能按预期工作。
rectangleModelEntity.transform.rotation = simd_quatf(from: firstTouchedPoint,
to: currTouchedPoint)
Run Code Online (Sandbox Code Playgroud)
如果我触摸一个点,然后直接向下拖动,则矩形模型应该是第一个触摸点和当前触摸点之间的一条直线,但它保持水平并略有倾斜。
为了解决这个问题,我尝试获取我最初的水平线作为向量和从第一次触摸到当前触摸点的向量之间的角度
let startVec = currTouchedPoint - firstTouchedPoint
let endVec = endOfModelEntityPoint - modelEntityCenterPoint
let lengthVec = simd_length(cross(startVec, endVec))
let theta = atan2(lengthVec, dot(startVec, endVec))
Run Code Online (Sandbox Code Playgroud)
这给了我 3d 空间中两个向量之间的角度,这似乎是正确的,当我检查它时,当我在它们之间直接触摸和拖动时,它给了我 90 度。
问题是我不知道旋转它的轴应该是什么。由于这是 3d 空间,因此该线不需要位于 2d 平面上,当前触摸位置可以位于起始触摸位置的下方和前面。
rectangleModelEntity = simd_quatf(angle: theta, axis: ???)
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我什至不太确定上述是否是在两点之间创建一条线的正确解决方案。理论上,这是相当基本的,创建一个低高度/深度的矩形来模仿一条线,将其放置在起始点和当前触摸点的中心,然后旋转它以使其方向正确。
两个向量之间的上述度数的轴应该是什么?
有没有更好的方法使用 RealityKit/ARKit 在 3d 空间中的点之间创建两条线?
TL;DR:iOS 文档不同意Info.plist哪个方向(横向左与右)在哪一侧有主页按钮。我错过了什么吗?(例如,代码认为它所处的方向与设备知道它所处的方向之间存在区别。请参阅下面标记为 ? 的倒数第二个要点。)
但是,当我在 Xcode 中使用 General 复选框时,Info.plist文件显示相反:
上述信息足以清楚地说明矛盾。我的问题是:我是否遗漏了某些东西,或者我应该将其视为工具链/文档/API 中的长期残留物?
您会问,当应用程序在模拟器或设备上运行时,实际会发生什么?以下是我收集的数据的一个子集。为了您的阅读方便,我强调了LEFT 和RIGHT 这两个术语。你的大脑可能仍然会爆炸。
需要跟踪三个数量:
UIDevice.current.orientation说明了什么。当 General 复选框单独设置为 "Landscape LEFT" 时:
Info.plist文件说“横向(左主页按钮)”[即不同意文档]UIDevice.current.orientation == .landscapeRIGHT [即不同意Xcode,但同意模拟器菜单]UIDevice.current.orientation == .landscapeLEFT [与文档一致/与Xcode/plist相反]