ios 간단 하고 자 유 롭 게 움 직 이 는 AR 기능 구현
1.먼저 우 리 는 카메라 인터페이스 를 사용자 정의 해 야 합 니 다.AVCapture Session 으로 사용자 정의 할 수 있 습 니 다.다른 단 추 를 필요 로 하지 않 고 미리 볼 수 있 는 인터페이스 만 있 습 니 다.
2.우 리 는 간단 한 레이더 그림 을 그 려 야 한다.CGContextRef 로 간단하게 실현 할 수 있다.레이더 그림 은 당신 과 근처에 있 는 사용자(물체)의 거 리 를 나타 내 고 실제 물체 의 경위도 와 두 점 사이 의 거 리 를 계산 하 며 일정한 비례 를 통 해 레이더 그림 에 투사 한다.두 점 사이 의 거리 계산 공식 은 다음 과 같다.
//
-(float) DistanceFromCoordinates:(CLLocationCoordinate2D) myDot other:(CLLocationCoordinate2D)otherDot
{
double EARTH_RADIUS = 6378137.0;
double radLat1 = (myDot.latitude * M_PI / 180.0);
double radLat2 = (otherDot.latitude * M_PI / 180.0);
double a = radLat1 - radLat2;
double b = (myDot.longitude - otherDot.longitude) * M_PI / 180.0;
double s = 22 * asin(sqrt(pow(sin(a / 2), 2)
+ cos(radLat1) * cos(radLat2)
* pow(sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = round(s * 10000) / 10000;
return s;
}
물체 가 레이더 그림 에 표 시 된 위 치 를 계산 하려 면 삼각함수 에 따라 sinA=대변/사선,cosA=인접 변/사선,사선 이 있 습 니 다.바로 두 점 사이 의 거리 입 니 다.그러면 우 리 는 한 각 도 를 알 아야 한 변 을 계산 할 수 있 습 니 다.이 변 과 반지름 의 가감 을 통 해 이 물체 가 레이더 그림 에 있 는 위 치 를 계산 할 수 있 습 니 다.그래서 우 리 는 먼저 두 점 의 방위각 을 계산 하고 아래 의 그림 을 봐 야 한다.이 위 키 위의 방위각 의 해석 도 는 우 리 는 tan2 함 수 를 통 해 계산 할 수 있 습 니 다.공식 은 다음 과 같 습 니 다.
- (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
{
float fLat = DegreesToRadians(fromLoc.latitude);
float fLng = DegreesToRadians(fromLoc.longitude);
float tLat = DegreesToRadians(toLoc.latitude);
float tLng = DegreesToRadians(toLoc.longitude);
float degree = RadiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng)));
if (degree >= 0) {
return degree;
} else {
return (360+degree);
}
}
3.레이더 그림 이 핸드폰 에 따라 회전 하 는 것 을 실현 하려 면 나침반 의 원 리 를 사용 해 야 합 니 다.CLLocationManager 관리 류 를 통 해 안에 CLHeading 류 가 있 습 니 다.우 리 는 나침반 을 실현 할 수 있 습 니 다.이런 구 조 를 볼 수 있 습 니 다.안에 진 북,자 북,그리고 자력 치가 x,y,z 세 축 에 있 는 자력 값 이 있 습 니 다.그런데 제 가 이 세 가지 값 을 사용 할 때 문제 가 있 는 것 을 발 견 했 습 니 다.앞 뒤로 핸드폰 을 이동 할 때 이 값 의 변화 가 멈 추 는 것 을 발 견 했 습 니 다.만약 에 이 값 으로 이동 을 실현 하면 유창 하지 않 기 때문에 저 는 다 자 이 로 데 이 터 를 사 용 했 습 니 다.CMMotionManager 라 는 관리 류 를 통 해 핸드폰 의 이동 진동 각 도 를 얻 고 핸드폰 이 앞 뒤로 이동 할 때 물체 가 핸드폰 인터페이스 에서 상하 의 위 치 를 계산한다.
-(void) startMotion
{
if (![_mgr isDeviceMotionActive] && [_mgr isDeviceMotionAvailable])
{
//
_mgr.deviceMotionUpdateInterval = 0.1;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[_mgr startDeviceMotionUpdatesToQueue:queue
withHandler:^(CMDeviceMotion * _Nullable motion,
NSError * _Nullable error) {
double gravityX = motion.gravity.x;
double gravityY = motion.gravity.y;
double gravityZ = motion.gravity.z;
if (gravityY<=0 && gravityY>=-1)
{
// (zTheta , xyTheta ):
zTheta = atan2(gravityZ,sqrtf(gravityX*gravityX+gravityY*gravityY))/M_PI*180.0;
}
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updataPoint];
}];
//[self performSelectorOnMainThread:@selector(updataPoint) withObject:nil waitUntilDone:NO];
}];
}
}
4.각도 구간 을 계산 하여 핸드폰 에 있 는 물체 의 표시 가 숨겨 져 있다 는 것 을 나타 낸다.즉,레이더 그림 에 있 는 점 이 부채 형 으로 보 이 는 구역 에 들 어가 면 물체 가 나타 나 고 이동 하 며 초과 하면 숨겨 진다.또 하 나 는 충돌 검출 을 계산 해 야 하 는 휴대 전화 에 물체 와 물체 가 너무 많 으 면 겹 쳐 서 는 안 되 며,오 류 를 통 해 CGRect Intersects Rect 를 통 해 두 사각형 이 닿 았 는 지 알 아 보 는 알고리즘 을 쓸 수 있다 는 것 이다.내 가 실현 하 는 원 리 를 간단히 말 하면 물론 실제로 할 때 많은 문제 에 부 딪 힐 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.