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->↓)
    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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值