작성
·
10
·
수정됨
0
안녕하세요.
커스텀 스플라인 ik 세팅으로 플립이 없는 트위스트를 구현하고자 합니다.
캐릭터 셋업 테크닉에 나온 makecloset함수를 응용해서 다음과 같은 로테이션 스크립트를 작성했습니다.
(nodeA와 B는 스플라인 IK의 양 끝단 트위스트 컨트롤러 객체 노드, 아래 수식은 회전 보간 될 중간 본들에 적용 된 로테이션 스크립트)
fn quatDot a b = (a.w*b.w + a.x*b.x + a.y*b.y + a.z*b.z)
fn midSlerpNoFlip qA qB t = ( if (quatDot qA qB) < 0 do qB = -qB ; slerp qA qB t )
(
local P = if self.parent != undefined then self.parent.transform else (matrix3 1)
local qA = (nodeA.transform * inverse P).rotation
local qB = (nodeB.transform * inverse P).rotation
local qMid = midSlerpNoFlip qA qB 0.5
local qOut = qMid
qOut
)
문제는 local qMid = midSlerpNoFlip qA qB 0.5가 0.5가 아닌 다른 값으로 보간을 하면 플립이 생긴다는 건데, 제가 뭔가 수식을 잘못 작성한 것인지, 아니면 맥스에서 혹은 수학적으로 완벽한 논플립 회전 보간이 불가능한 것인지 궁금합니다.
(와이어 파라미터에서 회전값을 받아오는 방식은 컨트롤러의 부모가 회전했을 때는 컨트롤러의 실질적인 회전 변화가 0이라 제가 원하는 방식은 아니었습니다.)
답변 1
0
안녕하세요.
전체적인 스크립트의 맥락을 파악했을 때 함수 내부에 있는 다음 코드 끝에 0.5 대신에 t를 써야하는게 아닐까 생각됩니다.
(Before) local qMid = midSlerpNoFlip qA qB 0.5
(After) local qMid = midSlerpNoFlip qA qB t
makecloest함수는 두 쿼터니언을 보간하는 가장 가까운 방향의 쿼터니언을 계산하기 위해 안전장치를 하는 의미이구요.
t 값에 어떤 비율을 넣더라도 qA와 qB 둘중 하나가 180도 이상 회전할 경우 플립 되는건 정상입니다. 180도를 넘어가는 순간 반대 방향으로 보간되는게 더 가까우므로 플립이 됩니다.
즉, midSlerpNoFlip 이라는 함수는 함수 이름과 다르게 플립이 발생할 수 있는 구조입니다.
굳이 스크립트 함수로 계산하지 않더라도 orientation constraint 컨트롤러로 A, B두 오브젝트의 회전을 50%씩 참조하도록 C 오브젝트의 컨트롤러를 설정한 뒤에, A나 B 오브젝트를 천천히 회전하면서 C에서 왜 플립이 발생하는지 살펴보면 어떤 상황인지 이해하기 쉬울것으로 생각됩니다.