- 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/
我正在尝试使用 AngularJS 将 YouTube 视频插入到我的网站中,但我一直收到相同的错误: Error: $interpolate:interr Interpolation Error 为
我正在尝试将动态链接从 json 加载到我的 iframe 模板中。当我加载 iframe 页面时,会弹出此错误。我真的不知道为什么。这是我第一次看到这个错误。下面是代码。 Controller ap
我想从 x 进行插值到 z .但有一个警告: 取决于状态y , 我有一个不同的 xGrid - 我需要对其进行插值。 我有一个 y 的网格, yGrid .说 yGrid=[0,1] .和 xGrid
我是 javascript 的新手,但几周前刚刚钻研 d3.js 尝试创建时空可视化。 我想要实现的是基于以下代码的类似 ( https://jsfiddle.net/dmatekenya/mz5fx
scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0,
Scipy 函数 griddata和 Rbf两者都可以用于对随机分散的 n 维数据进行插值。它们之间有什么区别?其中之一在准确性或性能方面更胜一筹吗? IMO,这不是 this question 的重
我需要(以数字方式)计算函数的一阶和二阶导数,为此我尝试同时使用 splrep 和 UnivariateSpline 来创建样条曲线插值函数的导数。 但是,对于幅度为 10^-1 或更低的函数,样条表
好的,所以我最近一直在研究插值。遗憾的是,我读过的几乎每篇文章都只讨论精确到 0.0 到 1.0 的小数级别的插值。我想插入整数整数,不管它们有多大,或者是否有负数或其他什么。我用线性插值完成了这个:
如何在 FORTRAN 中实现二维插值,其中数据如下所示。 x 和 y 是两个坐标,z 是依赖于它们的值 x 间隔均匀但 y 不均匀间隔且 y 的最大值 对应于 x 的统一值不断增加。 在不损失太多准
在彼得阿尔弗雷德的 article关于多元散点数据插值,他提到,从各种方案中,只有少数方案真正受到从业者的欢迎。例如,他命名为 Shepard 方法和 Hardy Multiquadrics。但那篇文
我不清楚图像处理中重采样和插值之间的区别。如果我有一个 geotiff 并且我想提高它的分辨率,我应该使用重采样方法,例如最近邻,对吗?例如,我发现 gdalwarp 函数可以做到这一点。 插值方法,
对于这个有点令人困惑的标题,我感到很抱歉,但我不确定如何更清楚地总结这一点。 我有两组 X,Y 数据,每组对应一个总体值。它们是从原始数据中相当密集地采样的。我正在寻找一种方法,为任何给定的 Y 找到
我很抱歉标题有点困惑,但我不确定如何更清楚地总结这一点。 我有两组X,Y数据,每组对应一个大概的整体值。它们是从原始数据中相当密集地采样的。我正在寻找的是一种方法,可以为我已有的集合之间的值找到任何给
我是 D3 新手,正在尝试一些图表。在使用 D3 V4 构建折线图时,我遇到了以下错误。 d3.line(...).x(...).y(...).interpolate is not a functio
问候, 在我正在开发的网络应用程序中,我想做如下事情: 我有一个 bean class Gene{ String geneid; String sequence; .. } // EL express
有什么方法可以将 Angular 的 $interpolate 与数组而不是对象一起使用? 示例代码: var exp = $interpolate('Hello {{name}}!'); var r
我是编程新手,我会尝试编写一个线性插值函数: from bisect import bisect_left def interpolate((x_list, y_list), x_test):
我启动了一个带有共享元素的场景转换的 Activity,它工作正常。 ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTr
背景分析 在传统的html页面中我们可以定义变量吗?当然不可以,那我们假如希望通过变量的方式实现页面内容的数据操作也是不可以的。当然我们可以在服务端通过定义html标签库方式,然后以html作为模
我在 wikipedia 上阅读了关于双三次插值的信息.我遇到了变量 t这是没有定义的。 等式是: 谁能告诉我这个变量是什么意思以及它的常用值是什么? 最佳答案 t 是 0 到 1 之间的任何数字。
我是一名优秀的程序员,十分优秀!