怎样vector3 旋转指定角度的角度

最近在自己第一个游戏项目里面碰到一个看似简单却花了我2天时间才解决的问题
特地发出来分享一下
在BOX2D 中如何控制body 自然的旋转到一个指定角度?
这个问题在许多游戏中控制角度时都会遇到,但是在BOX2D中,你必须考虑到如果转动中与其他body碰撞等物理因素。
能够想到的解决方案有三种:
1 在update方法里不断更改body的角度,使他接近于要设定的角度。 
b2vec2 clickedP//设定点的向量
float bodyAngle = body-&GetAngle();//取得物体自身的弧度
b2Vec2 toTarget = clickedPoint - body-&GetPosition();//计算角度差
float desiredAngle = atanf( -toTarget.x, toTarget.y );//计算设定的弧度
float totalRotation = desiredAngle - bodyA//计算需要旋转的弧度
while ( totalRotation & -180 * DEGTORAD ) totalRotation += 360 * DEGTORAD;//调整设定角度到-180到180度之间
while ( totalRotation &
180 * DEGTORAD ) totalRotation -= 360 * DEGTORAD;
float change = 1 * DEGTORAD; //每次间隔允许最大旋转角度
float newAngle = bodyAngle + min( change, max(-change, totalRotation));
body-&SetTransform( body-&GetPosition(), newAngle );
很明显,第一种方法并不适合在物理引擎中使用,因为不断设定body的角度会打乱BOX2D中的仿真效果。
2 在update方法里不断给body施加一个能使body转到设定角度的力矩。
刚开始肯定会想到这样做:
float totalRotation = desiredAngle - bodyA
while ( totalRotation & -180 * DEGTORAD ) totalRotation += 360 * DEGTORAD;
while ( totalRotation &
180 * DEGTORAD ) totalRotation -= 360 * DEGTORAD;
body-&ApplyTorque( totalRotation);
但是运行看看?你会发现一个问题,物体始终受到一个朝向设定点角度方向的力矩,直到物体转到这个角度,乍看好像没问题,但是实际上,物体在到达设定角度时角速度并不是零,所以物体将继续转过这个角度,并受到一个反向的力矩,然后到达设定角度后又一次超过设定角度,这样永远循环摆动,却永远到达不了设定角度。
总结了下原因没有考虑到自身本身的角速度影响。
真的非常难解释的非常清楚,可能我也理解的不太够吧,直接给出解决方案。
方法是假设一定时间间隔dt内body不受任何转矩,计算出dt间隔后的body角度,用来替换现在的body角度:
float dt = 1.0f / 60.0f;
float nextAngle = bodyAngle + body-&GetAngularVelocity() *
float totalRotation = desiredAngle - nextA
while ( totalRotation & -180 * DEGTORAD ) totalRotation += 360 * DEGTORAD;
while ( totalRotation &
180 * DEGTORAD ) totalRotation -= 360 * DEGTORAD;
float desiredAngularVelocity = totalRotation /
float torque = body-&GetInertia() * desiredAngularVelocity /
body-&ApplyTorque( torque );
但是这样还不是最好的方法,body仍然需要来回晃动数个来回才能最终停下来。
3 在update方法里不断给body施加一个能使body转到设定角度的惯性冲量。
最终的解决方案是通过施加一个冲量,和上面的方法相似:
float dt = 1.0f / 60.0f;
float nextAngle = bodyAngle + body-&GetAngularVelocity() *
float totalRotation = desiredAngle - nextA
while ( totalRotation & -180 * DEGTORAD ) totalRotation += 360 * DEGTORAD;
while ( totalRotation &
180 * DEGTORAD ) totalRotation -= 360 * DEGTORAD;
float desiredAngularVelocity = totalRotation /
float impulse = body-&GetInertia() * desiredAngularV// disregard time factor
body-&ApplyAngularImpulse( impulse );
此外,如果你想在旋转过程中设定一个最大旋转速度,可以添加一个change值
float dt = 1.0f / 60.0f;
float nextAngle = bodyAngle + body-&GetAngularVelocity() *
float totalRotation = desiredAngle - nextA
while ( totalRotation & -180 * DEGTORAD ) totalRotation += 360 * DEGTORAD;
while ( totalRotation &
180 * DEGTORAD ) totalRotation -= 360 * DEGTORAD;
float desiredAngularVelocity = totalRotation /
float change = 1 * DEGTORAD; //allow 1 degree rotation per time step
desiredAngularVelocity = min( change, max(-change, desiredAngularVelocity));
float impulse = body-&GetInertia() * desiredAngularV// disregard time factor
body-&ApplyAngularImpulse( impulse );
至此,基本完美的解决了这个问题,并且可以通过调整dt的值,可以实现不同精度的旋转body到指定角度,通过调整change的值,改变旋转的最大速度。
对应的,此方法还可以实现控制body自然的加速到一个指定速度,我将在下次详细讲下方法。
阅读(...) 评论()查看: 1376|回复: 5
如何让一个部件旋转一定的角度,并移到指定点
主题帖子威望
助工, 积分 51, 距离下一级还需 149 积分
助工, 积分 51, 距离下一级还需 149 积分
马上注册,结交更多好友,享用更多功能!
才可以下载或查看,没有帐号?
因工作需要,刚学PRO/E,请问在装配体中,
如何让一个部件旋转一定的角度,并移到指定点。
先谢谢了!
主题帖子威望
实习生, 积分 36, 距离下一级还需 14 积分
实习生, 积分 36, 距离下一级还需 14 积分
选中部件,右键-编辑定义后会出来, 放置和移动你可以研究下
主题帖子威望
助工, 积分 51, 距离下一级还需 149 积分
助工, 积分 51, 距离下一级还需 149 积分
原帖由 yueye2030 于
20:07 发表
选中部件,右键-编辑定义后会出来, 放置和移动你可以研究下
谢谢!明天上班试试。
主题帖子威望
必要的话做些基准,或者用匹配或对齐里的角度偏移
主题帖子威望
助工, 积分 190, 距离下一级还需 10 积分
助工, 积分 190, 距离下一级还需 10 积分
最简单的方法,建立一个基准点,这个点就是你指定的点,首先把轴对轴约束上,然后再点选零件的轴线与指定点,也就是“点在直线上”的约束。
主题帖子威望
工程师, 积分 215, 距离下一级还需 285 积分
工程师, 积分 215, 距离下一级还需 285 积分
要以一个基准轴作为参照,一个面相对于另一个面绕着基准轴旋转。
社区建设勋章
优秀斑竹勋章
原创先锋勋章
热心助人勋章
宣传大使勋章
本站为非营利性站点,部分资源为网友搜集或发布,仅供学习和研究使用,如用于商业用途,请购买正版。站内所发布的资源,如有侵犯你的权益,请,本站将立即改正或删除。
)&苏公网安备 03号小木虫 --- 600万学术达人喜爱的学术科研平台
&&查看话题
Proe中的三维零件如何绕固定轴转动一定角度
各位虫友!
在proe中画好三维零件后,如何使零件绕固定轴旋转一个角度?
学术科研必备,90%的学术科研者都在使用
关于Proe中的三维零件如何绕固定轴转动一定角度的相关话题在小木虫APP已经有93位虫友给出了详细回复。
赶快查看回复吧!
关于Proe中的三维零件如何绕固定轴转动一定角度的相关话题在小木虫APP已经有93位虫友给出了详细回复。
赶快查看回复吧!
学术必备与600万学术达人在线互动!
扫描下载送金币
浏览器进程
打开微信扫一扫
随时随地聊科研君,已阅读到文档的结尾了呢~~
autocad怎么画角度 autocad外部参照 autocad 角度 autocad2004 画角度 autocad autocad角度线 autocad 输入角度 autocad2012 autocad2010 autocad2007
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何在AutoCAD内旋转到某个参照角度
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 unity 旋转指定角度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信