tl; dr : 모델에 애니메이션을 적용 할 때 각 관절은 올바르게 움직이지만 모 모 관절을 기준으로 이동하지 않습니다.육아 문제가있는 골격 애니메이션
나는 루아에서 IQE 로더와 렌더러 내장 사용자 정의를 사용하여 골격 애니메이션 시스템에서 일하고 있습니다. 거의 모든 것이이 시점에서 작동하고 있습니다. 단, 애니메이션 작업을 할 때 골격의 연결이 끊어지는 것처럼 보입니다. 각 조인트는 정확하게 병진 이동, 회전 및 크기 조정을 수행하지만 부모 위치를 고려하지 않으므로 약간의 끔찍한 문제가 발생합니다.
IQM 사양과 데모를 언급 할 때, 내가 잘못하면 무엇이 잘못 될지 알 수 없습니다. 내 루아 코드는 (내가 말할 수있는 한) 참조 용 C++과 동일하다. 자료 공동 행렬을 계산
:local base = self.active_animation.base
local inverse_base = self.active_animation.inverse_base
for i, joint in ipairs(self.data.joint) do
local pose = joint.pq
local pos = { pose[1], pose[2], pose[3] }
local rot = matrix.quaternion(pose[4], pose[5], pose[6], pose[7])
local scale = { pose[8], pose[9], pose[10] }
local m = matrix.matrix4x4()
m = m:translate(pos)
m = m:rotate(rot)
m = m:scale(scale)
local inv = m:invert()
if joint.parent > 0 then
base[i] = base[joint.parent] * m
inverse_base[i] = inv * inverse_base[joint.parent]
else
base[i] = m
inverse_base[i] = inv
end
end
계산 애니메이션 프레임 행렬
local buffer = {}
local base = self.active_animation.base
local inverse_base = self.active_animation.inverse_base
for k, pq in ipairs(self.active_animation.frame[self.active_animation.current_frame].pq) do
local joint = self.data.joint[k]
local pose = pq
local pos = { pose[1], pose[2], pose[3] }
local rot = matrix.quaternion(pose[4], pose[5], pose[6], pose[7])
local scale = { pose[8], pose[9], pose[10] }
local m = matrix.matrix4x4()
m = m:translate(pos)
m = m:rotate(rot)
m = m:scale(scale)
local f = matrix.matrix4x4()
if joint.parent > 0 then
f = base[joint.parent] * m * inverse_base[k]
else
f = m * inverse_base[k]
end
table.insert(buffer, f:to_vec4s())
end
전체 코드는 추가 심사 here입니다. 관련 코드는 /libs/iqe.lua에 있으며 IQE 함수의 맨 아래에 있습니다 : buffer() 및 IQE : send_frame(). 이 코드는 LOVE 게임 프레임 워크의 사용자 정의 버전에서 실행되며 Windows 바이너리 (및 배치 파일)가 포함됩니다.
최종주의 사항 : 매트릭스 코드는 다른 구현 및 여러 테스트와 비교하여 검증되었습니다.
먼저 도움을 주셔서 감사드립니다. 귀하의 코드를 테스트 할 때, 그것은 거의 작동합니다! 어쨌든 제 코드보다 훨씬 낫습니다! 나는 나의 애니메이션 중 하나 인 "blah"로이 이상한 버그를 얻었고, 이것이 내가 뼈를 올바르게 해석하지 못하게하는 목록을 파싱하는 방식 때문에 아이들이 사용하기에 적절하지 않은지 궁금합니다. https://dl.dropboxusercontent.com/u/12958391/misc/mk2.png – Karai17
"ㅋㅋ"애니메이션을 보았습니다. 다리의 맨 위에있는 부모의 변형이 잘못된 것처럼 보입니다. 확실하지는 않지만 아마도이 이상한 * inverse_base *와 관련된이 문제. * inverse_base [k] * 을 곱하지 않고 코드를 다시 작성하고 사용중인 내보내기 도구의 설정을 조정하십시오. – Podgorskiy
일부 뼈는 자녀가 사용하기 전에 업데이트되지 않을 수도 있습니다. 그렇다면 분명히 애니메이션이 깨질 것입니다. 앞서 작성한 포스트 스크립트를 참조하십시오. – Podgorskiy