문제

나는 여기서 생각하고 찾고있는 문제를 가지고 있으며,보기 위해 좋은 방향을 찾을 수 없다 ... 장치 모션을 사용하여 360 이미지 (Sphere Like)로 이동할 알고리즘을 개발하려고합니다.

그래서 사용자가 그 앞에있는 장치를 가리키면 이미지의 결정된 원점 지점을 얻습니다.그가 그 주위에 장치를 움직이면 파노라마 이미지가 그것에 따라 움직입니다.

아이디어 나 소스를 들여다 볼 수 있습니까?

Swift가있는 모든 사람들에게 감사와 행운을 빕니다 :)

도움이 되었습니까?

해결책

나는 많은 수학 번거 로움없이 이것을 구현하는 데 두 가지 쉬운 방법을 본다 :

  1. cmattitude의 롤 속성 . 이미지의 너비와 측정 된 각도 사이의 매핑을 정의하고 180 ° / -180 °에서 특이성을 돌립니다. 이 접근법의 단점 :
    • 가능한 위험 짐벌 잠금 사용자가 장치를 혼란스러운 방식으로 이동하기 시작할 때.
    • 전체 3D 뷰에 대한 확장 성에도 동일하게 적용됩니다.
  2. cmdeviceMotion의 자기장은 짐벌 잠금에 맞서 견고한 입니다. 자력계는 가속도계 / 자이로보다 조금 더 느리지 만 Coremotion의 융합 알고리즘이 합리적인 추정을 제공 할 것이므로 이것이 점이 아닐 것입니다. 단점 여기 :
    • 자기장은 항상 이용 가능하지 않거나 슬리미가 부정확 한 경향이 있습니다.
    • 3D 뷰로 확장하면 번거 로움이 될 수 있습니다.
  3. 두 접근법 모두 구현하기가 쉽고 그 중 하나를 시작해야합니다. 당신이 더 정교한 솔루션을 갖고 싶다면, 당신은 수학에 조금 더 깊게 다이빙해야합니다. 이 경우 ppossible 솔루션은 현재 장치를 정상적으로 사용할 수 있습니다 (예 : IOS 장치에 대한 정상 벡터를 찾는 )을 통해 지구의 표면 평면에 프로젝트를하고 원통형 파노라마의 각도의 델타를 가져옵니다.

    노멀 벡터를 직접 사용할 수 있으므로이 경우에는 구형 투영이 훨씬 쉽습니다.

다른 팁

케이 덕분 에이 효과를 얻기 위해 올바른 추적에있을 수 있습니다.

이 답변을 찾고있는 사람들에게 더 많은 세부 사항을 제공하기 위해이 답변을 만들고 있습니다.

먼저 cmmotionmanager 객체를 만들어야합니다.

그런 다음 그런 다음 StartDevicEmotionUpdateStoqueue를 사용하여 동작 이벤트를 처리합니다.

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];
.

ProcessMotion에서 이전 하나를 기반으로 태도를 가져와야합니다.

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];
.

이 덕분에 마지막 업데이트 이후 사용자가 만든 새로운 각도를 알고 있습니다. 그런 다음보기를 처리하는 곳에서는 새로운 euler 각도를 이미지를 이동하는 데 필요한 픽셀 양로 변환합니다. 단지 조심스럽게 euler 각도는 -180, 180 사이에서 다양하며 Apple에 의해 rad에 주어집니다.이것은 편리 할 수 있습니다 :

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))
.

그래서 내 경우에는 X 축을 방금 이동하기 때문에 새로운 X 오프셋을 계산합니다.

희망이 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top