2

关于在 iPhone 屏幕上绘图的 x 坐标计算问题。当点在 300 米范围内时,我们将所有兴趣点都拉得更近,尽管实际上它们是分散的。我什至将视口的宽度从 0.5 更改至 0.17(以度为单位将 28.647889757 转换为 10.0)。任何人都可以建议每个兴趣点都相对于实际位置正确放置。

在 AR 上计算点的标准方法(Mixare,ARToolkit)是

使用 ARKit 计算

double pointAzimuth = coordinate.coordinateAzimuth;

//our x numbers are left based.
double leftAzimuth = self.currentCoordinate.coordinateAzimuth - VIEWPORT_WIDTH_RADIANS / 2.0;

if (leftAzimuth < 0.0) {
    leftAzimuth = 2 * M_PI + leftAzimuth;
}

if (pointAzimuth < leftAzimuth) {
    //it's past the 0 point.
    point.x = ((2 * M_PI - leftAzimuth + pointAzimuth) / VIEWPORT_WIDTH_RADIANS) * 480.0;
} else {
    point.x = ((pointAzimuth - leftAzimuth) / VIEWPORT_WIDTH_RADIANS) * 480.0;
}

在混合:

CGPoint point;
CGRect viewBounds = self.overlayView.bounds;
//NSLog(@"pointForCoordinate:   viewBounds.size.width = %.3f, height = %.3f", viewBounds.size.width, viewBounds.size.height );

double currentAzimuth = self.currentCoordinate.coordinateAzimuth;
double pointAzimuth = coordinate.coordinateAzimuth;


//NSLog(@"pointForCoordinate: location = %@, pointAzimuth = %.3f, pointInclination = %.3f, currentAzimuth = %.3f", coordinate.coordinateTitle, point.x, point.y, radiansToDegrees(pointAzimuth), radiansToDegrees(currentAzimuth), radiansToDegrees(pointInclination) );

double deltaAzimuth = [self deltaAzimuthForCoordinate:coordinate];
BOOL isBetweenNorth = [self isNorthForCoordinate:coordinate];

//NSLog(@"pointForCoordinate: (1) currentAzimuth = %.3f, pointAzimuth = %.3f, isNorth = %d", radiansToDegrees(currentAzimuth), radiansToDegrees(pointAzimuth), isBetweenNorth );

//  NSLog(@"pointForCoordinate: deltaAzimuth = %.3f", radiansToDegrees(deltaAzimuth));
//NSLog(@"pointForCoordinate: (2) currentAzimuth = %.3f, pointAzimuth = %.3f, isNorth = %d", radiansToDegrees(currentAzimuth), radiansToDegrees(pointAzimuth), isBetweenNorth );

if ((pointAzimuth > currentAzimuth && !isBetweenNorth) || 
    (currentAzimuth > degreesToRadians(360-self.viewRange) && 
     pointAzimuth < degreesToRadians(self.viewRange))) {

        // Right side of Azimuth            
        point.x = (viewBounds.size.width / 2) + ((deltaAzimuth / degreesToRadians(1)) * 12);  
    } else {

        // Left side of Azimuth
        point.x = (viewBounds.size.width / 2) - ((deltaAzimuth / degreesToRadians(1)) * 12);    
    }   
4

0 回答 0