本文首发于洪流学堂微信公众号。

洪流学堂公众号回复forward,获取本文的测试工程。


小新:“智哥,我在设置人物持枪IK时,想要将枪的方向设置为光标的方向。但是出现了枪旋转混乱的问题,这个该怎么解决啊?”
大智:“具体说说看你是怎么实现的?”
小新:“我先计算了枪的朝向的向量,代码是这样的”

想深入了解大智和小新这对好基友,可以在洪流学堂公众号回复小新了解他们。

var pos = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, 10));
var direction = (pos - _currentGun.transform.position).normalized;

小新:“这不计算出来方向了嘛,我觉得最简单的方法就是设置枪的transform里面的forward向量。但是我先设置场景为pivot模式(显示物体的自身坐标轴),然后看了枪的轴以后,发现枪口方向的轴不是forward,而是红色的轴,也就是right。”

大智:“没错,这点很好,就是不要想当然的用forward/up/right这些轴,一定要根据实际情况。forward是蓝色的轴,up是绿色的轴,right是红色的轴。记不清楚的时候可以看下Scene窗口右上角的小工具的颜色。”

小新:“然后我就设置枪的transform的right为-direction,就像这样”

_currentGun.transform.right = -direction;

小新:“结果运行起来是这个样子,上下旋转没啥问题,但是左右旋转枪会发生翻转”

大智:“好,我大概了解了。你使用了transform的right属性,但是你知不知道设置right的具体内部代码是什么?”

小新:“这个我还真不知道”

大智:“Unity已经公布了C#端的所有源码,这个你可以去 https://github.com/Unity-Technologies/UnityCsReference 里面查看。你去看看Transform类中的forward/up/right是怎么定义的”

小新赶忙打开这个链接,去找相关的内容。

小新:“在Github网站上找好麻烦,我还是把它下载下来”

大智:“非常明智,下载下来以后通过VS打开可以快速找到想要的内容”

小新:“找到了!在Transform.bindings.cs文件的第41行”

// The red axis of the transform in world space.
public Vector3 right { get { return rotation * Vector3.right; } set { rotation = Quaternion.FromToRotation(Vector3.right, value); } }// The green axis of the transform in world space.
public Vector3 up { get { return rotation * Vector3.up; } set { rotation = Quaternion.FromToRotation(Vector3.up, value); } }// The blue axis of the transform in world space.
public Vector3 forward { get { return rotation * Vector3.forward; } set { rotation = Quaternion.LookRotation(value); } }

大智:“你仔细看看这三个属性在set的时候内部具体是如何实现的”

小新:“对于right和up,他用了Quaternion.FromToRotation来创建了一个四元数,但是起始位置用的是世界坐标轴的right和up”

大智:“没错,起始位置用的是世界坐标轴的right和up,而枪的初始姿态不正常,因为是平躺在地上的而不是竖着的状态,需要将枪的朝向调整为拿在手中时的朝向,比如将枪调成竖着的状态。对于这个枪Quaternion.FromToRotation在计算旋转的时候就会出现不正常的情况。这时候有两种解决方式:”

  • 通过给枪加一个空的父物体,调整好枪的朝向,使用这个父节点进行旋转,这样枪就不会沿着x轴旋转了,旋转也就正确了。

  • 不使用transform的right进行设置,而是自己计算旋转。代码也很简单,如下:
var rot = Quaternion.FromToRotation(-_currentGun.transform.right, direction);
_currentGun.transform.rotation = rot * _currentGun.transform.rotation;

大智:“这种方式在物体原来旋转的基础上进行旋转叠加,不会出现旋转乱掉的问题。”

总结

小新:“以后再遇到问题我要探究问题的深层次原因,不能仅限于将问题解决这个表象。”
大智:“这么想就对了,这样才能进步的更快!”

今日思考题

下载测试工程,深入了解下这个问题的原因和解决办法吧!
洪流学堂公众号回复forward,获取本文的测试工程。
欢迎在留言区分享你的收获,和大家一起讨论。

别忘了分享给你学Unity的朋友,也许能够帮到他。


《郑洪智的Unity2018课》,倾尽我8年的开发经验,结合最新的Unity2018,带你从入门到精通。

Unity中设置Transform的forward/up/right旋转异常问题相关推荐

  1. max模型导入到unity中设置

    看到在unity中,导入3ds max的模型,需要转换模型的轴,可以看这篇文章http://blog.csdn.net/yongh701/article/details/77963676. 选择物体, ...

  2. 关于Unity中的transform组件(二)

    在Scene视图中的蓝色网格,每一格默认是1米 一.沿着Z轴每秒移动10米 Transform cube_trans; void start(){ this.cube_trans=this.trans ...

  3. 在unity中设置多种怪物数据_Unity可编程渲染管线(SRP)系列(三)——光照(单通道 正向渲染)...

    本文重点: 1.漫反射着色 2.支持方向光.点光源和聚光灯 3.每帧允许16个可见光源 4.每个对象最多计算四个像素光和四个顶点光 这是涵盖Unity可编写脚本的渲染管线的教程系列的第三部分.这次,我 ...

  4. 【100个 Unity实用技能】☀️ | Unity中设置 允许的最大帧数,锁定游戏的最大帧率(游戏锁帧)

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  5. Unity中的Transform Gizmo中的Pivot和Center

    选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...

  6. Unity中设置屏幕常亮

    Screen.sleepTimeout = SleepTimeout.NeverSleep; 转载于:https://www.cnblogs.com/AlanCheng/p/5531345.html

  7. Unity中 批量设置成 预制体

    在unity 中 设置预制体时,一般情况下 是一个一个的拖拽 ,很方便. 但是,遇到需求是 制作大量的预支体时, 一个一个的拖拽,效率很低, 也很无聊.查找资料, 发现 是可以批量的制作预制体的.步骤 ...

  8. 蒙皮骨骼动画 unity_在Unity中沿航路点设置蒙皮网格动画

    蒙皮骨骼动画 unity This post is a guide to importing a skinned mesh with a looping animation and then anim ...

  9. Unity中UGUI之Canvas属性解读版本二

    Canvas Render Modes(渲染模式) 1.在screen空间中渲染 2.在world空间中渲染 Screen Space-Overlay 在这个渲染模式中,UI元素将在场景的上面.如果场 ...

最新文章

  1. kuayu react_react跨域解决方案
  2. Jdom makes xml easy
  3. 一步一步深入理解Dijkstra算法
  4. 细粒度权限控制 linux,FGAC(细粒度访问控制)/VPD
  5. Spring Cloud微服务之Nacos服务发现(八)
  6. 米兔点读笔点读包_怎么用小达人点读笔点读斑马英语随材?
  7. (1)FPGA介绍(第1天)
  8. 文本文件上传漏洞[任意.绕过.解析]
  9. mysql客户端新建一个表_MySQL 建库、建用户及建表事项
  10. Android 黑色样式menu
  11. 基于采样的路径规划方法
  12. 资源搜索神器 海量精品资源教程 大大啦啦资源神器
  13. Java的责任链模式
  14. ROS(ROUTEROS) 端口映射
  15. 2022自动驾驶商业化落地,主流将是什么?丨曼孚科技
  16. 路飞学城mysql练习
  17. python怎么暂停运行_如何让python程序暂停?
  18. Win10 解决CSDN、阿里云国内站、小米商城国内站等国内网站打不开的问题(超详细教程)
  19. CGCS2000国家大地坐标系参数
  20. linkerd1.6 local安装方式文档

热门文章

  1. 【摘】把vmware的虚拟机硬盘vmdk文件分割成多个2G文件
  2. Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
  3. html设置边框dw,Dreamweaver表格边框设置的css语法大全
  4. elk如何同步到es 方案靠谱吗_架构设计:微服务架构如何划分?这6个标准原则让你一目了然...
  5. android iot代码设计,一个简单好用的Android Tab 设计与实现
  6. qchart画完以后删除_身为宫廷画师,郎世宁为何要偷偷画乾隆的侧身像?跟一次惩罚有关...
  7. zipkin使用_我的Spring Cloud(十):Zipkin 服务跟踪
  8. 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
  9. 喜欢初音未来的桌面壁纸看过来
  10. 图片素材网站|找素材、提升审美力就靠它了!