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

时间: 2024-11-08 18:16:39

unity3d中的Quaternion.LookRotation的相关文章

Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会

在unity3d中,用四元数来表示旋转,四元数英文名叫quaternion . 比如 transform.rotation 就是一个四元数,其由四个部分组成 Quaternion = (xi + yj + zk + w ) = (x,y,z,w) 1.  http://en.wikipedia.org/wiki/Quaternion  有四元数的定义     2.  http://en.wikipedia.org/wiki/Quaternions_%26_spatial_rotation   有

Unity3D_(API)Quaternion四元数中的Quaternion.LookRotation()

四元数百度百科: 传送门 四元数官方文档: 传送门 欧拉旋转.四元数.矩阵旋转之间的差异: 传送门 四元数转换为欧拉角eulerAngles 官方文档: 传送门 欧拉角转换为四元数Euler 官方文档: 传送门 Quaternion.LookRotation 官方文档:传送门 LookRotation()根据对局部坐标轴的描述, 构造对应的代表旋转程度的四元数 一.Transform中四元数和欧拉角 using System.Collections; using System.Collectio

Unity3D - 详解Quaternion类(二)

OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler方法.FromToRotation方法.Inverse方法.Lerp方法.LookRotation方法.RotateToWards方法和Slerp方法.关于静态的方法的使用就是直接用类名调用其静态方法,例如Quaternion.Angle(q1,q2);下面对这些静态方法做下分析. 1.Angle方

Unity3D中的线性插值Lerp()函数解析

转自:http://www.aichengxu.com/view/2446604 在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: 1.Material.Lerp 插值 function Lerp(start : Material, end : Material, t : float) : void 在两个材质之间插值 2.Vector2.Lerp 插值 static functionLer

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Windows系统Unity3D中的快捷键

[狗刨学习网] Windows系统Unity3D中的快捷键[td] 组合键 键 功能 File 文件 Ctrl   N New Scene 新建场景 Ctrl   O Open Scene 打开场景 Ctrl   S Save Scene 保存 Ctrl Shift S Save Scene as 保存场景为 Ctrl Shift B Build Settings... 编译设置... Ctrl   B Build and run 编译并运行 Edit 编辑 Ctrl   Z Undo 撤消 C

Unity3D中的Coroutine详解

Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutine程序执行流程怎么那么奇怪? unity中的coroutine原理是什么,怎么实现的? 使用unity的coroutine需要注意什么问题? 一.yield的在几种语言中的程序执行特性: Lua中的yield是使得协同函数运行->挂起并且传递参数给resume.resume使得协同函数挂起->运行

Unity3D中定时器的使用

源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中一个人人皆知的定时器方法,每帧都在调用,那还有其他什么定时器的方法呢,这里介绍一下. 1.Invoke(string methodName,float time) 在一定时间调用methodName函数 1 2 3 4 5 6 7 8 9 10 11 12 13 using UnityEngine;