可以说旋转很让人恼火,这个不怪我们,因为人的大脑在虚无的3D空间中,很自然会被绕晕的。这是人的大脑的极限所致,不用自责。

下面我们就介绍下unity中如何进行旋转。

1、让物体绕着自身的轴旋转

我们要让上图的立方体,绕着自身的x轴旋转指定的角度,如下:

public class NewBehaviourScript : MonoBehaviour
{public bool isWorld;public GameObject cube;public float angle;public void Start(){Quaternion q = Quaternion.AngleAxis(angle, cube.transform.right);if(isWorld){cube.transform.rotation = q * cube.transform.rotation;}else{cube.transform.rotation = cube.transform.rotation * q;}Debug.LogError(cube.transform.forward.normalized);}
}

如果是绕着世界旋转则要使用新的四元数在左边乘以现有的四元数;
如果是绕着本地旋转则要使用新的四元数在右边乘以现有的四元数;

这个很重要,因为在后面的摄像机跟随角色的时候,会用到。

2、让物体绕着其他物体的某个轴进行旋转,这个都是用世界

public class NewBehaviourScript : MonoBehaviour
{public bool isWorld;public GameObject cube;public GameObject target;public float angle;public void Update(){Quaternion q = Quaternion.AngleAxis(angle * Time.deltaTime, target.transform.right);cube.transform.rotation = q * cube.transform.rotation;}
}

总结,我们可以使用Quaternion.AngleAxis方法,得到一个四元数,它的第一个参数是旋转的角度,第二个参数是绕哪个轴进行旋转,可以是自身的轴,也可以是其他的轴,也可以是自己定义的轴。

然后用这个四元数左乘以物体当前的四元数,得到新的四元数,然后赋值给当前的transform即可。

3、使用Quaternion.Euler完成旋转

  cube.transform.rotation =  cube.transform.rotation * Quaternion.Euler(angle * Time.deltaTime, 0, 0);

上面代码的意思是,让物体绕着自身的x轴,每帧旋转angle * Time.deltaTime度数。

cube.transform.rotation =  Quaternion.Euler(angle * Time.deltaTime, 0, 0) * cube.transform.rotation;

上面代码的意思是,让物体绕着世界的x轴,每帧旋转angle * Time.deltaTime度数。

4、某个向量绕着某个点的,某个轴进行旋转

如图O’A,绕着O’O进行旋转,得到O’B,这个怎么实现。

首先构建一个绕某个轴进行旋转的四元数:
Quaternion.AngleAxis(30, target.transform.up);
然后构建一个向量O’A
posA-posO’
然后用计算得到旋转后的向量:Quaternion.AngleAxis(30, target.transform.up) * O’A
然后计算B的位置:Quaternion.AngleAxis(30, target.transform.up) * O’A + O’

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class NewBehaviourScript : MonoBehaviour
{public Transform A;public Transform B;public Transform O1;public Transform O2;public float angle;public void Update(){A.transform.LookAt(O1.transform);Quaternion q = Quaternion.AngleAxis(angle, A.transform.right);Vector3 dir = A.transform.position - O1.transform.position;dir = q * dir;B.transform.position = dir + O1.transform.position;Debug.DrawLine(O1.transform.position, A.transform.position);Debug.DrawLine(O1.transform.position, O2.transform.position);Debug.DrawLine(O1.transform.position, B.transform.position);}
}

unity中旋转的总结相关推荐

  1. Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解

    Gimbal Lock Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频.视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical syst ...

  2. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

    文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...

  3. unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转丨视角跟随丨固定视角

    视角跟随 本脚本为一个目标跟随 unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转 使用方法超级简单,对于一个资深的Ctrl+cv程序极为友好 不多讲解直接上代码 代码模块 public ...

  4. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  5. Unity中行星和恒星的旋转——Rotate和RotateAround

    Unity中的旋转--以行星环绕为例 实现效果 一.与之相关的两种旋转方式 1.Rotate 2.transform.RotateAround 二.行星案例的实现 Step1:我们先在场景中创建一个球 ...

  6. Unity中的旋转和矩阵操作

    Definition for Matrix4x4 is from unity                 Matrix4x4 matrix = new Matrix4x4();           ...

  7. Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转

    Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...

  8. Unity中刚体使用--坦克炮塔旋转

    当在Unity中导入一个Tank模型后,大部分的Tank模型都会有很多部分组成,比如包含底盘.履带.炮塔.炮等. 首先可以粗略的通过添加多个Box Collider分别给底盘.炮塔等部分,然后将rig ...

  9. unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  10. [转]解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

    在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面 ...

最新文章

  1. Linq基础知识小记二
  2. perl编程(基本语法 数据 类型)
  3. Linux及文件系统基本介绍
  4. 怎样去判断一个网站是不是伪静态网站
  5. 题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
  6. redisson 集合使用示例(RList、Rset、RMap)
  7. OpenGL Draw TransformFeedback 绘制变换反馈的实例
  8. centos7配置不开启浏览器执行基于python+selenium的功能自动化脚本
  9. 【2018.3.10】模拟赛之一-ssl2574Closest【深搜】
  10. mysql 排他,mysql 共享锁 排他锁 防插入锁
  11. oracle客户端更改字符集,oracle 服务器跟客户端字符集的查看和修改
  12. 程序人生:我最真实的10年软件测试感悟...【建议收藏】
  13. 【SAE 部署 JavaWeb 项目报 404 错误】
  14. (转载)JavaScript中的原型和对象机制
  15. cad相对坐标快捷键_cad相对坐标怎么输入?CAD中输入西安80坐标绘图的教程
  16. Vmware 可用的激活码
  17. CentOS 7 - Securing OpenSSH(一)
  18. vue 强制清除浏览器缓存
  19. Flink Table和SQL中Table和DataStream的相互转换(fromDataStream、toChangelogStream、attachAsDataStream)
  20. 211西北大学,成立国家超级计算西北大学分中心!

热门文章

  1. 全景图(三):在Unity3D上实现360°球面投影
  2. Acwing 1402. 星空之夜(搜索+哈希)
  3. 5.13 利用图层的矢量蒙版打造浪漫情调 [原创Ps教程]
  4. Air202学习 三 (模块串口使用)
  5. ESP8266 NonOS-SDK Web配网
  6. 程序员心中的“女神”
  7. 前端基础知识总结 (三)
  8. 澳洲java待遇_2018年澳洲IT薪资一览,最新IT薪水Salary,给学IT的同学打一针鸡血...
  9. 腾讯云服务器安装redis、mysql
  10. [转]用Excel制作甘特图并管理项目