번역 및 회전 변환을 분할하는 것이 좋습니다. 번역을 평균하는 것은 쉽지 않습니다.
회전을 평균하는 것이 쉽지 않습니다. 대부분의 접근 방식은 쿼터니언을 사용합니다. 따라서 회전 행렬을 쿼터니언으로 변환해야합니다.
q* = w1 * q1 + w2 * q2 + ... + w2 * qn
normalize q*
그러나, 이것은 단지 근사치이다
평균 근사하는 가장 쉬운 방법은 쿼터니언의 재 정규화 하였다 선형 혼합이다. 그 이유는 두 회전의 조합이 쿼터니언을 추가하는 것이 아니라 곱하는 것입니다. 쿼터니언을 대수 공간으로 변환하면 간단한 선형 혼합을 사용할 수 있습니다 (곱셈이 추가가되기 때문에). 그런 다음 쿼터니언을 원래 공간으로 다시 변환하십시오. 이것이 Spherical Average (Buss 2001)의 아이디어입니다.
start with q* as above
do until convergence
for each input quaternion i (index)
diff = q[i] * inverse(q*)
u[i] = log(diff, base q*)
//Now perform the linear blend
adapt := zero quaternion
weights := 0
for each input quaternion i
adapt += weight[i] * u[i]
weights += weight[i]
adapt *= 1/weights
adaptInOriginalSpace = q*^adapt (^ is the power operator)
q* = adaptInOriginalSpace * q*
당신은 adaptInOriginalSpace
에 대한 임계 값을 정의 할 수 있습니다 : 당신이 운이 좋다면, 당신은 사원 수의 로그 및 특급을 지원하는 라이브러리를 찾을 수 있습니다. 매우 작은 회전 인 경우 루프를 끊을 수 있습니다. 이 알고리즘은 구의 측지선 거리를 보존하는 것으로 입증되었습니다.더 많이 mathermatics 패키지는 그들의 평균 많은보다는 행렬을 도약한다 할 수있는 능력을 가지고 있기 때문에
count = 1
average_transform = Matrix.Identity(4)
for new_transform in list_of_matrices:
factor = 1/count
average_transform = lerp(average_transform, new_transform, factor)
count += 1
이 유용하다 : 기존 LERP 방법이있는 경우
Orthonormality는 제약 조건 집합입니다. 당신은 제한된 최소 자승 솔버를 조사해야합니다. 불행히도, 이러한 제약 조건은 비선형 제약 조건 (비선형 제약 조건이 적용될 때 제대로 작동 함에도 불구하고)이 아닙니다. 최적의 솔루션을 원하면 입력 코퍼스에 가장 근접한 유효한 회전 행렬을 찾으려면 반복적 인 과정이 필요합니다. – comingstorm
나는 이것을 대답 할 자격이 없다. 그러나 신경 과학에서 Python lib를 사용하여 회전에 대한 오일러 방정식 (NiPy)을 얻었습니다. 라이브러리는 막대기 등을 조심스럽게 사용합니다. 그런 다음 비선형 변환을 사용하여 의사 헤르 미션 행렬을 얻으려면 두 방향의 평균을 수행하고 평균을 구할 수 있습니다. – wbg