ARkit 이용한 3D 박스 만들기

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • iJoom
      참가자
      • 글작성 : 8
      • 답글작성 : 1

      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

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      • 이 답변은 야곰에 의해 4 years, 7 months 전에 수정됐습니다.
      • 이 답변은 야곰에 의해 4 years, 7 months 전에 수정됐습니다.
    • Presto
      참가자
      • 글작성 : 0
      • 답글작성 : 1

      감사합니다

2 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom