ARKit에서 객체의 방향을 찾고 싶습니다.
마찬가지로 방향을 계산하고 싶다면 참고하십시오.
전체 코드
먼저 전체 코드를 먼저 올립니다.
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
를 사용하여 카메라의 좌표계로 좌표를 변환하는 것이 중요합니다. 방향을 계산하고 싶을 때는 참고로 해 보세요.
Reference
이 문제에 관하여(ARKit에서 객체의 방향을 찾고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kamata1729/items/37f514ba9265c04c185b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
처음에는
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
를 사용하여 카메라의 좌표계로 좌표를 변환하는 것이 중요합니다. 방향을 계산하고 싶을 때는 참고로 해 보세요.
Reference
이 문제에 관하여(ARKit에서 객체의 방향을 찾고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kamata1729/items/37f514ba9265c04c185b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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))
}
}
Reference
이 문제에 관하여(ARKit에서 객체의 방향을 찾고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kamata1729/items/37f514ba9265c04c185b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)