ARKit에서 객체의 방향을 찾고 싶습니다.

7246 단어 iOSSwiftios11ARKit
Swift4.0에서 ARKit을 사용하고 싶고 간단한 AR 슈팅 게임을 만들려고했습니다. 그 때에, 대상이 되는 오브젝트를 잃었을 때에 힌트로서 오브젝트의 방향을 내도록(듯이) 하고 싶고 구현해 보았는데, 상당히 교육적으로 재미 있었기 때문에 기사로 해 보겠습니다.
마찬가지로 방향을 계산하고 싶다면 참고하십시오.

전체 코드



먼저 전체 코드를 먼저 올립니다.
htps : // 기주 b. 코 m / 카 또 1729 / 아 R_

앱 흐름



처음에는 RootViewController로 들어가고 START 버튼을 눌러 ARViewController로 이동하고 게임이 끝나면 ResultViewController로 들어갑니다.
ARViewController 에서는, 아래의 그림과 같이 오브젝트가 랜덤한 위치에 출현해 랜덤하게 움직이기 때문에, 그것을 제한 시간내에 탭 해 지워 가는 게임입니다.



이번에는 주로 이것의 오른쪽 하단 화살표 부분의 구현을 설명합니다.

3차원 방향을 2차원으로 투영하여 표현



하고 싶은 것은, 카메라(iPhone)로부터 오브젝트까지의 3차원 공간에서의 방향을, iPhone의 2차원의 화면상에 투영해 표현하는 것입니다. 그러기 위해서는 먼저 객체의 위치가 기술되는 좌표계를 절대 좌표계 $E$에서 카메라(iPhone)와 함께 움직이는 좌표계 $E'$로 좌표 변환할 필요가 있습니다.



좌표 변환 후, 좌표계 $E'$에서 카메라와 객체의 각도 $\theta$는,
$\theta =\arctan\dfrac{y'_2 - y'_1}{x'_2 - x'_1}$
로 요청할 수 있습니다.



이 부분의 실장 방법은 다음과 같이 되어 있습니다.
if let node = self.sceneView.scene.rootNode.childNodes.first { 
    if let camera = self.sceneView.pointOfView {                     
        let invMat :SCNMatrix4 = SCNMatrix4Invert(camera.transform) 
        let x = node.position.x 
        let y = node.position.y 
        let z = node.position.z 
        let transPosition :SCNVector3 = SCNVector3(x: x*invMat.m11 + y*invMat.m21 + z*invMat.m31, y: x*invMat.m12 + y*invMat.m22 + z*invMat.m32, z: x*invMat.m13 + y*invMat.m23 + z*invMat.m33) 
        let angle = (-1) * atan2(transPosition.y - camera.position.y, transPosition.x - camera.position.x) 
        imageView.transform = CGAffineTransform(rotationAngle: CGFloat(angle)) 
    } 
} 

첫 번째 줄: 객체 가져오기
2행째:카메라(iPhone)를 취득
세 번째 줄:camera.transform 에서 원점에서 카메라 위치로 4x4 변환 행렬을 가져옵니다.
(4 × 4 변환 행렬에 대한 참고 : htps : // 코 m/사과 1008L/있어 ms/2d7319772에 08f9465294)
이것의 역행렬을 SCNMatrix4Invert로 계산한다. (변환 행렬은 직교 행렬이므로 역행렬은 존재)
4~6행째: 오브젝트의 절대 좌표계 $E$에서의 좌표 $(x,y,z)^T$를 취득
7행:
방금 계산한 역행렬 중 회전각과 관련된 3×3의 성분을 $(x,y,z)^T$에 곱하여 카메라와 함께 움직이는 좌표계 $E'$로 변환
8행: 회전각 계산
9행 : 화살표의 이미지를 CGAffineTransform 로 회전
camera.transform 를 사용하여 카메라의 좌표계로 좌표를 변환하는 것이 중요합니다. 방향을 계산하고 싶을 때는 참고로 해 보세요.

좋은 웹페이지 즐겨찾기