Unity手势控制物体球形旋转
目的:当我想让物体绕Y轴旋转时,无论他当前的朝向都可以绕绝对Y轴转,同理X轴,Z轴.同时不可以有万向锁.
原理:当我们物体绕轴旋转时,其实是矩阵相乘,所以我们需要先算出当前要旋转角度的旋转矩阵,代码如下,原理线代
private Quaternion GetRotation(Vector3 rotateDeg){float angleZ = Mathf.Deg2Rad * (rotateDeg.z);Matrix4x4 rMatrixZ = new Matrix4x4();rMatrixZ.SetRow(0, new Vector4(Mathf.Cos(angleZ), -Mathf.Sin(angleZ), 0, 0));rMatrixZ.SetRow(1, new Vector4(Mathf.Sin(angleZ), Mathf.Cos(angleZ), 0, 0));rMatrixZ.SetRow(2, new Vector4(0, 0, 1, 0));rMatrixZ.SetRow(3, new Vector4(0, 0, 0, 1));float angleY = Mathf.Deg2Rad * (rotateDeg.y);Matrix4x4 rMatrixY = new Matrix4x4();rMatrixY.SetRow(0, new Vector4(Mathf.Cos(angleY), 0, Mathf.Sin(angleY), 0));rMatrixY.SetRow(1, new Vector4(0, 1, 0, 0));rMatrixY.SetRow(2, new Vector4(-Mathf.Sin(angleY), 0, Mathf.Cos(angleY), 0));rMatrixY.SetRow(3, new Vector4(0, 0, 0, 1));float angleX = Mathf.Deg2Rad * (rotateDeg.x);Matrix4x4 rMatrixX = new Matrix4x4();rMatrixX.SetRow(0, new Vector4(1, 0, 0, 0));rMatrixX.SetRow(1, new Vector4(0, Mathf.Cos(angleX), -Mathf.Sin(angleX), 0));rMatrixX.SetRow(2, new Vector4(0, Mathf.Sin(angleX), Mathf.Cos(angleX), 0));rMatrixX.SetRow(3, new Vector4(0, 0, 0, 1));Matrix4x4 total = rMatrixY * rMatrixX * rMatrixZ; //从右往左return total.rotation;}
其中在Unity中我们的旋转时依赖四元数,所以提出四元数
四元数的旋转时使用乘法,所以使用乘法获取最终角度,左右顺序需要注意,很好理解,矩阵的顺序不能换四元数也类似,其中我们是 角度变化矩阵相对于世界矩阵,物体自身矩阵为localToWorld,所以如下顺序
transform.rotation = GetRotation(angle) * transform.rotation;
效果:
PS: 记录下自己傻逼的瞬间: 这就得了,不用旋转矩阵,脑子轴了,当然内部算法为,四元数转矩阵后,矩阵相乘得到新的矩阵,转四元数,依旧是矩阵
transform.rotation = Quaternion.Euler(angle) * transform.rotation;
Unity手势控制物体球形旋转相关推荐
- Unity鼠标控制物体360°旋转和点击移动
一:操作 创建一个游戏对象(方块) 把代码挂在摄像机上 二:代码 public Camera ca; public GameObject transformObj; Ray ray; ...
- Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...
- 【虚拟仿真】Unity3D中实现控制物体的旋转、移动、缩放
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...
- Unity实现安卓端手势控制摄像机的旋转和缩放
说明 上一篇记录了PC端鼠标控制摄像机的移动和缩放,这一篇写的是在安卓机上实现手势控制摄像机围绕一个物体进行旋转和缩放,两篇的代码逻辑基本一样只是输入检测有区别,这里我是分开记录,没有整合[Uni ...
- Unity Hololens开发控制物体移动旋转缩放
先说在unity中的按键操作 环顾四周:鼠标右键+移动鼠标 移动物体(右手):空格+移动鼠标+鼠标左键 移动物体(左手):shift+移动鼠标+鼠标左键 右手旋转:ctrl+空格+移动鼠标+鼠标左键 ...
- Unity 用于控制摄像机的旋转、远近
/// <summary> /// 用于控制摄像机的旋转.远近 /// </summary> public class CameraTransform : MonoBehavi ...
- unity脚本 --- 控制物体(游戏对象)移动
一.键盘WSAD控制移动 void Update() {float horizontal = Input.GetAxis("Horizontal");float vertical ...
- Unity鼠标控制物体拖拽旋转
using System.Collections; using System.Collections.Generic; using UnityEngine; public enum ShowType ...
- 002-实现Unity3d中触摸屏幕控制物体的旋转和缩放 代码实现
1.直接帮到物体的身上就可以了 using UnityEngine; using System.Collections; using System.IO; public class hehe : Mo ...
最新文章
- 2019年,我终于知道86版西游记到底好在哪里了
- python3与python2的编码问题
- JavaEE 的基本实现
- Python常用正则表达式总结
- element el-popover 使用v-if 控制显示/隐藏,当条件变化时,里面有部分内容无法显示
- 【51单片机快速入门指南】2.3:GPIO读取矩阵键盘 8个IO读16键
- VMware发布面向未来的员工工作解决方案,满足分散办公需求
- 基姆拉尔森计算公式(算任意日期是星期几)
- java十进制转换成二进制数
- dom操作节点之常用方法
- python获取国内IP地址合集下发至网络设备
- 记一次抓包和破解App接口
- div+css+js实现深圳交互地图
- php追加append,PHP ArrayObject append()用法及代码示例
- 安微六安二中2021高考成绩查询,喜报!六安一中、六安二中、毛坦厂中学......高考“成绩单”出炉...
- 汇编程序——根据开关状态在7段数码管上显示数字或者字符
- 服务器2400系列和2600系列,英特尔至强处理器2400系列和2600系列有什么不同
- 剪刀石头布(你出一个版)
- OpenCV 安卓编程示例:1~6 全
- opencv学习日记——CV_8UC1 含义
热门文章
- 几句话弄清楚Java参数传值还是传引用
- java常用的jar包_Java中常用的jar包有哪些
- JSP图书销售系统JSP网上书店商城JSP网上书店JSP图书在线销售系统JSP二手图书商城系统
- 新手必看的ACL基本访问控制列表及高级访问控制列表
- 驱动人生病毒vschost.exe的排查流程(1)
- 渗透测试面试问题2021版,内含大量渗透技巧
- 2019个税新玩法,写个代码对比
- 利用python编写祝福短信_python实现祝福弹窗效果
- 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现
- 写在毕业季:师兄告诉你如何找工作