swift - RealityKit – 在 3d 空间中的两点之间创建线

标签 swift augmented-reality arkit realitykit

如何使用 RealityKit 在 3d 空间中的两点之间创建一条线?

creating lines between two points in Scenekit的例子, 但是基本上没有使用RealityKit的。

为了创建线条,我创建了一个矩形模型实体并将其放置在我的第一个触摸点和当前触摸点之间。从这里开始,我需要做的就是旋转矩形以面向当前触摸点。但是,使用 simd_quatf(from: to:) 无法按预期工作。

rectangleModelEntity.transform.rotation = simd_quatf(from: firstTouchedPoint, 
                                                       to: currTouchedPoint)

如果我触摸一个点然后直接向下拖动,矩形模型应该是第一个触摸点和当前触摸点之间的一条直线,但它保持水平并略微倾斜。

为了解决这个问题,我尝试获取初始水平线作为向量与从第一个触摸点到当前触摸点的向量之间的角度

let startVec = currTouchedPoint - firstTouchedPoint
let endVec = endOfModelEntityPoint - modelEntityCenterPoint
let lengthVec = simd_length(cross(startVec, endVec))
        
let theta = atan2(lengthVec, dot(startVec, endVec))

这给了我 3d 空间中两个向量之间的角度,这似乎是正确的,当我检查它时,当我直接在它之间触摸和拖动时它给了我 90 度。

问题是我不知道旋转它的轴应该是什么。由于这是3d空间,线条不需要在2d平面上,当前触摸位置可以向下,在开始触摸位置的前面。

rectangleModelEntity = simd_quatf(angle: theta, axis: ???)

就我个人而言,我什至不太确定以上是否是在两点之间创建直线的正确解决方案。从理论上讲,这是相当基本的,创建一个高度/深度较低的矩形来模拟一条线,将其定位在起始和当前触摸点的中心,然后旋转它以使其方向正确。

两个向量之间的上述度数的轴应该是什么?

是否有使用 RealityKit/ARKit 在 3d 空间中的点之间创建两条线的更好方法?

最佳答案

我已经使用一个盒子实现了。如果您有更好的方法,请告诉我。

 let midPosition = SIMD3(x:(position1.x + position2.x) / 2,
                            y:(position1.y + position2.y) / 2,
                            z:(position1.z + position2.z) / 2)
    
    let anchor = AnchorEntity()
    anchor.position = midPosition
    anchor.look(at: position1, from: midPosition, relativeTo: nil)
    
    let meters = simd_distance(position1, position2)
    
    let lineMaterial = SimpleMaterial.init(color: .red,
                                           roughness: 1,
                                           isMetallic: false)
    
    let bottomLineMesh = MeshResource.generateBox(width:0.025,
                                                  height: 0.025/2.5,
                                                  depth: meters)
    
    let bottomLineEntity = ModelEntity(mesh: bottomLineMesh,
                                       materials: [lineMaterial])
    
    bottomLineEntity.position = .init(0, 0.025, 0)
    anchor.addChild(bottomLineEntity)

关于swift - RealityKit – 在 3d 空间中的两点之间创建线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65245842/

相关文章:

swift - RealityKit 和 ARKit 的挑战

ios - 如何在 swift 中使用 NSUserDefaults 保存字符串数组

ios - 如何从 Core Data (swift) 创建 CSV 文件

ios11 - 将 GIF 图像添加到 SCNNode 会导致 Xcode 9.1 中屏幕卡住

iphone - ARKit是否考虑iPhone和iPad中的镜头变形?

ios - 为什么 ARKit MDLTransform 从相机变换中随机返回 0?

swift - 获取放置的 SCNNode 的世界 x、y 和 z - Swift

iOS11 ARKit : Can ARKit also capture the Texture of the user's face?

Swift - UICollectionView 重复(复制)单元格

swift - 生成多个 SKSpriteNode