0

ユーザーがシーンビューをダブルタップしたときにポインターを表示したいと考えています。これには、ある角度では円なので、SCNTorus を使用したいと考えています。

let geometry = SCNTorus(ringRadius: 0.01, pipeRadius: 0.001)
let node = SCNNode(geometry: geometry)

ノードの位置として使用する hitTest から既にベクターを取得しています

private func getVector(for point: CGPoint) -> SCNVector3? {

    guard let hitTest = self.sceneView.hitTest(point, types: .featurePoint).first else {
       return nil
    }
    let transform = SCNMatrix4.init(hitTest.worldTransform)
    let vector = SCNVector3Make(transform.m41, transform.m42, transform.m43)
    return vector
}

ノードが追加されたときに常に円として表示されるように変換するにはどうすればよいですか。

.pi/2X軸に沿って回転する垂直デバイス位置の場合、うまく機能しますが、デバイスが空間内を移動すると壊れるため、角度をハードコーディングできません

node.eulerAngles.x = .pi / 2
sceneView.scene.rootNode.addChildNode(node)

sceneView.pointOfView何らかの形で変換を適用する必要があると思います。しかし、私はここで立ち往生しました。

ここに完全なコードがあります

@objc private func didDoubleTap(_ sender: UITapGestureRecognizer) {
    
    let point = sender.location(in: sceneView)
    guard let vector = getVector(for: point) else { return }
    guard let pov = sceneView.pointOfView else { return }
    guard let camera = sceneView.session.currentFrame?.camera else { return }

    let geometry = SCNTorus(ringRadius: 0.01, pipeRadius: 0.001)
    let node = SCNNode(geometry: geometry)
    node.position = vector
    node.eulerAngles.x = .pi / 2
    sceneView.scene.rootNode.addChildNode(node)
    animatePointingNode(node)
}
4

1 に答える 1

1

eulerAngles.yカメラの Y と等しくなるように設定し、カメラの X を .pi/2 で調整することで問題を解決できました。

guard let camera = sceneView.session.currentFrame?.camera else { return }

pointerNode.position = vector
pointerNode.eulerAngles.x = camera.eulerAngles.x + .pi / 2
pointerNode.eulerAngles.y = camera.eulerAngles.y
于 2021-04-12T04:50:27.517 に答える