我正在开发自己的增强现实引擎。
在这个教程中,我发现了如何在屏幕上显示一个点,使用它的轴承,iPhone屏幕大小和相机视野:
+ (CGPoint) calculatePositionFor:(float)deltaOrient screenSize:(CGSize)screenSize fov:(float)fov
{
CGPoint point;
CGFloat x = (screenSize.width / 2.0f) + (deltaOrient * (screenSize.width / (fov / 2.0f)));
CGFloat y = screenSize.height / 2.0f;
point = CGPointMake(x, y);
return point;
}
参数为:
deltaOrient:
为位置方位减去设备航向。screenSize:
iPhone的屏幕尺寸。fov:
相机的视场
它工作得很好,直到我想显示一个靠近北方的位置。当设备方向从1度变为359度时,它不工作。
我得到这个日志:
2011-11-16 15:10:16.067 AREngineDemo[310:707] Beta: 7.005, Heading: 2.504323, X: 234.424377
2011-11-16 15:10:16.104 AREngineDemo[310:707] Beta: 7.005, Heading: 1.504323, X: 250.961853
2011-11-16 15:10:16.117 AREngineDemo[310:707] Beta: 7.005, Heading: 0.504323, X: 267.499329
2011-11-16 15:10:16.149 AREngineDemo[310:707] Beta: 7.005, Heading: 0.504323, X: 267.499329
2011-11-16 15:10:16.172 AREngineDemo[310:707] Beta: 7.005, Heading: 359.504333, X: -5669.451660
2011-11-16 15:10:16.195 AREngineDemo[310:707] Beta: 7.005, Heading: 358.504333, X: -5652.914551
2011-11-16 15:10:16.217 AREngineDemo[310:707] Beta: 7.005, Heading: 358.504333, X: -5652.914551
2011-11-16 15:10:16.244 AREngineDemo[310:707] Beta: 7.005, Heading: 358.504333, X: -5652.914551
X坐标从247
到-5669
。
我想知道如何解决它,我还不知道怎么做。
什么线索吗?
看起来deltaOrient
的计算很幼稚。当它从0变成359时,它可能等于359而不是-1。这显然是个问题。
我想不出一个好的和简单的解决方案来解决这个问题,但你至少可以通过这样的hack来测试:
if(deltaOrient > 180) deltaOrient -= 360;
else if(deltaOrient < -180) deltaOrient += 360;