SCNConstraint를 사용하여 반드시 위에서 빛이 닿도록 한다

6276 단어 SceneKitARKit

소개



ARKit로 비행기를 날릴 때 빛을 맞추는 방법(SCNLight의 배치 방법)에 곤란했으므로 그 대처 방법을 남겨 둔다.

아무것도 생각하지 않고 아래와 같이 비행기의 SCNNode의 childNode로서 라이트를 add하면 그림과 같이 비행기 위에서 빛을 비추는 것이 가능하다.
if let ship = SCNScene(named: "art.scnassets/ship.scn")!.rootNode.childNode(withName: "ship", recursively: true) {
    let light = SCNLight()
    light.type = .omni

    let lightNode = SCNNode()
    lightNode.light = light
    lightNode.position = SCNVector3(ship.position.x,ship.position.y + 2,ship.position.z)

    ship.addChildNode(lightNode)
}



그러나 단순히 라이트를 비행기의 자식 노드로 추가하기 때문에 비행기를 굉장히 회전시킬 때 라이트도 마찬가지로 회전합니다.


SCNConstraint 사용



SCNConstraint란 SCNNode간의 위치 관계에 제약을 주기 위한 설정이며, StoryBoad를 사용하여 UI 부품을 배치할 때 설정하는 Constraint의 SCNKit판에 해당하는 것.
이 경우, 라이트는 반드시 비행기의 Y 좌표의 +0.5에 위치한다는 제약을 마련하면, 비행기의 방향에 관계없이 위로부터 빛을 비추는 것이 가능하다.
if let ship = SCNScene(named: "art.scnassets/ship.scn")!.rootNode.childNode(withName: "ship", recursively: true) {
    let light = SCNLight()
    light.type = .omni

    let lightNode = SCNNode()
    lightNode.light = light

    let positionConstraint = SCNTransformConstraint(inWorldSpace: true, with: { (node, transform) -> SCNMatrix4 in
        let pos = node.position
        return SCNMatrix4MakeTranslation(pos.x, pos.y + 2, pos.z)
    })

    lightNode.constraints = [positionConstraint]

    ship.addChildNode(lightNode)
}


좋은 웹페이지 즐겨찾기