- 코드 참고하며 손으로 타이핑함
- 탭한 곳에 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
//이것과 연관