1

我将ARToolkitsdk 用于基于位置的 AR 以geolocation在相机上显示点。我已经为 ios 实现了这个 sdk,但我有一个问题是两个gps方向相同的点相互重叠。如何解决这个问题请帮助我。

AugmentedRealityController.m我在方法的类上有一些小的变化updateLocations。根据距离我正在调整屏幕上的标签高度,但问题没有解决,如何在两个重叠的标记之间制作间隙。

if ([item distanceFromOrigin]>= 50 && [item distanceFromOrigin]<= 100) {
                 scaleFactor = 1.2;
                loc.y = loc.y - 20;               
            }
            else if ([item distanceFromOrigin]>= 100 && [item distanceFromOrigin]<= 150) {
                scaleFactor = 0.8;
                loc.y = loc.y - 50;

            }
            else if ([item distanceFromOrigin]>= 150 && [item distanceFromOrigin]<= 200) {
                scaleFactor = 0.6;
                loc.y = loc.y - 80;
            }
            else if ([item distanceFromOrigin]>= 200 && [item distanceFromOrigin]<= 300) {
                scaleFactor = 0.6;
                 loc.y = loc.y - 100;

            }
            else if ([item distanceFromOrigin]>= 300 && [item distanceFromOrigin]<= 400) {
                scaleFactor = 0.6;
                loc.y = loc.y - 120;
            }
            else if ([item distanceFromOrigin]>= 400 && [item distanceFromOrigin]<= 500) {
                scaleFactor = 0.5;
            }
            else if ([item distanceFromOrigin]>= 500 && [item distanceFromOrigin]<= 600) {
                scaleFactor = 0.5;
            }
            else if ([item distanceFromOrigin]> 500)
            {
               scaleFactor = 0.5;
            }
            [markerView setFrame:CGRectMake(loc.x - width / 2.0, loc.y -[item radialDistance]/100, width, height)];
            //            [markerView setFrame:CGRectMake(loc.x - width / 2.0, loc.y, width, height)];
            [markerView setNeedsDisplay];
}

如果有人知道如何解决这个问题,请帮助我。

4

2 回答 2

0

在您的 AugmentedRealityViewController 的 UpdateLocation 方法中进行一些更改,您可以计算两个标记视图之间的差异,然后设置标记的值 y 位置。

for (ARGeoCoordinate *item in [self coordinates]) {
 UIView *markerView = [item displayView];
if ([self shouldDisplayCoordinate:item]) {
 CGPoint loc = [self pointForCoordinate:item];
            CGFloat scaleFactor = SCALE_FACTOR;

            if ([self scaleViewsBasedOnDistance]) 
                scaleFactor = scaleFactor - [self minimumScaleFactor]*([item radialDistance] / [self maximumScaleDistance]);

            float width  = [markerView bounds].size.width  * scaleFactor;
            float height = [markerView bounds].size.height * scaleFactor;
if ([item distanceFromOrigin]>0) {
            float difference = [item distanceFromOrigin]-prevLoc;

        if ((difference>0 &&difference<200) || ( difference < 0 && difference>(-200))) {
                            [markerView setFrame:CGRectMake(loc.x - width / 2.0, loc.y-difference, width, height)];

        }
    prevLoc = [item distanceFromOrigin];
        }
}
else if ([markerView superview])
{
  [markerView removeFromSuperview];
}
}

prevLoc 是在 .h 文件中声明的浮点类型变量,并在 init 方法中初始化为零。

它将管理标记以定位到 y 位置。

于 2014-12-20T09:17:29.740 回答
0

我通过对代码进行一些更改解决了标注冲突的问题。

1)在AugmentedRealityViewControllerupdateLocations方法,进入if条件和

if (!([markerView superview])) {
[[self displayView] insertSubview:markerView atIndex:1];
[self listSubviewsOfView:markerView]; // retrive the subviews from the markerview which is display on the camera screen...
}

这个条件是updatelocation方法,我称之为listSubviewsOfView方法,用于subviewsuperView.

(void)listSubviewsOfView:(UIView *)view {

// Get the subviews of the view
NSArray *subviews = [view subviews];

// Return if there are no subviews
if ([subviews count] == 0) return;

for (UIView subview in subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {

UIImageView *myLabel = (UIImageView *)subview;
myLabel.clipsToBounds = YES;
if (myLabel.tag == 1)
{
numberOfImageView++;
CGRect rect = myLabel.frame;
rect.origin.y = 0+numberOfImageView50;
myLabel.frame = rect;
}

}
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}

//there is variable numberOfImageView. declare in .h file 
int numberOfImageView;

//and do one thing in else condition of the updateLocation Method , set the "numberOfImageView" to zero.
else 
if ([markerView superview])
{

  [markerView removeFromSuperview];
   numberOfImageView =0;
}

然后编译运行

于 2014-12-18T07:24:21.283 回答