ARKit和CoreLocation:第二部分

使用线性代数(和Trig)导航

  示范代码 
  ARKit和CoreLocation:第一部分 
  ARKit和CoreLocation:第二部分 
  ARKit和CoreLocation:第三部分 

数学和坐标之间的方位角计算

如果您没有机会, 请先 结帐 第一 部分

现在,我们需要弄清楚如何获得两个坐标之间的方位角(角度)。 找到轴承后,我们进行了旋转变换,以使节点朝向正确的方向。

定义

弧度: 弧度是一个角度度量单位,定义为使得一个弧度从单位圆的中心对向产生的弧长为1。弧度等于180 /π度,以便将弧度转换为度,乘以180 /π。

如果您有两个不同的纬度(地球上两个不同点的经度值),则借助Haversine公式 ,您可以轻松地计算大圆距离(球体表面上两点之间的最短距离)。

– 可动类型

  sin =对立/斜边 
  cos =相邻/斜边 
 棕褐色=对面/相邻 

atan2: 带两个参数的反正切或反正切函数。

 棕褐色30 = 0.577 
 意思是:30度的切线为0.577 
  arctan 0.577 = 30 
 意思是:切线为0.577的角度为30度。 

按键

R”是地球的半径 
L”  经度 
  θ是纬度 
β ”轴承 
  '  '是增量/变化 

通常,当您沿着大圆弧路径(正交运动)时,当前的前进方向会有所不同; 最终航向将与初始航向有所不同,具体取决于距离和纬度(如果要从例如35°N,45°E(≈巴格达)移至35°N,135°E(≈Osaka),将以60°的航向开始,并以120°的航向结束!)。

该公式适用于初始方位角(有时称为正向方位角),如果沿大圆弧沿直线直线移动,则将使您从起点到终点

  β= atan2(X,Y) 
 其中, XY是两个量,可以计算为: 
  X = cosθb* sinΔL 
  Y = cosθa* sinθb— sinθa* cosθb* cos ∆L 

虽然MKRoute 为我们提供了构建ARKit导航体验的良好框架,路线上的台阶之间的距离可能足够远,以致破坏了体验。 为了减轻这种情况,我们需要遍历各个步骤并为它们之间的距离间隔生成坐标。

在给定起点,初始方位角和距离的情况下,这将计算沿(最短距离)大圆弧行进的终点和最终方位角。

  d '   是经过的距离 
R”是地球的半径 
L”  经度 
  φ是纬度 
 方位角θ (从北向右) 
  δ   是角距离    d / R 

  φ2= asin(sinφ1⋅cosδ + cosφ1⋅sinδ⋅cosθ  
  L2 = L1 + atan2( sinθ⋅sinδ⋅cosφ1,cosδ- sinφ1⋅sinφ2) 

我们下一步要做的是创建我们的节点类。 我们将对SCNNode进行子类化,并为其提供title属性(它是一个字符串)anchor属性(一个可选的 ARAnchor属性),该属性会在设置位置时更新位置。 最后,我们给BaseNode类一个location属性,它是CLLocation

我们需要添加方法来创建球形图形。 我们将在第1部分中实现与该领域类似的东西,但会针对我们的新条件进行修改。 由于我们只需要MKRouteStep指令中的文本,我们应该创建方法:

更新位置时,我们将进行锚点的矩阵变换,并使用最后一列中的x,y和z值,它们是位置变换的值。

资料来源:

sites.math.washington.edu/~king/coursedir/m308a01/Projects/m308a01-pdf/yip.pdf

khanacademy.org/math/linear-algebra/matrix-transformations/linear-transformations/a/visualization-linear-transformations

edwilliams.org/avform.htm#LL

tomdalling.com/blog/modern-opengl/04-cameras-vectors-and-input/

mobile-type.co.uk

tomdalling.com

中:崔逸

opengl-tutorial.org

open.gl/转换