【问题标题】:RealityKit – Create line between two points in 3d spaceRealityKit – 在 3d 空间中的两点之间创建线
【发布时间】:2020-12-11 04:35:20
【问题描述】:

如何使用 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 空间中的点之间创建两条线?

【问题讨论】:

    标签: swift augmented-reality arkit realitykit


    【解决方案1】:

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

     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)
    

    【讨论】:

      【解决方案2】:

      轴是对象在开始时面向的方向和现在应该面向的方向的叉积。 就像它在位置 p1=[x1,y1,z1],最初面向 d1=[0, 0, -1],并且您希望它面向点 p2=[x, y, z],轴将是叉积:|d1|✕|p2 - p1|

      可能需要交换两者,或者只是否定角度,这取决于它的结果。

      【讨论】:

      • 按对象面对的方向,如果我的线在垂直表面上,方向将是 [0, 1, 0]。其中y = 1表示方向是直线向外?虽然,基于此,z = 1,stackoverflow.com/questions/59671828/… 或者这是否意味着线对象的方向,因为它是水平开始的,这将是从对象位置到线右端的向量对象。
      • 是的,直接向上是 [0, 1, 0]。计算它的乘积和您希望它面对的方向 [0, 0, 1]。结果是[1,0,0],这是四元数使用的轴。
      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多