- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
矩形物体与场景碰撞检测的过程(该过程在每一帧都进行):首先,根据物体的运动规律或用户的输入计算物体在当前帧的位置然后,循环遍历场景中每一个线段。在循环过程中,作如下操作:1.遍历所有场景线段,使用包围圆(包围圆的半径大于矩形的对角线的一半,保证把矩形包围进去)初步检测物体是否与场景线段碰撞,若未碰撞跳到步骤5,若与点碰撞跳到3,若与线碰撞则进一步做22.检测矩形物体的四个顶点的任意一个是否与该场景线段碰撞,若是做4,否做53.检测矩形物体是否与该点碰撞,若是做4,否做54.物体已经与场景发生碰撞,进行碰撞反应,修改物体的速度和位置及车身方向5.我们已经能够确定物体与当前线段没有发生碰撞。使下线段成为当前线段,回到1。当所有的线段都遍历了一遍之后,物体的位置和速度及车身方向就是经过碰撞检测并修正了之后的。具体实现:使用包围圆的初步检测:使用物体形心到线段的距离来判断是否和线段碰撞,假设待检测的物体形心是p设包围圆的半径是r,待检测的背景线段是ab,则当p与线段ab的距离小于r时,包围圆与线段碰撞,否则未碰撞。那么如何求形心到线段的距离呢?假设我们有一个待检测的点p和待检测的线段ab,如下图所示:Vector ap=p-a;由a指向p的向量Vector ab=b-a;由a指向b的向量Float d=ab*ab;ab长度的平方Float f=ap*ab;ap在ab上的投影的线段即(ad)和ab的乘积如果f0则ap和ab反向,说明p的投影点d再ba的延长线上,则距离就是ap的长度如果fd则adab,说明p的投影点d再ab的延长线上,则距离就是bp的长度如果0fd说明p的投影点d再线段ab上,这距离就是点p到直线ab的距离当通过包围圆初步检测到碰撞之后,就开始使用矩形进行实际的检测了,下面分别讲述矩形与场景线段和场景线段端点的碰撞检测。矩形物体与线碰撞的检测:遍历矩形的任意一个顶点(四个顶点的坐标通过物体形心位置和物体方向经坐标转换得到)是否跟当前场景线段碰撞,若有一个碰撞则物体碰撞,那么如何判断一个点是否跟线段碰撞呢?为每一个场景线段ab定义一个法向量ab.N,指向线段的正面如图Vector oa=a-o;在ab上任取一点(这里取a),求出原点o到a的向量ab.D=oa*ab.N;oa和法向量点乘得出线段到原点的距离Vector op=p-o;求出原点o到待测点p的向量p.D=op*ab.N;op和线段法向量点乘得出点p在线段法向量方向上与原点的距离if(p.D-ab.D)0,点p在线段ab的正面if(p.D-ab.D)0点p在线段ab的背面当矩形物体的四个顶点的任意一个在线段的背面,且投影在线段上(使用上面提到的方法),则碰撞。检测矩形物体与点的碰撞:遍历矩形物体的四条边,判断该点是否在每条边的背面(使用上述方法),若点在所有四条边的背面,说明该点在矩形的内部,即发生碰撞。矩形物体与场景碰撞的碰撞反应:调整物体的位置:1.记录当前物体的碰撞位置p,当前碰撞场景线段的法向量N2.计算矩形物体发生碰撞的顶点和碰撞线段的距离D3.调整碰撞后物体的位置:Newp=p+D*N即把物体延法向量移动已陷进线段的距离调整碰撞后物体的速度:得到当前碰撞物体的速度,把该速度分为垂直与场景线段的分量Vt和平行于场景线段的分量Vn,Vt=-Vt*碰撞系数;Vn=Vn*摩擦系数;调整碰撞后物体的方向:记录碰撞前物体的方向dir,碰撞场景线段的方向向量ab通过点积和反余弦函数得到dir和ab的夹角 angle计算旋转系数:NsteerAngle跟垂直于碰撞场景线段的速度分量大小成正比,比例系数可以调整TsteerAngle跟平行于碰撞场景线段的速度分量大小成正比,比例系数可以调整当angle45时物体向更小的角度旋转NsteerAngle度当angle135时物体向更小的角度旋转NsteerAngle度当45angle135时物体向垂直于场景碰撞线段的垂直防线旋转TsteerAngle度服务端物体与物体的碰撞:设有物体a,b。通过a,b的位置和方向分别计算出各自的四个顶点的坐标,相邻顶点构成线段,法向量指向物体外部对于物体a的每个顶点,遍历物体b的四条边,若该顶点在b所有四条边的背面,则认为a的该顶点与物体b碰撞。对于物体b的每个顶点,遍历物体a的四条边,若该顶点在a所有四条边的背面,则认为b的该顶点与物体a碰撞。若以上两步都做完之后未发现碰撞,则认为在该帧没有发生碰撞。遇到的错误:物体与两个场景线段形成的尖角临近时,过早的发生碰撞原因:当物体的包围圆已与尖点碰撞时,由于圆与两条线段同时碰撞,要检测矩形的点与两条线段的碰撞,在一条线段的正面,但可能在另一条线段的反面,于是错误地认为发生碰撞解决:两条线段同时判断,如果都在反面才认为发生碰撞。两个物体发生碰撞时,
文档评论(0)