Skip to content

Latest commit

 

History

History
125 lines (96 loc) · 3.89 KB

14차 스터디.md

File metadata and controls

125 lines (96 loc) · 3.89 KB

ARkit 실습


  • 코드 참고하며 손으로 타이핑함
  • 탭한 곳에 3D박스가 생긴다
  • PinchGesture로 박스의 크기를 확대 축소

  • ARproject로 생성하지 않아도, SingleViewApp 프로젝트로 만든 후, ArSceneKit을 추가해주면 AR을 만들 수 있다.
@IBOutlet weak var arSceneView: ARSCNView!
//스토리보드에서 추가 해준 ArSceneKitView
private let configuration = ARWorldTrackingConfiguration()
    //«World Tracking Configuration» tracks the orientation and the position of the device. It also detects real surfaces, visible through the camera.
    private var node: SCNNode!
    // 3D space
    private var lastRotation: Float = 0
  • ARWorldTrackingConfiguration : iOS 디바이스의 포지션과 orientation의 환경을 유저가 사용할 수 있게함 !

  • node: 3D Box만들때 이용

  • lastRotation: 박스를 회전시킬때 사용 (코드를 제대로 추가 하였으나, 작동X 원인 분석중)

 override func viewDidLoad() {
        super.viewDidLoad()
        // 통계와 fps 그리고 timing information을 보여줌
        self.arSceneView.showsStatistics = true
        self.arSceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
        self.addTapGesture()
        self.addPinchGesture()
        self.addRotationGesture()
    }
  • Statistics와 debugOptions을 앱에 보이게 하여, 리소스와 AR상태가 어떻게 작동되는지 실시간 체크 가능

@objc func didTap(_ gesture: UIPanGestureRecognizer){
        // 1
        let tapLocation = gesture.location(in: self.arSceneView)
        let results = self.arSceneView.hitTest(tapLocation, types: .featurePoint)
        
        // 2
        guard let result = results.first else {
            return
        }
        
        // 3
        let translation = result.worldTransform.translation
        
        //4
        guard let node = self.node else {
            self.addBox(x: translation.x, y: translation.y, z: translation.z)
            return
        }
        node.position = SCNVector3Make(translation.x, translation.y, translation.z)
        self.arSceneView.scene.rootNode.addChildNode(self.node)
    }
    
  • UIPanGestureRecognizer의 gesture.location을 이용해, AR카메라 상태에서 탭한 곳의 로케이션을 받고, addBox함수를 이용해 3D 박스를 추가
func addBox(x: Float = 0, y: Float = 0, z: Float = -0.2) {
        // 1
        let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
        
        // 2
        let colors = [UIColor.green, // front
            UIColor.red, // right
            UIColor.blue, // back
            UIColor.yellow, // left
            UIColor.purple, // top
            UIColor.gray] // bottom
        let sideMaterials = colors.map { color -> SCNMaterial in
            let material = SCNMaterial()
            material.diffuse.contents = color
            material.locksAmbientWithDiffuse = true
            return material
        }
        box.materials = sideMaterials
        
        // 3
        self.node = SCNNode()
        self.node.geometry = box
        self.node.position = SCNVector3(x, y, z)
        
        //4
        arSceneView.scene.rootNode.addChildNode(self.node)
    }
  • 모든 면을 구별하기 위해 색 설정

  • x,y,z을 이용해 벡터의 스칼라 값으로 변경 후 arView에 추가함

extension float4x4{
    var translation: SIMD3<Float>{
        let translation = self.columns.3
        return SIMD3<Float>(translation.x,translation.y, translation.z)
    }
}
  • 원래는 Float3였으나, 지금은 SIMD3<스칼라값>로 문법이 변경
  • 벡터의 스칼라값을 표현 하는 형태임!
let translation = result.worldTransform.translation
//이것과 연관

2