使用Kinect SDK创建完整的3D骨架
这是我在uni的第一个图形主题,并且实现的某些部分不适合我。 我可以正确地绘制关节,但我正在尝试编写一个将关节之间的“骨骼”放入其中的函数。 在这一点上,骨骼只是立方体,被转换成直角棱镜,稍后我会尝试从搅拌机或其他东西介绍适当的模型。
我的麻烦是旋转。 大约5个小时左右后,我的伴侣和我有一些工作,但只要你的手臂或腿移动,立方体就会变形,看起来很奇怪。 任何帮助,将不胜感激。 以下是试图绘制骨骼的功能。
private void DrawBone(Skeleton skeleton, JointType jointType0, JointType jointType1)
{
Joint joint0 = skeleton.Joints[jointType0];
Joint joint1 = skeleton.Joints[jointType1];
// If we can't find either of these joints, exit
if (joint0.TrackingState == JointTrackingState.NotTracked ||
joint1.TrackingState == JointTrackingState.NotTracked)
{
return;
}
// Don't draw if both points are inferred
if (joint0.TrackingState == JointTrackingState.Inferred &&
joint1.TrackingState == JointTrackingState.Inferred)
{
return;
}
// We assume all drawn bones are inferred unless BOTH joints are tracked
if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked)
//jointvector(joint) takes a joint and returns a Vector2 with its position data, with the z invtred to work properly with directx11
Vector3 bonevector = Vector3.Subtract(jointVector(joint0), jointVector(joint1));
//cubevector is supposed to describe the initial vector of a cube centred at (0,0,0) with a side length of 2. A fair amount of guesswork has gone into this bit.
Vector3 cubevector = new Vector3(0, 2, 0);
//midpoint of two joints
Vector3 transTest = Vector3.Divide(Vector3.Add(jointVector(joint0),jointVector(joint1)), 2);
//divide by two because our original cube has side length 2
float scaleFactor = Math.Abs(bonevector.Length() / cubevector.Length());
//we haven't been taught quaternions in class or anything, but after a fair while searching for similar problems they seemed like the go-to option for rotations.
world = Matrix.Transformation(new Vector3(0, 0, 0), new Quaternion(0), new Vector3(0.05f, scaleFactor, 0.05f), new Vector3(0, 0, 0), new Quaternion(Vector3.Cross(cubevector, bonevector), (float)Math.Acos(Vector3.Dot(bonevector, cubevector))), transTest);
//view and proj are defined elsewhere and are working fine, it's just the world that is being lame
worldViewProj = world * view * proj;
worldViewProj.Transpose();
sDXdata.context.UpdateSubresource(ref worldViewProj, sDXdata.constantBuffer);
//36 vertices of the cube (two triangles per face) defined elsewhere
sDXdata.context.Draw(36, 0);
return;
对于骨取向,请检查:
skeleton.BoneOrientations[joint.JointType]
它会给你一个BoneOrientation类
http://msdn.microsoft.com/en-us/library/microsoft.kinect.boneorientation.aspx
从那里你可以有四元数/矩阵的旋转,无论是在世界空间,还是在父骨骼空间(用于蒙皮)
你也使用:
new Quaternion(0)
这是一个0向量,不是用于旋转的有效四元数,使用:
Quaternion.Identity;
这将是(0,0,0,1)
虽然这是前一段时间提出的,但我认为在计算角度时也存在错误。 你有:
(float)Math.Acos(Vector3.Dot(bonevector, cubevector)
我认为你需要:
(float)Math.Acos(Vector3.Dot(bonevector, cubevector) / (bonevector.Length() *
cubevector.Length()))
这是一个很好的数学例子。 你也可以使它们成为单位矢量,所以它们的长度为1,而不用担心分割:
(float)Math.Acos(Vector3.Dot(bonevector.Normalize(), cubevector.Normalize()))
查看MSDN页面以获取更多信息。
链接地址: http://www.djcxy.com/p/64239.html上一篇: Create a full 3d skeleton with Kinect SDK
下一篇: tcl exec result redirected to stdout need to be stored too