私はSpriteKitとARKitを試していて、同じシーン内の2つのARAnchors間の角度をどのように計算できるのでしょうか?2つのARAnchors間の角度
これは、世界のアンカーの位置を取得し、水平面(または別の任意の平面)に定義する線の角度を計算することを意味します。
ありがとう
私はSpriteKitとARKitを試していて、同じシーン内の2つのARAnchors間の角度をどのように計算できるのでしょうか?2つのARAnchors間の角度
これは、世界のアンカーの位置を取得し、水平面(または別の任意の平面)に定義する線の角度を計算することを意味します。
ありがとう
まず、両方のアンカーのワールドポジションを取得する必要があります。これらの座標は次のように変換し、各アンカーから取得することができます。
let transform = anchor.transform
let position = vector_float3.init(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z)
今、私たちは、各アンカーのために、空間内の2点を持つことができます。 p1
とp2
と呼ぶことができます。水平に対する角度を計算するには、3番目の点が必要です。
アングルの頂点がp1
の場合、この新しいポイントはp1
と同じy座標を持ちますが、p2
の直下または上になります。だから、:
let p2Hor = vector_float3.init(p2.x, p1.y, p2.z)
我々はポイント(p2
とp2Hor
)とそれらのドット積の各頂点(p1
)から正規化ベクトルを必要とする角度を計算します。 vector_float3
とsimd
モジュールを使った操作は簡単です。正規化されたベクターは、次のように計算される:
let p1ToP2Norm = normalize(p2 - p1)
let p1ToP2HorNorm = normalize(p2Hor - p1)
ドット積:
let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm)
角度(ラジアン)である:
let angle = acos(dotProduct)
このすべてvector_float3
の拡張でARKitの迅速な対応:
import ARKit
import simd
extension vector_float3 {
/// Returns the angle of a line defined by to points to a horizontal plane
///
/// - Parameters:
/// - p1: p1 (vertice)
/// - p2: p2
/// - Returns: angle to a horizontal crossing p1 in radians
static func angleBetweenPointsToHorizontalPlane(p1:vector_float3, p2:vector_float3) -> Float {
///Point in 3d space on the same level of p1 but equal to p2
let p2Hor = vector_float3.init(p2.x, p1.y, p2.z)
let p1ToP2Norm = normalize(p2 - p1)
let p1ToP2HorNorm = normalize(p2Hor - p1)
let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm)
let angle = acos(dotProduct)
return angle
}
}
[3Dの2線間の角度]の可能な複製(https://stackoverflow.com/questions/46790176/angle-between-2-lines-in-3d) – Knight0fDragon