动作捕捉,系数转换各种问题

Posted 长虹剑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动作捕捉,系数转换各种问题相关的知识,希望对你有一定的参考价值。

bvh 数据格式介绍

bvh 内部没给坐标系,应该就是按照 opengl 的坐标系
bvh 如果写的旋转是 X Y Z ,那么就是先按照Z旋转,然后再按照Y,最后X, 这部分的看出是按照这个代码来的, 当然也可一把代码理解为大写的XYZ是内旋转,按照写的顺序摆放旋转矩阵。
https://www.cxyzjd.com/article/o87481299/7690954

enum  ZYX = 1, YZX = 2, ZXY = 3, XZY = 5, YXZ = 6, XYZ = 7;
unsigned char BVH::getFlags()

	return (unsigned char)((*p - 'X' + 1)*1 + (*(p+10) - 'X' + 1)*2 + (*(p+20) - 'X' + 1)*4 - 10);

//绘制函数的核心 递归的绘制 
void BVH::drawRecursive(BVHJoint* r)

	glPushMatrix();
	//要先平移后旋转(被debug3)
	//平移 根据父节点空间
	glTranslatef(r->x,r->y,r->z);
	//根据motion中的信息和节点的通道类型进行旋转
	roateSpace(r->flags);
	//画出点
	glutSolidSphere(1.0f,20,16);
	//递归绘制子节点
	for(int i = 0; i < r->childNum; i++)
	
		drawRecursive(r->getChild(i));
	 
	glPopMatrix();

void BVH::roateSpace(unsigned char flags)

	//enum ZYX = 1, YZX = 2,ZXY = 3,XZY = 5,YXZ = 6,XYZ = 7;
	switch (flags)
	
	case ZYX: // 1 = 11 - 10, 11 = 3*1 + 2*2 + 1*4 ==> 'ZYX'
		glRotatef(pFrame[0],0.0f,0.0f,1.0f);
		glRotatef(pFrame[1],0.0f,1.0f,0.0f);
		glRotatef(pFrame[2],1.0f,0.0f,0.0f);
		break;
    case XYZ: // ==> 'XYZ'
		glRotatef(pFrame[0],1.0f,0.0f,0.0f);
		glRotatef(pFrame[1],0.0f,1.0f,0.0f);
		glRotatef(pFrame[2],0.0f,0.0f,1.0f);
		break;
		// omit 
	

反向动力学(IK)的一些资料

给定3D/2D顶点如何求出骨骼旋转系数

方法一:
深度学习的方法,训练一个3D点到旋转系数的网络

方法二:
最优化的方法,不过最优化需要有初始值,最好能有个网路可以给出初始值,这样优化快一点。关于这一点可以看一个网络 IKNET
最优化其实也有几种思路,一般最优化的条件都是重建项+先验项(这里主要防止解出不合适的骨骼结构,可以加混合高斯先验项)
1)可以使用梯度下降 smplify-x ,这个SPIN
2)可以数值求解雅克比,例子在 Minimal-IK
3)C++ 雅克比解析求解,可以用 MonocularTotalCapture
具体在这里

bool AdamFullCost::Evaluate(double const* const* parameters,
        double* residuals,
        double** jacobians) const

一些比较好的项目

VPOSE 可以支持系数预测,判断姿态的好坏等

以上是关于动作捕捉,系数转换各种问题的主要内容,如果未能解决你的问题,请参考以下文章

R中线性模型的系数和摘要的不同NA动作

BP神经网络中动量项系数怎么定?

数字信号处理线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )

如何在 SQL 中将指数和系数转换为整数值

磁力计转换系数

热敏电阻主要作用是啥?