- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下午好。我想实现骨骼动画。我在 Blender 中创建了一个简单的示例并通过 collada 将其导出。
因为这对我来说是全新的,所以我使用了 collada 1.4.1指定并通过关键帧重新创建网格。
然后我尝试在变换矩阵之间进行插值以获得完整的动画。
Vector32BITF* vertices = (Vector32BITF*)calloc(CubeDAE::verticesCount, sizeof(Vector32BITF));
SceUShort16* indices = (SceUShort16*)calloc(CubeDAE::indicesCount, sizeof(SceUShort16));
for (unsigned int i = 0; i < CubeDAE::indicesCount; i++) { indices[i] = CubeDAE::indices[i][0]; }
float timer = 2.1f;
ScePspFMatrix4 bones_transform[3];
int keyframeA_i = 0;
int keyframeB_i = 0;
float lerpFact = 0.0f;
while(!done){
fps->PreUpdate();
keyframeA_i = ((int)timer) % CubeDAE::keyframesCount;
keyframeB_i = (((int)timer) + 1) % CubeDAE::keyframesCount;
lerpFact = pspFpuFrac(timer);
// keyframeA_i = 0;
// keyframeB_i = 1;
// lerpFact = 0.8;
for (unsigned int bone_i = 0; bone_i < CubeDAE::bonesCount; bone_i++) {
ScePspFMatrix4* local_matrixA = &CubeDAE::bones[bone_i][keyframeA_i];
ScePspFMatrix4* local_matrixB = &CubeDAE::bones[bone_i][keyframeB_i];
ScePspFVector3 positionA;
ScePspFVector3 positionB;
Mathf::Matrix::GetPosition(&positionA, local_matrixA);
Mathf::Matrix::GetPosition(&positionB, local_matrixB);
ScePspFMatrix3 rotationA;
ScePspFMatrix3 rotationB;
Mathf::Matrix::GetRotation(&rotationA, local_matrixA);
Mathf::Matrix::GetRotation(&rotationB, local_matrixB);
ScePspFVector4 q_rotationA;
ScePspFVector4 q_rotationB;
Mathf::Matrix::ConvertToQuaternion(&q_rotationA, &rotationA);
Mathf::Matrix::ConvertToQuaternion(&q_rotationB, &rotationB);
ScePspFVector3 translation;
ScePspFVector4 quaternion;
Mathf::Vector::Lerp(&translation, &positionA, &positionB, lerpFact);
Mathf::Quaternion::Slerp(&quaternion, &q_rotationA, &q_rotationB, lerpFact);
ScePspFMatrix4 offsetMatrix;
Mathf::Matrix::fromRotationTranslation(&offsetMatrix, &quaternion, &translation);
if (bone_i == 0) {
std::memcpy(&bones_transform[bone_i], &offsetMatrix, sizeof(ScePspFMatrix4));
} else if (bone_i == 1) {
Mathf::Matrix::Multiply(&bones_transform[bone_i], &offsetMatrix, &bones_transform[bone_i - 1]);
} else if (bone_i == 2) {
Mathf::Matrix::Multiply(&bones_transform[bone_i], &offsetMatrix, &bones_transform[bone_i - 2]);
}
}
unsigned int v_i = 0;
for (unsigned int vertices_i = 0; vertices_i < CubeDAE::verticesCount; vertices_i++) {
vertices[vertices_i].color = (0xff<<24)|((int)(pspFpuAbs(pspFpuCos(vertices_i)) * 255.0f) << 16)|((int)(pspFpuAbs(pspFpuSin(vertices_i)) * 255.0f) << 8)|((int)(pspFpuAbs(vertices_i) * 255.0f));
vertices[vertices_i].x = 0;
vertices[vertices_i].y = 0;
vertices[vertices_i].z = 0;
for (unsigned int vcount_i = 0; vcount_i < CubeDAE::vcount[vertices_i]; vcount_i++, v_i += 2) {
/*
SUM += ((v * BSM) * IBMi * JMi) *JM
• n: number of joints that influence vertex v
• BSM: bind shape matrix
• IBMi: inverse bind matrix of joint i
• JMi: joint matrix of joint i
• JW: joint weight/influence of joint i on vertex v
*/
// (v * BSM)
//ScePspFVector3 out = {0,0,0};
//Mathf::Vector::Transform(&out, &CubeDAE::shapeMatrix, &CubeDAE::vertices[vertices_i]);
// IBMi * JMi
ScePspFMatrix4 skinning_matrix = {{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}};
Mathf::Matrix::Multiply(&skinning_matrix, &CubeDAE::poses[CubeDAE::v[v_i]], &bones_transform[CubeDAE::v[v_i]]);
// ((v * BSM) * IBMi * JMi)
ScePspFVector3 skin = {0,0,0};
Mathf::Vector::Transform(&skin, &skinning_matrix, &CubeDAE::vertices[vertices_i]);
// ((v * BSM) * IBMi * JMi) *JM
Mathf::Vector::Scale(&skin, CubeDAE::weights[CubeDAE::v[v_i + 1]]);
vertices[vertices_i].x += skin.x;
vertices[vertices_i].y += skin.y;
vertices[vertices_i].z += skin.z;
}
}
// TODO: render here
}
但是我在某个地方犯了错误,所以我得到了错误的动画。
我哪里错了?
PS:应用是在PSP平台下写的,但是意思和到处做的没什么区别。您可以找到完整的简单示例 here .
最佳答案
找了很久的问题,终于找到了。
主要错误在函数 Mathf::Matrix::fromRotationTranslation()
是
void fromRotationTranslation(ScePspFMatrix4* result, const ScePspFVector4* quaternion, const ScePspFVector3* translation)
{
// Quaternion math
float x = quaternion->x, y = quaternion->y, z = quaternion->z, w = quaternion->w,
x2 = x + x,
y2 = y + y,
z2 = z + z,
xx = x * x2,
xy = x * y2,
xz = x * z2,
yy = y * y2,
yz = y * z2,
zz = z * z2,
wx = w * x2,
wy = w * y2,
wz = w * z2;
result->x.x = 1 - (yy + zz);
result->x.y = xy + wz;
result->x.z = xz - wy;
result->x.w = 0;
result->y.x = xy - wz;
result->y.y = 1 - (xx + zz);
result->y.z = yz + wx;
result->y.w = 0;
result->z.x = xz + wy;
result->z.y = yz - wx;
result->z.z = 1 - (xx + yy);
result->z.w = 0;
result->w.x = translation->x;
result->w.y = translation->y;
result->w.z = translation->z;
result->w.w = 1;
}
我现在有
void fromRotationTranslation(ScePspFMatrix4* result, const ScePspFVector4* quaternion, const ScePspFVector3* translation)
{
// Quaternion math
float x = quaternion->x, y = quaternion->y, z = quaternion->z, w = quaternion->w,
xx = x * x,
xy = x * y,
xz = x * z,
xw = x * w,
yy = y * y,
yz = y * z,
yw = y * w,
zz = z * z,
zw = z * w;
result->x.x = 1 - 2 * ( yy + zz );
result->x.y = 2 * ( xy - zw );
result->x.z = 2 * ( xz + yw );
result->y.x = 2 * ( xy + zw );
result->y.y = 1 - 2 * ( xx + zz );
result->y.z = 2 * ( yz - xw );
result->z.x = 2 * ( xz - yw );
result->z.y = 2 * ( yz + xw );
result->z.z = 1 - 2 * ( xx + yy );
result->x.w = translation->x;
result->y.w = translation->y;
result->z.w = translation->z;
result->w.x = result->w.y = result->w.z = 0;
result->w.w = 1;
}
PS:很有帮助this FAQ
关于c++ - 骨骼动画 : interpolation between transformation matrices (collada),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58102957/
我有一段这样的代码。我发现 myResults = writer.getBuffer().toString(); 对某些用例返回 EMPTY STRING,但对其他用例则不返回。 我查看了服务器,但在
如何使用 javascript 通过 id 更改元素中的 -webkit-transform 、-moz-transform 、-o-transform 和 -ms-transform css? 这段
我正在使用 javax.xml.transform.Transformer.transform() 通过 xsl 样式表将一个 xml 转换为另一个 xml。我想以编程方式设置第一级 child 的排
为了使 seaborn.pairplot() 正常工作,在 jupyter notebook 中执行了以下步骤。 /usr/local/lib/python2.7/site-packages/matp
假设这个输入 XML 编写这些代码行: StreamSource source = new StreamSource(new StringReader(/* the above XML*/));
如何在 spring 框架中配置 java.xml.transform.Transformer ?我需要转换器的实例来通过 xslt 将 xml 转换为文本。因此,配置的转换器应该了解 xslt 样式
我一直在核心数据中使用可转换属性,将图像和颜色等复杂对象转换为原始数据。我拿了this ... The idea behind transformable attributes is that you
我正在尝试打开 XML 文件,添加一些更改,然后保存到其他 XML 文件结果。我正在使用标准 javax.xml.parsers.* 和 javax.xml.transform* 类。 但在保存的文档
Transformer(变换方法)对输入源的大小有限制吗? 我正在尝试转换一个相当长的 (18M) XML,但收到一个奇怪的错误 "The element type "HR" must be term
我正在尝试解析一个非常简单的示例: 100 我使用的样式表如下: 这在 libxs
来自文档 for from_pretrained ,我知道我不必每次都下载预训练的向量,我可以使用以下语法保存它们并从磁盘加载: - a path to a `directory` contain
默认缓存目录磁盘容量不足,我需要更改默认缓存目录的配置。 最佳答案 您可以在每次加载模型时指定缓存目录 .from_pretrained通过设置参数cache_dir .您可以通过导出环境变量 TRA
有一个函数,例如: CATransform3DGetAffineTransform Returns the affine transform represented by 't'. If 't' ca
我有一个包含 WCF 设置的配置文件: “add”元素只有一个 baseAddress 属性,所以我不能使用 Match 定位器。一种方法如何像我的示例中那样转换多个元素? 最
在收到下面链接中描述的错误后,我已将实体属性的 Transfomer 设置为 NSSecureUnarchiveFromData(之前为 nil)。 CoreData crash error Xcod
当我写Document时使用 Transformer 的 transform() 方法转换为 XML,生成的 XML 文档的格式很好 - 所有元素都写在单独的行上并缩进。除了第一个元素与定义写在同一行
我不明白 StreamResult 实例会发生什么。我看到 Transformer 对象接收 source 和 streamResult: transformer.transform(sour
从下面的代码片段我应该得出结论,std::transform 比 boost::transform 更受欢迎,因为前者使用更少的初始化和析构函数可能更有效比后者? #include #include
transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。 这个算法有一个版本和 for_each()
我是 react-native 的新手。在项目上将 react-native 从 0.48.3 升级到 0.62.2 后,运行“react-native run-ios”命令时出现错误:“index.
我是一名优秀的程序员,十分优秀!