u3d菜鸟入门:unity中物体旋转初探

最近一直在研究做一个坦克类小游戏,希望做成儿时玩的《赤色要塞》那样。
在做主角控制的时候,遇到了一点问题。拿模拟器又玩了玩《赤色要塞》,发现它的操作模式是,按下方向键,当方向与自己的前方(即车头方向)相同时,才会向前移动,否则,会先将车头旋转到这个方向,然后再开始移动。
需求确定了,开始动手做。刚开始觉着很简单,使用transform.Rotate()方法可以很轻松的解决问题。但随后发现了一个问题:Rotate()方法只能让物体顺时针旋转,假如主角现在车头朝上(平面上方向只有上下左右四个大方向),我按下左键的话,车头会顺时针旋转270°转到左边,然后再移动。我觉着这是个不好的设计,车头完全可以逆时针选择90°就可以了。
于是乎,就开始了漫漫探索路。自己想到的解决方案:
1.既然是要旋转物体,那当然需要确定旋转角度了。所以得先求得角度。
2.求得角度后,要知道如何旋转吧?(顺时针or逆时针)
OK,那我们就先来求角度:
在unity里,如何来求角度呢?首先想到的是,既然有角度,肯定有角,而这个角的两边,就是我们当前车头方向,和要旋转到的方向。通过向量的内积公式(点乘公式):|A·B| = |A|·|B|·cos<A,B>可以很快求得cos<A,B>的值。然后再通过反余弦求得夹角的大小,因为在计算时可以将向量规范化(也就是将其模变为1),所以cos<A,B>=|A·B|。然后我们就能通过Mathf.Acos(|A·B|) * Mathf.Rad2Deg 来计算出夹角值。
这里的Mathf.Acos方法返回的是一个弧度值,需要转换成角度值(也就是乘以180/PI,也就是这个Mathf.Rad2Deg)。
这样夹角大小就求出来了。但很快我又发现一个让我很沮丧的问题!夹角是算出来了,而且计算这玩意已经肥了不少功夫!复习向量知识,查API怎么用,计算验证……但是,谁能告诉我这是顺时针还是逆时针啊?!无奈,只能继续探索。好吧,好歹夹角算出来了,只要知道旋转方向即可。
然后又开始查API,查旋转的方法。偶然间在CSDN上一个帖子了看到了解决办法,是zhao4zhong1老师给出的解决方法,言简意赅:去查向量叉乘。。看到这几个字,猛地一拍大腿,艾玛,向量叉乘就可以判断方向啊,而且可以计算夹角!
根据外积公式(叉乘公式)|A x B| = |A| ·|B|·sin<A,B>,那么我们首先要计算
|A x B|(记为C),这里unity脚本中给出了API,可以直接计算得到其值(但我还是推荐不懂得小伙伴一起研究下向量叉乘,毕竟搞这个还是很基础的说):Vector3 Vector3.Cross(Vector3 left,Vector3 right)。
要注意下:这里两个向量不能随便填,left填起始向量(也就是当前车头方向),right填目标向量(要旋转到的方向)。得到的向量是垂直于left和right向量的一个向量,也就是它们的旋转轴。因为

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值