如何做人体骨架模型?( 二 )

< g_3DModel[j0].numOfObjects; l++){if(g_3DModel[j0].pObject.size() <= 0) break;// 如果对象的大小小于0 , 则退出t3DObject *pObject = &g_3DModel[j0].pObject[l];// 获得当前显示的对象for(int j = 0; j < pObject->numOfFaces; j++) // 遍历所有的面{for(int tex = 0; tex < 3; tex++) // 遍历三角形的所有点{int index = pObject->pFaces[j].vertIndex[tex]; // 获得面对每个点的索引if(j0==2){if(pObject->pVerts[index].y < LastPoint.y )LastPoint = pObject->pVerts[index];}else{if(pObject->pVerts[index].y > LastPoint.y )LastPoint = pObject->pVerts[index];}}}}vect.x = LastPoint.x ;vect.y = LastPoint.y ;vect.z = LastPoint.z ;return vect;}比较特殊的是头部节点是通过脖子连接的 , 所以它是取最低的点 。现在解决最后的问题了 , 如何旋转了 , 具体来讲就是骨骼从原来自然的状态旋转到目前的方向 , 例如手臂从自然垂下变成抬起 , 垂下和抬起两个状态的矢量是不同的方向的 , 如何旋转呢? 这里就要用到了空间几何里的点积和叉积的概念了 , 简单来讲就是利用点积来求矢量夹角余弦,利用叉积来求两个矢量的法向量 , 如果你忘记了这些概念 , 可以回去参考一下高等数学书 , 这个连接也提供了一些资料 , 可以帮助理解http://www.gameres.com/Articles/Program/Visual/Other/shiliang.htm然后呢 , 我们知道了两个矢量的夹角与它们的法向量 , 下面的事情就变得简单了 , 我们让骨骼原来的矢量以法向量为旋转轴 , 旋转一定角度 , 这个角度就是两个矢量的夹角 , 这样问题就解决了 , 所以这里的代码如下:int OpenGL::rotate_bone(Vector3f vVector1, Vector3f vVector2, Vector3f vVectorOrgin){Vector3f vt1 = Vector3f(vVector1.x,vVector1.y,vVector1.z);Vector3f vt2 = Vector3f(vVector2.x,vVector2.y,vVector2.z);Vector3f vt4 = vt2-vt1;double arc12 = AngleBetweenVectors(vVectorOrgin,vt4);double rarc12 = 180*arc12/pi;float len= Distance(vt1,vt2);Vector3f vt3 = Cross(vVectorOrgin,vt4);glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);return 0;}
【如何做人体骨架模型?】

猜你喜欢