3D对象操作
本文介绍了一丁点关于控制3D对象的实际需求以及采用的解法。
人物移动:
1、假设人物当前点为 curPos(Vector3), 速度为 v(float), 朝向为q(Quaternion 4元数 ),
求:在任意方向dir(Vector3)上,经过时间t(float) 人物所在的位置点pos(Vector3)。
解:
Vector3 realDir = q * dir ; // 根据人物朝向修正移动方向。
realDir = realDir / ||realDir||; // 归一化,realDir 现在表示为单位向量( 原方向的单位距离 )
pos = curPos + v*t* realDir // 距离*带方向的单位距离 = 该方向上的距离。
人物跳跃:
1、假设人物当前点为 curPos(Vector3), 速度为 v(float), 朝向为q(Quaternion 4元数 ),
跳跃最大高度为 heightMax(float), 跳跃持续时间为Tjump(float)。
求:在任意水平方向JumpDirH(Vector3)上,经过时间t(float) 人物所在的位置点pos(Vector3)。
解: // 根据人物朝向求得跳跃的世界坐标系方向
Vector3 realDir = q * JumpDirH;
realDir = realDir / ||realDir||;
//因为跳跃是匀减速运动,在只考虑垂直分量的情况下,最终速度为0。因此可以求得初速度v0.
float v0 = (2.f * heightMax ) / ( Tjump * 0.5f);
// 再计算 从 0-heightMax 的跳跃加速度a
float a = v0 / (Tjump * 0.5f);
// 根据初速度、加速度、经过的时间,计算当前垂直方向上的位移向量accelerationV。
// (计算的时候,令加速度方向为向下,表示垂直速度将由 v0->0->v0,方向为↑->0->↓)
Vector3 v0Dir = Vector3( 0.f, 1.f, 0.f );
v0Dir = v0Dir / ||v0Dir||;
Vector3 aDir = Vector3( 0.f, -1.f, 0.f );
v0Dir = v0Dir / ||v0Dir||;
Vector3 accelerationV = ( v0 * v0Dir ) * t + ( a * aDir ) * t * t *0.5f;
// 计算跳跃过程中,人物当前时间的位置。
pos = curPos + acceleration + realDir * v * t;