unity3d物体移动到指定旋转

推荐这篇日记的豆列
······> Unity3D 一起代码实现一个物体保持面向另一个物体(旋转)
Unity3D 一起代码实现一个物体保持面向另一个物体(旋转)
sunguanyi & &
发布时间: & &
浏览:75 & &
回复:0 & &
悬赏:0.0希赛币
Unity3D 一行代码实现一个物体保持面向另一个物体(旋转)  myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
  myTransform面向target。
  今天准备学习和研究下unity3d的四元数 Quaternion
四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示四个值。
四元数是最简单的超复数。复数是由实数加上元素 i 组成,其中i^2 = -1 \,。 相似地,四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 \, 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi + cj + dk \,。
具体的四元数知识可从百度、维基等网站了解。
现在只说说在unity3D中如何使用Quaternion来表达物体的旋转。
基本的旋转我们可以用脚本内置旋转函数transform.Rotate()来实现。&
function Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self) : void
但是当我们希望对旋转角度进行一些计算的时候,就要用到四元数Quaternion了。我对高等数学来说就菜鸟一个,只能用最朴素的方法看效果了。
Quaternion的变量比较少也没什么可说的,大家一看都明白。唯一要说的就是x\y\z\w的取值范围是[-1,1],物体并不是旋转一周就所有数值回归初始值,而是两周。
初始值: (0,0,0,1)
沿着y轴旋转:180°(0,1,0,0) 360°(0,0,0,-1)540°(0,-1,0,0) 720°(0,0,0,1)&
沿着x轴旋转:180°(-1,0,0,0) 360°(0,0,0,-1)540°(1,0,0,0) 720°(0,0,0,1)
无旋转的写法是Quaternion.identify
现在开始研究Quaternion的函数都有什么用。
1)function ToAngleAxis (out angle : float, out axis : Vector3) : void
Description
Converts a rotation to angle-axis representation
这个函数的作用就是返回物体的旋转角度(物体的z轴和世界坐标z轴的夹角)和三维旋转轴的向量到变量out angle 和out axis
var a=0.0;
var b=Vector3.
transform.rotation.ToAngleAxis(a,b);
输入:transform.localEularAngles=(0,0,0);
输出: a=0, b=(1,0,0);
输入:transform.localEularAngles=(0,90,0);
输出:a=90, b=(0,1,0);
输入:transform.localEularAngles=(270,0,0);
输出:a=90, b=(-1,0,0)
2)function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
Description
Creates a rotation which rotates from fromDirection to toDirection.
这个函数的作用是把物体的fromDirection旋转到toDirection
var a:Vector3;
var b:Vector3;
var headUpDir:Vector3;
q.SetFromToRotation(a,b);
transform.rotation=q;
headUpDir=transform.TransformDirection(Vector3.Forward);
输入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z轴朝向y轴
输出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)&
输入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z轴朝向x轴
输出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)&
输入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y轴朝向x轴
输出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)&
3)function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
Description
Creates a rotation that looks along forward with the the head upwards along upwards
Logs an error if the forward direction is zero.
这个函数建立一个旋转使z轴朝向view &y轴朝向up。这个功能让我想起了Maya里的一种摄像机lol,大家自己玩好了,很有趣。
var obj1: T
var obj2: T
q.SetLookRotation(obj1.position, obj2.position);
transform.rotation=q;
然后大家拖动obj1和obj2就可以看到物体永远保持z轴朝向obj1,并且以obj2的位置来保持y轴的倾斜度。
傻逗我玩了半天 哈哈^^ 这个功能挺实用的。
4)function ToString () : string
Description
Returns a nicely formatted string of the Quaternion
这个一般用不着吧?看不懂的一边查字典去~
Class Functions
1)四元数乘法 *
建议非特别了解的人群就不要用了。
作用很简单,c=a*b (c,a,b∈Quaternion)可以理解为 ∠c=∠a+∠b
但是a*b 和b*a效果不一样的。
&2) == 和 !=
3)static function Dot (a : Quaternion, b : Quaternion) : float
Description
The dot product between two rotations
点积,返回一个float. 感觉用处不大。Vector3.Angle()比较常用。
4)static function AngleAxis (angle : float, axis : Vector3) : Quaternion
Description
Creates a rotation which rotates angle degrees around axis.
物体沿指定轴向axis旋转角度angle, 很实用的一个函数也是。
var obj1: T
var obj2: T
//物体沿obj2的z轴旋转,角度等于obj1的z轴。
q=Quaternion.AngleAxis(obj1.localEularAngle.z, obj2.TransformDirection(Vector3.forward));
transform.rotation=q;
5)static function FromToRotation (fromDirection : Vector3, toDirection : Vector3) : Quaternion
Description
Creates a rotation which rotates from fromDirection to toDirection.
Usually you use this to rotate a transform so that one of its axes eg. the y-axis - follows a target direction toDirection in world space.
跟SetFromToRotation差不多,区别是可以返回一个Quaternion。通常用来让transform的一个轴向(例如 y轴)与toDirection在世界坐标中同步。
6)static function LookRotation (forward : Vector3, upwards : Vector3 = Vector3.up) : Quaternion
Description
Creates a rotation that looks along forward with the the head upwards along upwards
Logs an error if the forward direction is zero.
跟SetLootRotation差不多,区别是可以返回一个Quaternion。
7)static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
Description
Spherically interpolates from towards to by t.
从from 转换到to,移动距离为t。也是很常用的一个函数,用法比较多,个人感觉比较难控制。当两个quaternion接近时,转换的速度会比较慢。
var obj1: T
var t=0.1;
//让物体旋转到与obj1相同的方向
q=Quaternion.Slerp(transform.rotation, obj1.rotation,t);
transform.rotation=q;
根据我个人推测,可能t 代表的是from 和to 之间距离的比例。为此我做了实验并证明了这一点即:
q=Quaternion.Slerp(a,b,t);
q,a,b∈Quaternion
q=a+(b-a)*t
并且t最大有效范围为0~1
var obj1: T
var obj2:Transform;
var t=0.1;
//让物体obj1和obj2 朝向不同的方向,然后改变t
q=Quaternion.Slerp(obj1.rotation, obj2.rotation,t);
transform.rotation=q;
t+=Input.GetAxis(&horizontal&)*0.1*Time.deltaTime;
7)static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
Description
Interpolates from towards to by t and normalizes the result afterwards.
This is faster than Slerp but looks worse if the rotations are far apart
跟Slerp相似,且比Slerp快,.但是如果旋转角度相距很远则会看起来很差。
8)static function Inverse (rotation : Quaternion) : Quaternion
Description
Returns the Inverse of rotation.
返回与rotation相反的方向
9)static function Angle (a : Quaternion, b : Quaternion) : float
Description
Returns the angle in degrees between two rotations a and b.
计算两个旋转之间的夹角。跟Vector3.Angle() 作用一样。
10)static function Euler (x : float, y : float, z : float) : Quaternion
Description
Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis (in that order).
把旋转角度变成对应的Quaternion
以上就是Quaternion的所有函数了。
关于应用,就说一个,其他的有需要再补充。
Slerp 函数是非常常用的一个函数,用来产生旋转。
static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
对于新手来说,最难的莫过于如何用它产生一个匀速的旋转。如果想用它产生匀速转动,最简单的办法就是把form和to固定,然后匀速增加t
var obj1: T
var obj2:Transform;
var speed:
var t=0.1;
q=Quaternion.Slerp(obj1.rotation, obj2.rotation,t);
transform.rotation=q;
t+=Time.deltaT
但是这并不能解决所有情况。 很多时候from 和to都不是固定的,而且上一个脚本也不能保证所有角度下的旋转速度一致。所以我写了这个脚本来保证可以应付大多数情况。
var target: T
var rotateSpeed=30.0;
var wantedRotation=Quaternion.FromToRotation(transform.position,target.position);
t=rotateSpeed/Quaternion.Angle(transform.rotation,wantedRotation)*Time.deltaT
q=Quaternion.Slerp(transform.rotation, target.rotation,t);
transform.rotation=q;
这个脚本可以保证物体的旋转速度永远是rotateSpeed。
第七行用旋转速度除以两者之间的夹角得到一个比例。
如果自身坐标和目标之间的夹角是X度,我们想以s=30度每秒的速度旋转到目标的方向,则每秒旋转的角度的比例为s/X。再乘以每次旋转的时间Time.deltaTime我们就得到了用来匀速旋转的t值
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&君,已阅读到文档的结尾了呢~~
宝典Unity3d中最简单物体的旋转移动
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
宝典Unity3d中最简单物体的旋转移动
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之脚本实现模型的平移与旋转(六)
Unity3D研究院之脚本实现模型的平移与旋转(六)
围观84200次
编辑日期: 字体:
这一章MOMO带大家讨论一下Unity3D中使用的脚本,脚本的最大特点就是用少量的代码实现繁多的功能,避免大量的代码。Untiy3D这一块可以使用脚本做很多东西,那么我们开始学习脚本吧。
有关Unity3D 脚本的API所有文档盆友们都可以去这里查阅。
官方API 文档:
Scripting inside Unity consists of attaching custom script objects called behaviours to game objects. Different functions inside the script objects are called on certain events. The most used ones being the following:
This function is called before rendering a frame. This is where most game behaviour code goes, except physics code.
FixedUpdate:
This function is called once every physics time step. This is the place to do physics-based game behaviour.
Code outside any function:
Code outside functions is run when the object is loaded. This can be used to initialise the state of the script.
Note: Sections of this document assume you are using Javascript, but see Writing scripts in C# & Boo for information about how to use C# or Boo scripts.
大概意思是介绍三个重要的脚本函数
Update:这个函数在渲染帧之前被调用,大部分的游戏行为代码都在这里执行,除 物理代码。
FixedUpdate:这个函数在每进行一次物理时间步调时被调用,它是基于物理的游戏行为。
Code outside any function:这类函数在对象加载时被调用,它可以用来脚本的初始化工作。
本章我们着重讨论Update 这个函数,创建脚本与绑定脚本的方法在第二章中已经介绍过了不会的盆友请去那里阅读。虽然官方推荐脚本使用JavaScript编辑,但是其实C#更符合Unity3D的编程思想,推荐新人先使用JavaScript,然后在学习C#,因为JavaScript更容易上手一些。
在三维世界中创建两个矩形,然后在添加两个脚本分别绑定在这两个箱子上,脚本的名称暂时命名为 js0 、js1。
在Project 页面中打开刚刚创建的js0,发现Unity3D 已经将Update 函数添加在脚本中了。
模型的移动
Translate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴移动的单位距离。
123456789101112
function Update () {&//模型x轴,移动一个单位transform.Translate(1,0,0);&//模型y轴,移动一个单位transform.Translate(0,1,0);&//模型z轴,移动一个单位transform.Translate(0,0,1);&}
执行代码发现参数为1速度居然移动的着么快,怎么能修改移动的速度呢?
Time.deltaTime:标示上一次调用Update一秒为标示每帧执行所消耗的时间。
有了这个参数,我们就可以根据它修改方向移动的速度了。
1234567891011
function Update () {&&&&&//设置移动的范围&&&&var translation : float = Time.deltaTime * 10;&&&&&//移动的方向&&&&transform.Translate (translation, 0, 0);&&&&transform.Translate (0, translation, 0);&&&&transform.Translate (0, 0, translation);&}
模型的平移可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成摄像机。那么模型将以相对与摄像机进行移动。
123456789101112131415
function Update () {&&&&&//设置移动范围&&&&var translation : float = Time.deltaTime * 10;& //相对于摄像机,模型向右移动。 transform.Translate(Vector3.right * translation, Camera.main.transform);& // 相对于摄像机,模型向上移动。 transform.Translate(Vector3.up * translation, Camera.main.transform);& // 相对于摄像机,模型向左移动。 transform.Translate(Vector3.left * translation, Camera.main.transform);& }
模型的旋转
Rotate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴旋转的单位距离。
1234567891011
function Update () {&&& //以模型X轴旋转,单位为2.&& transform.Rotate(2, 0, 0);&&& //以模型Y轴旋转,单位为2.&& transform.Rotate(0, 2, 0);&&& //以模型Z轴旋转,单位为2.&& transform.Rotate(0, 0, 2);}
模型的旋转可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成3D世界。那么模型将以相对与整个3D世界进行旋转。
12345678910111213141516
function Update () {&&& //设置旋转的范围&&&&var rotate : float = Time.deltaTime * 100;&&&&&//旋转的方向&&&&&//相对于世界坐标中心向右旋转物体&&&&transform.Rotate(Vector3.right * rotate, Space.World);&&&&& //相对于世界坐标中心向上旋转物体&&&&transform.Rotate(Vector3.up * rotate, Space.World);&&&&& //相对于世界坐标中心向左旋转物体&&&&transform.Rotate(Vector3.left * rotate, Space.World);}
如下图所示,给出一个小例子,在脚本中移动箱子的坐标,在屏幕中记录模型移动的位置,并且显示在游戏视图中。效果很不错吧,嘻嘻~~
123456789101112131415161718192021222324252627282930313233343536
//X轴移动位置var posX : float;//Y轴移动位置var posY : float;//Z轴移动位置var posZ : float;&function Update () {&&&//设置移动的范围&&&&var x : float = Time.deltaTime * 10;&&&&var y : float = Time.deltaTime * 8;&&&&var z : float = Time.deltaTime * 5;&&&&&//移动的方向X轴&&&&transform.Translate (x, 0, 0);&&&&&//移动的方向Y轴&&&&transform.Translate (0, y, 0);&&&&//移动的方向Z轴&&&&transform.Translate (0, 0, z);&&&&&//赋值计算模型在三维坐标系中的位置&&&& posX += x; &&&& posY += y; &&&& posZ += z; }&function OnGUI () {&&&&&//将坐标信息显示在3D屏幕中&&GUI.Label(Rect(50, 100,200,20),"x pos is" + posX +"float");&&&&GUI.Label(Rect(50, 120,200,20),"y pos is" + posY +"float");&&&&GUI.Label(Rect(50, 140,200,20),"z pos is" + posZ +"float");&&&}
Unity3D 的世界中脚本还可以做很多事情,以后我在慢慢向各位道来~ 欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!8273人阅读
Unity3D(17)
把脚本拖动物体上面
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:157840次
积分:1933
积分:1933
排名:第19075名
原创:28篇
转载:74篇
评论:10条
(1)(2)(1)(6)(1)(1)(2)(1)(1)(2)(1)(2)(3)(8)(5)(14)(2)(2)(1)(35)(16)

我要回帖

更多关于 3d物体展示unity 的文章

 

随机推荐