【问题标题】:Placing an object in front of camera at Touch Location在 Touch Location 处将对象放置在相机前面
【发布时间】:2018-10-04 03:25:21
【问题描述】:

以下代码将节点放置在摄像头前面,但始终位于距摄像头位置 10 厘米的中心。我想将节点放置在距离 z 方向 10 厘米处,但在我触摸屏幕的 x 和 y 坐标处。所以触摸屏幕的不同部分应该会导致一个节点被放置在相机前面 10cm 处,但在触摸的 x 和 y 位置,而不是总是在中心。

    var cameraRelativePosition = SCNVector3(0,0,-0.1)
    let sphere = SCNNode()
    sphere.geometry = SCNSphere(radius: 0.0025)
    sphere.geometry?.firstMaterial?.diffuse.contents = UIColor.white      
    Service.addChildNode(sphere, toNode: self.sceneView.scene.rootNode,    
    inView: self.sceneView, cameraRelativePosition:  
    cameraRelativePosition)

Service.swift

class Service: NSObject {

  static func addChildNode(_ node: SCNNode, toNode: SCNNode, inView:     
  ARSCNView, cameraRelativePosition: SCNVector3) {

    guard let currentFrame = inView.session.currentFrame else { return }
    let camera = currentFrame.camera
    let transform = camera.transform
    var translationMatrix = matrix_identity_float4x4
    translationMatrix.columns.3.x = cameraRelativePosition.x
    translationMatrix.columns.3.y = cameraRelativePosition.y
    translationMatrix.columns.3.z = cameraRelativePosition.z
    let modifiedMatrix = simd_mul(transform, translationMatrix)
    node.simdTransform = modifiedMatrix
    toNode.addChildNode(node)
  }
}

结果应该是这样的:https://justaline.withgoogle.com

【问题讨论】:

    标签: swift scenekit arkit scnnode arscnview


    【解决方案1】:

    我们可以使用SCNSceneRendererunprojectPoint(_:)方法(SCNViewARSCNView都符合这个协议)将屏幕上的点转换为3D点。 点击屏幕时,我们可以这样计算射线:

    func getRay(for point: CGPoint, in view: SCNSceneRenderer) -> SCNVector3 {
        let farPoint  = view.unprojectPoint(SCNVector3(Float(point.x), Float(point.y), 1))
        let nearPoint = view.unprojectPoint(SCNVector3(Float(point.x), Float(point.y), 0))
    
        let ray = SCNVector3Make(farPoint.x - nearPoint.x, farPoint.y - nearPoint.y, farPoint.z - nearPoint.z)
    
        // Normalize the ray
        let length = sqrt(ray.x*ray.x + ray.y*ray.y + ray.z*ray.z)
    
        return SCNVector3Make(ray.x/length, ray.y/length, ray.z/length)
    }
    

    射线的长度为 1,因此通过将其乘以 0.1 并加上相机位置,我们得到了您要搜索的点。

    【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 2017-12-03
    • 2020-05-27
    • 2021-09-27
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多