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)
其中, X和Y是两个量,可以计算为:
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/转换