GAMES103——作业1 刚体碰撞

任务

        1.更新位置、姿态与速度

        2.碰撞检测

        3.碰撞反馈

实现

        更新位置、姿态与速度

        对于速度的更新,采用显式的方法,对于位置的更新,采用隐式的方法。就是103中讲的两只青蛙的例子。

         需要同时更新线速度和角速度。线速度受到重力的影响,因此每次更新都要加上重力造成的速度影响,同时还需要乘上速度的衰减量。角速度的更新,也是乘上衰减量。

        位置和姿态的更新。对于位置的更新较简单。

        姿态的更新,涉及到四元数的运算。更新四元数时,和矩阵相乘叠加旋转效果一样,左乘一个四元数。而四元数的求解是通过下面的式子求得。因为计算三角函数性能开销会变大,这里的角度非常小,因此可以通过近似的方法求得近似的q = [1 , Δt/2*w]

 

叠加两次旋转,为 [1 , Δt/2*w] *q ,将[1 , Δt/2*w]分解成 1 + [0 , Δt/2*w],再将q乘进来就得到了103给的式子。这里代码就直接按103的式子实现了

         

			v += dt * gravity;
			v *= linear_decay;
			w *= angular_decay;
	//Update linear status
			Vector3 x    = transform.position + dt * v;
			//Update angular status
			Vector3 dw = w * dt / 2.0f;
			Quaternion qw = new Quaternion(dw.x,dw.y,dw.z,0.0f);
			Quaternion q = transform.rotation;
			Quaternion qw_q = qw *q;
			q = new Quaternion(q.x + qw_q.x , q.y + qw_q.y , q.z + qw_q.z , q.w + qw_q.w);

			// Part IV: Assign to the object
			transform.position = x;
			transform.rotation = q;
        碰撞检测

        先判断点是否已经进入了物体内部,如果在物体内部,再考虑是否还有往内部运动的趋势,说明需要进行碰撞反弹处理。这里较简单。

        当有多个点满足需要碰撞反弹处理时,需要对这些点求一个平均位置,再用平均的位置来进行之后的计算。

MeshFilter meshFilter &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值