unity3d中的Quaternion.LookRotation
android开发范例中的第二个粒子,是摇杆操作游戏,模式类似于“迷你高尔”,僵尸包围类型的设计游戏。
其中让我注意到这个函数的使用非常特别:Quaternion.LookRotation。
游戏针对两个平台做了输入配置。
在pc平台上控制人物移动用正常的上下左右按键控制,然而人物的旋转就变成了鼠标位置。
正常情况我们希望东西能够根据指定目标方向移动其实用lookat这个函数就可以了。但这个地方用的方法原比lookat来的更加省事儿。
看看他是怎么获得这个角度的:
1
2
3
4
5
6
7
8
9
10
|
//Find the center of the screen tempVector2 = new Vector3(Screen.width * 0.5f,0,Screen.height * 0.5f); //Get mouse position tempVector = Input.mousePosition; //Set tempVector z to tempVector.y tempVector.z = tempVector.y; //Set tempVector y to 0 tempVector.y = 0; //Set lookDir to tempVector - tempVector2 lookDir = tempVector - tempVector2; |
是的,先得到屏幕中央坐标,然后把鼠标坐标(由于是俯视类游戏,y轴坐标变为z轴)减去中央坐标,接着:
1
2
|
//Rotate player transform.rotation = Quaternion.LookRotation(lookDir); |
结束了,目标旋转了,而且通过测试,可以发现无论是否是俯视类游戏都可以正常旋转。回过头来想想自己当初使用的方法:
1.获得鼠标位置,向地面发射射线。
2.将射线和地面的碰撞坐标记录。
3.通过lookat旋转。
对于崎岖的山地我的方法似乎就显得可笑了,呵呵。
Quaternion.LookRotation似乎是用类似于向量的方法,在确定圆心位置的情况下计算出相应位移所形成的角度。
有一位前辈的博客是这样描述的:http://blog.csdn.net/janpylx/article/details/7776465
事实上我看不懂,呵呵。
接着来看另一处使用这个函数的地方,那就是在手机平台时使用摇杆,根据摇杆的方向旋转目标的方向。这里用的是官方提供的joystick脚本,js写的。看看它是如何获取并旋转的。
1
2
3
4
5
6
7
8
|
//Get right joystick x position float lX = rightJoystick.GetComponent<Joystick>().position.x; //Get right joystick y position float lY = rightJoystick.GetComponent<Joystick>().position.y; //Set lookDir x to joystick x position and dir z joystick y position lookDir = new Vector3(lX,0,lY); //Rotate player transform.rotation = Quaternion.LookRotation(lookDir); |
我自己一开始没有看明白,为什么就是直接调用position的位置就可以旋转了,知道我看了joystick的代码:
1
2
3
|
// For a touchpad, let's just set the position directly based on distance from initial touchdown position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 ); position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 ); |
是的,他用的是同样的原理,圆点坐标和当前坐标的差值。
所以关于Quaternion.LookRotation我的理解是旋转两个指定坐标间形成的夹角。
unity3d中的Quaternion.LookRotation的更多相关文章
- Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会
在unity3d中,用四元数来表示旋转,四元数英文名叫quaternion . 比如 transform.rotation 就是一个四元数,其由四个部分组成 Quaternion = (xi + yj ...
- Unity3D_(API)Quaternion四元数中的Quaternion.LookRotation()
四元数百度百科: 传送门 四元数官方文档: 传送门 欧拉旋转.四元数.矩阵旋转之间的差异: 传送门 四元数转换为欧拉角eulerAngles 官方文档: 传送门 欧拉角转换为四元数Euler 官方文档 ...
- 关于Unity3d的Quaternion.LookRotation的学习
首先,创建两个cube GameObject物件.Origin作为原点参考.Player是我们要实验的物件.如下图所示: 创建一个脚本Quat.cs,赋给Palyer cube.脚本如下: publi ...
- unity3d的四元数 Quaternion
原地址:http://www.cnblogs.com/88999660/archive/2013/04/02/2995074.html 今天准备学习和研究下unity3d的四元数 Quaternion ...
- Unity3D中的高级摄像机跟随
在Unity3D中,先调整MainCamera在场景中的位置,然后把脚本挂到MainCamera上,摄像机跟随分为简单的摄像机跟随和高级摄像机跟随. 简单摄像机跟随: public class Cam ...
- Unity3D - 详解Quaternion类(二)
OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...
- 学习和研究下unity3d的四元数 Quaternion
学习和研究下unity3d的四元数 Quaternion 今天准备学习和研究下unity3d的四元数 Quaternion 四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示 ...
- Unity3D中的常用方法
备注:文中所使用的this均指脚本所依附的对象 1.移动(用Translate方法进行移动) ; //移动速度 this.transform.Translate(Vector3.down * Time ...
- Unity3D中的弹道和移动目标提前量计算
弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法. 讨论的前提是,假设目标 ...
随机推荐
- Docker 基础知识 - 使用 tmpfs 挂载(tmpfs mounts)管理应用程序数据
卷(volumes) 和 绑定挂载(bind mounts) 允许您在主机和容器之间共享文件,这样即使在容器停止后也可以持久存储数据. 如果在 Linux 上运行 Docker,那么还有第三种选择:t ...
- 虚拟机安装Centos(VirtulBox)
阿里云服务器本月底到期了,之前自己犹豫不觉没上279元3年服务器的车,但是又要用linux,所以有了这篇文章. VirtulBox 一款开源的虚拟化主机应用,可以实现一台电脑上运行多个操作系统(Lin ...
- 用Python一键生成炫酷九宫格图片,火了朋友圈
- 2020年最新的过某宝滑块验证技术,Python大牛轻松搞定技术难题
致谢: Charles未晞 Charles的皮卡丘 提供解决思路,此文实为借鉴. 前言: 利用selenium模拟登录淘宝,外界传言这个确实很难过,有各种轨迹检测. 但是我没想到淘宝的滑块验证码这么容 ...
- Go 中的动态作用域变量
这是一个 API 设计的思想实验,它从典型的 Go 单元测试惯用形式开始: func TestOpenFile(t *testing.T) { f, err := os.Open("notf ...
- Linux快速搭建C/C++开发环境
导读:越来越多的程序员在Linux下进行C/C++的开发.本文以CentOS 7为例,教你快速搭建一个vi + gcc/g++ + Make + valgrind的开发环境. 本文字数:1500,阅读 ...
- 2020-05-25:MQ应用场景、Kafka和rabbit区别?kafka为什么支撑高并发? 来自
福哥答案2020-05-25: 应用场景:解耦.异步.削峰.区别如下:特性 ActiveMQ RabbitMQ RocketMQ Kafka单机吞吐量 万级,比 RocketMQ.Kafka 低一个数 ...
- JavaScript 手写setTimeout
let setTimeout = (sec, num) => { // 初始当前时间 const now = new Date().getTime() let flag = true let c ...
- MySql安装后在服务管理器里边找不到MySql服务项的解决办法(win10)
问题描述: 成功安装MySql后,使用mysql的时候,在CMD中输入net start mysql,提示服务名无效,查看服务列表也找不到mysql服务. 解决办法: 首先用管理员身份打开CMD命令, ...
- autotools使用
autotools制作makefile 下面以hello.c来说明生成makefile的过程. 基本步骤如下: 1)autoscan命令生成configure.scan文件,重命名configure. ...