2012-11-15 2 views
1

키 프레임 대신 트랙 (곡선)을 사용하여 스켈 레탈 애니메이션 시스템을 최적화하려고합니다. 각 곡선은 특정 구성 요소를 처리 한 다음 (현재로서는) 선형 적으로 값을 보간합니다. 내 뼈 위치에 잘 작동하지만 임은 쿼터니언 구성 요소 보간법의 "jagyness"를 제거하는 데 어려움을 겪고 있습니다 ...쿼터니온 컴포넌트 보간

기본적으로 각 뼈대 쿼터니언에 대해 각 구성 요소 (XY 및 Z)마다 1 개의 곡선이 있습니다. I는 XY 독립적 Z 곡선 보간 다음 코드를 사용

// Simple lerp... (f is always a value between 0.0f and 1.0f) 
return (curve->data_array[ currentframe ].value * (1.0f - f)) + 
     (curve->data_array[ nextframe ].value * f); 

I는 다음 쿼터니온 XYZ 보간 언제 뼈에 그것을 정규화 및 영향 전에 쿼터니언의 W 성분을 다시 다음 코드를 사용 그림 그리기 전 :

Quaternion QuaternionW(const Quaternion q) 
{ 
    Quaternion t = { q.x, q.y, q.z }; 

    float l = 1.0f - (q.x * q.x) - (q.y * q.y) - (q.z * q.z); 

    t.w = (l < 0.0f) ? 0.0f : -sqrtf(l); 

    return t; 
} 

뼈가 수시로 바뀌는 예외적 인 경우 드로잉은 괜찮습니다. 부동 소수점 정밀도 때문일까요? 또는 W 구성 요소의 재 계산? 아니면이 방식으로 쿼터니언의 각 구성 요소를 선형 적으로 보간 할 수있는 방법이 전혀 없습니다.

추신 : 메모 측면 내 곡선 보간 함수 I는 위에서 코드를 대체하는 경우 :

return curve->data_array[ currentframe ].value; 

대신 또는 선형 보간 모든 괜찮다 .. 그래서 데이터 분명히 올 .. . 임 ...

[편집]

는 더 많은 연구 후에 나는이 문제가 프레임 데이터에서 오는 것을 발견 ... 의아해 나는 다음과 같은 즉 가지고 :

,536 91,363,210

Frame0 : quat.x = 0.950497

프레임 1 : quat.x = -0.952190

프레임 2 : quat.x = 0.953192

이 반전하고 jaggyness 어떤 원인이다 .. 이 사건을 감지하고 데이터의 부호를 반전 시키려고했으나 일부 ​​프레임이 이제는 이상하게 보일 정도로 (시각적으로 볼 때 시각적으로) 문제를 완전히 해결하지 못합니다.

어떻게하면 커브를 올바르게 고정시킬 수 있습니까?

+0

쿼터니언 보간법에 대해서는 잘 모릅니다 만 도움이 될 수 있습니다. http://stackoverflow.com/questions/1684594/can-i-interpolate-rotation-from-two-quaternions-created-from-yaw- pitch-roll – num3ric

+0

"* 키 프레임 대신 트랙 (곡선)을 사용하여 내 골격 애니메이션 시스템을 최적화하려고합니다. *"저는 몇 개의 골격 애니메이션 시스템을 작성했습니다. 이것이 왜 최적화라고 생각합니까? 달성하려는 메모리 또는 성능 최적화입니까? –

+0

잘 둘 다 ... 각 구성 요소에 대한 곡선을 사용하여 각 프레임에 대한 모든 데이터를 저장할 필요가 없습니다 ... "프레임에서", "프레임으로"값만 커브가있는 구성 요소 만 보간하면됩니다. 골격 애니메이션 시스템을 작성했다면 Im과 마주하는 비슷한 문제가 있어야합니다 ... 보간법과 관련이 있습니다.독립적으로 쿼터니언의 구성 요소를 보간하는 것이 가능한가, 아니면 lerp (또는 slerp)에 full (XYZW)가 필요합니까? 톱니 모양은 데이터 부족으로 인해 발생하는 것 같습니다. 맞습니까? – McBob

