opengl es 从零开始系列9动画基础和关键帧动画(5)

2019-08-03 10:22

quat.y) + (quat.z * quat.z)))); matrix[1] = (2.0f * ((quat.x * quat.y) - (quat.z * quat.w))); matrix[2] = (2.0f * ((quat.x * quat.z) + (quat.y * quat.w))); matrix[3] = 0.0f; matrix[4] = (2.0f * ((quat.x * quat.y) + (quat.z * quat.w))); matrix[5] = (1.0f - (2.0f * ((quat.x * quat.x) + (quat.z * quat.z)))); matrix[6] = (2.0f * ((quat.y * quat.z) - (quat.x * quat.w))); matrix[7] = 0.0f; matrix[8] = (2.0f * ((quat.x * quat.z) - (quat.y * quat.w))); matrix[9] = (2.0f * ((quat.y * quat.z) + (quat.x * quat.w))); matrix[10] = (1.0f - (2.0f * ((quat.x * quat.x) + (quat.y * quat.y)))); matrix[11] = 0.0f; matrix[12] = 0.0f; matrix[13] = 0.0f; matrix[14] = 0.0f; matrix[15] = 1.0f;}Converting an Angle and Axis of Rotation to a Quaternion 把一个角度和旋转轴转换成一个四元数四元数可以做的另外一种转换是,表示成在一个Vector3D表示的轴线上进行旋转。这在骨骼动画里面是非常有用的,因为这种表现形式通过矩阵是很难做到的。创建一个基于角度和轴旋转得四元数,我们可以这样做:static inline Quaternion3D Quaternion3DMakeWithAxisAndAngle(Vector3D axis, GLfloat angle){ Quaternion3D quat; GLfloat sinAngle; angle *= 0.5f; Vector3DNormalize(&axis); sinAngle = sinf(angle); quat.x = (axis.x * sinAngle); quat.y = (axis.y * sinAngle); quat.z = (axis.z * sinAngle); quat.w =

cos(angle); return quat;}Extracting an Angle and Axis of Rotation from a Quaternion 从一个四元数中检测角度和轴得旋转反过来,我们也可以从四元数中取得旋转的数据,包括旋转角度和深度,就像这样static inline void

Quaternion3DExtractAxisAndAngle(Quaternion3D quat, Vector3D *axis, GLfloat *angle){ GLfloat s;

Quaternion3DNormalize(&quat); s = sqrtf(1.0f - (quat.w * quat.w)); if (fabs(s) < 0.0005f) s = 1.0f; if (axis != NULL) { axis->x = (quat.x / s);

axis->y = (quat.y / s); axis->z = (quat.z / s); } if (angle != NULL) *angle = (acosf(quat.w) * 2.0f);}Quaternion Multiplication 四元数乘法为了合并两种不同形式的四元数中得3D旋转信息。我们只需要让他们彼此相乘。好了继续我们得代码static inline void

Quaternion3DMultiply(Quaternion3D *quat1, Quaternion3D *quat2){ Vector3D v1, v2, cp; float angle; v1.x = quat1->x; v1.y = quat1->y; v1.z = quat1->z; v2.x = quat2->x; v2.y = quat2->y; v2.z = quat2->z; angle = (quat1->w * quat2->w) - Vector3DDotProduct(v1, v2); cp =

Vector3DCrossProduct(v1, v2); v1.x *= quat2->w; v1.y *= quat2->w; v1.z *= quat2->w; v2.x *=

quat1->w; v2.y *= quat1->w; v2.z *= quat1->w; quat1->x = v1.x + v2.x + cp.x; quat1->y = v1.y + v2.y + cp.y; quat1->z = v1.z + v2.z + cp.z; quat1->w = angle;}Inverting a Quaternion 四元数转置我们通过做一个四元数的共轭运算来取得四元数的转置。四元数做共轭运算其实就是将四元数中表示向量(x,y,z)的值取反。在这里的实现中,我们把它[四元数转置计算]作为四元数标准计算的一部分,而不是一个独立的步骤:static inline void

Quaternion3DInvert(Quaternion3D *quat){ GLfloat length = 1.0f / ((quat->x * quat->x) + (quat->y * quat->y) + (quat->z * quat->z) + (quat->w * quat->w)); quat->x *= -length; quat->y *= -length; quat->z *= -length; quat->w *=

length;}Creating a Quaternion from Euler Angles 从欧拉角中创建四元数前面我说过在旋转中最好不要使用欧拉角,但是有时候我们需要将欧拉角转换成四元数,比如说用户输入的信息是欧拉角信息。转换的步骤是,将欧拉轴用Vector3D表示出来,然后将Vector3D的值转换成四元数,最后将四元数相乘来得到结果:static inline Quaternion3D

Quaternion3DMakeWithEulerAngles(GLfloat x, GLfloat y, GLfloat z){ Vector3D vx = Vector3DMake(1.f, 0.f, 0.f);

Vector3D vy = Vector3DMake(0.f, 1.f, 0.f); Vector3D vz = Vector3DMake(0.f, 0.f, 1.f); Quaternion3D qx = Quaternion3DMakeWithAxisAndAngle(vx, x);

Quaternion3D qy = Quaternion3DMakeWithAxisAndAngle(vy, y); Quaternion3D qz =

Quaternion3DMakeWithAxisAndAngle(vz, z); Quaternion3DMultiply(&qx, &qy ); Quaternion3DMultiply(&qx, &qz );

return qx;}


opengl es 从零开始系列9动画基础和关键帧动画(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:以先进典型为榜样,增强进取精神心得体会

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: