Unity中设置Transform的forward/up/right旋转异常问题
本文首发于洪流学堂微信公众号。
洪流学堂公众号回复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旋转异常问题相关推荐
- max模型导入到unity中设置
看到在unity中,导入3ds max的模型,需要转换模型的轴,可以看这篇文章http://blog.csdn.net/yongh701/article/details/77963676. 选择物体, ...
- 关于Unity中的transform组件(二)
在Scene视图中的蓝色网格,每一格默认是1米 一.沿着Z轴每秒移动10米 Transform cube_trans; void start(){ this.cube_trans=this.trans ...
- 在unity中设置多种怪物数据_Unity可编程渲染管线(SRP)系列(三)——光照(单通道 正向渲染)...
本文重点: 1.漫反射着色 2.支持方向光.点光源和聚光灯 3.每帧允许16个可见光源 4.每个对象最多计算四个像素光和四个顶点光 这是涵盖Unity可编写脚本的渲染管线的教程系列的第三部分.这次,我 ...
- 【100个 Unity实用技能】☀️ | Unity中设置 允许的最大帧数,锁定游戏的最大帧率(游戏锁帧)
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...
- Unity中的Transform Gizmo中的Pivot和Center
选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...
- Unity中设置屏幕常亮
Screen.sleepTimeout = SleepTimeout.NeverSleep; 转载于:https://www.cnblogs.com/AlanCheng/p/5531345.html
- Unity中 批量设置成 预制体
在unity 中 设置预制体时,一般情况下 是一个一个的拖拽 ,很方便. 但是,遇到需求是 制作大量的预支体时, 一个一个的拖拽,效率很低, 也很无聊.查找资料, 发现 是可以批量的制作预制体的.步骤 ...
- 蒙皮骨骼动画 unity_在Unity中沿航路点设置蒙皮网格动画
蒙皮骨骼动画 unity This post is a guide to importing a skinned mesh with a looping animation and then anim ...
- Unity中UGUI之Canvas属性解读版本二
Canvas Render Modes(渲染模式) 1.在screen空间中渲染 2.在world空间中渲染 Screen Space-Overlay 在这个渲染模式中,UI元素将在场景的上面.如果场 ...
最新文章
- kuayu react_react跨域解决方案
- Jdom makes xml easy
- 一步一步深入理解Dijkstra算法
- 细粒度权限控制 linux,FGAC(细粒度访问控制)/VPD
- Spring Cloud微服务之Nacos服务发现(八)
- 米兔点读笔点读包_怎么用小达人点读笔点读斑马英语随材?
- (1)FPGA介绍(第1天)
- 文本文件上传漏洞[任意.绕过.解析]
- mysql客户端新建一个表_MySQL 建库、建用户及建表事项
- Android 黑色样式menu
- 基于采样的路径规划方法
- 资源搜索神器 海量精品资源教程 大大啦啦资源神器
- Java的责任链模式
- ROS(ROUTEROS) 端口映射
- 2022自动驾驶商业化落地,主流将是什么?丨曼孚科技
- 路飞学城mysql练习
- python怎么暂停运行_如何让python程序暂停?
- Win10 解决CSDN、阿里云国内站、小米商城国内站等国内网站打不开的问题(超详细教程)
- CGCS2000国家大地坐标系参数
- linkerd1.6 local安装方式文档
热门文章
- 【摘】把vmware的虚拟机硬盘vmdk文件分割成多个2G文件
- Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
- html设置边框dw,Dreamweaver表格边框设置的css语法大全
- elk如何同步到es 方案靠谱吗_架构设计:微服务架构如何划分?这6个标准原则让你一目了然...
- android iot代码设计,一个简单好用的Android Tab 设计与实现
- qchart画完以后删除_身为宫廷画师,郎世宁为何要偷偷画乾隆的侧身像?跟一次惩罚有关...
- zipkin使用_我的Spring Cloud(十):Zipkin 服务跟踪
- 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
- 喜欢初音未来的桌面壁纸看过来
- 图片素材网站|找素材、提升审美力就靠它了!