3D对象操作

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->↓)
Vector3v0Dir= Vector3(0.f, 1.f, 0.f);
v0Dir = v0Dir / ||v0Dir||;
Vector3aDir= 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;

你可能感兴趣的:(F#)