답변

2

데이터가 잘못되었을 가능성이 없습니다. 쿼터니언 표현의 오리 엔테이션은 배가 중복되는 재미있는 속성을 가지고 있습니다. 쿼터니온의 네 가지 요소를 모두 무효화하면 동일한 방향으로 남게됩니다. 그것은 당신이 축/각도 표현으로 사원 수를 생각하면이를 쉽게 알 수 : 축 주위 Θ에 의해 회전, 축 -a 주위 에 의해 회전과 동일합니다.

당신은 무엇을해야합니까 에 대해 무엇입니까? 앞서 언급했듯이 slerp은 올바른 방법입니다. 쿼터니언 방위는 단위 대수층에 존재합니다. 한 구체의 점들 사이를 선형으로 보간하면 그 구체를 벗어납니다. 그러나 포인트가 서로 가깝다면 큰 문제는 아닙니다 (나중에 다시 정규화해야하지만). 예를 들어,

k=q0[0]*q1[0] + q0[1]*q1[1] + q0[2]*q1[2] + q0[3]*q1[3]; 

k<0 경우, 사원 수 중 하나를 부정 : 당신은 절대적으로 만들 필요 당신이 그들을 보간 전에 두 사원 수의 내부-제품을 확인하면된다하는 일이 확실하게 for (ii=0;ii<4;++ii) q1[ii]=-q1[ii];을 당신이 원 주위를 먼 길을 삽입하려고하지 않습니다. 그러나 이것은 쿼터니언을 부분이 아닌 전체로서 다루어야한다는 것을 의미합니다. 한 구성 요소를 완전히 버리는 것은 특히 문제가됩니다. 왜냐하면 쿼터니언이 모호하지 않게하기 위해 기호가 필요하기 때문입니다.

+0

남자! 대답은 아주 간단했습니다 ... 나는 아무것도를 위해 내 인생을 복잡하게합니다! 멍청 아! – McBob

0

나이브 고려

직선 보간은 뭔가 다른 사용자가 해당 작업을 실행할 때마다 뭔가를 추가 즉, 부가 적으로 작동 할 것들에 대한 괜찮습니다. 그러나 Queternions는 곱셈 적입니다 : 당신은 그들을 곱하기 위해 곱하면됩니다.

pow(secondQuaternion, f)*pow(firstQuaternion, 1. - f) 

위키 백과는 다른 것들 사이 쿼터니언의 능력을 계산에 section이 있습니다 이러한 이유로

, 나는 원래 다음과 같은 계산 제안했다. 아래의 귀하의 의견대로 이것이 효과가 없다고 언급 했으므로 상기 내용은 참고 용입니다.

적절한 보간

이 게시물을 작성하기 때문에, I는 SLERP (구면 선형 보간)에 대해 좀 더 읽고 위키는 section on quaternion slerp을 갖는 것을 발견했다. 위의 귀하의 의견은 그 용어가 이미 당신에게 익숙하다는 것을 암시합니다. 수식은 내가 위에서 쓴 것보다 조금 더 복잡하지만, 힘을 사용하는 방식 때문에 여전히 관련이 있습니다. 나는 당신이 그 공식의 이용 가능한 implementatin을 채택하거나 이식함으로써 최선을 다할 것이라고 생각한다. 예를 들어 This page에는 약간의 코드가 있습니다.

고정 데이터 업데이트 된 질문

제대로 곡선을 해결하는 방법에 어떤 아이디어가에 관해서는

?

올바른 데이터를 유지하면서 오류를 수정하는 데는 어떤 종류의 오류가 발생하는지 알 필요가 있습니다. 그래서 가능한 한 그 오류의 출처를 찾으려고 노력할 것입니다. 올바른 데이터를 생성하도록 수정 될 수 있다면 좋습니다. 그렇지 않다면, 그것은 당신에게 언제 무엇을 기대해야하는지 더 좋은 아이디어를 줄 것입니다.

+0

아니, 작동하지 않는 ... – McBob