作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
tl;dr:为模型设置动画时,每个关节都正确移动,但不相对于其父关节。
我正在使用 Lua 中自定义构建的 IQE 加载器和渲染器开发骨骼动画系统。在这一点上几乎所有东西都在工作,除了骨骼在动画时似乎脱节。每个关节都可以正确平移、旋转和缩放,但没有考虑其父节点的位置,从而产生了一些可怕的问题。
在引用 IQM 规范和演示时,我无法终生找出问题所在。我的 Lua 代码(据我所知)与引用 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
最佳答案
父骨骼的变换应该影响其子骨骼的变换。实际上,这是通过在其父项的框架中指定特定骨骼的变换来实现的。因此,通常骨骼的变换是在它们的局部坐标系中指定的,这取决于它的父级。如果任何 parent 发生转变,这种转变将影响所有 child ,即使他们的局部转变没有改变。
在您的情况下,您曾经缓存每个节点的所有绝对(准确地说是相对于根)转换。然后您使用缓存更新每个节点的本地转换,并且不更新您的缓存。那么,如果在更新子节点时使用缓存而不是实际的父节点变换,节点的本地变换的变化将如何影响它的子节点?
还有一个问题。你为什么要做以下事情?
f = base[joint.parent] * m * inverse_base[k]
f = base[joint.parent] * m
local buffer = {}
local transforms = {}
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
transforms[k] = transforms[joint.parent] * m
f = transforms[k] * inverse_base[k]
else
f = m * inverse_base[k]
transforms[k] = m
end
table.insert(buffer, f:to_vec4s())
end
关于opengl - 有育儿问题的骨骼动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26313154/
因此,除了索引之外,当我创建一个新项目并选择 conda 解释器时,还会启动更多需要数小时的进程。下面是一个快照。这些过程是什么?完成后它们会占用空间吗? 最佳答案 PyCharm 运行 genera
我是一名优秀的程序员,十分优秀!