Unity 3Dpc触摸屏禁止左右滑动,单指左右滑动360°旋转物体,上线旋转限制在60°之内,欧拉选转后还会恢复原来的角度

关于角度旋转限制的问题【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:86,751贴子:
关于角度旋转限制的问题收藏
求解该如何实现炮管的纵向旋转俯仰角的限制,我是个程序菜鸟,请问用vertical该如何实现?var verticalSpeed:float=0;function Update(){var v:float=-verticalSpeed*Input.GetAxis("Mouse Y");if(v&20) v=20;if(v&-10) v=-10;transform.Rotate(v,0,0);}这个不行,该怎么改
@mayaxiaoan@邪恶的PS
这种旋转不能用Rotate的
貌似应该是transform.localEulerAngles=new Vector3(v,0,0);吧另外verticalSpeed=0,那v不就一直等于0。这样应该没效果吧
如果是用localEulerAngles的话,也许是角度范围的问题,程序貌似不考虑负的度数,如果0度-1,会自动变成359度,也许是这样吧
v=5*Input.GetAxis ("Mouse Y");//如果加上差值,效果会更好一点。v1=Mathf.Lerp (v1,v,Time.deltaTime);//炮口的角度就用v1的值代替transform.localEulerAngles+=new Vector3(v1,0,0);if(transform.localEulerAngles.x&20&&transform.localEulerAngles.x&180){transform.localEulerAngles=new Vector3(20,0,0);}if(transform.localEulerAngles.x&350&&transform.localEulerAngles.x&180){transform.localEulerAngles=new Vector3(350,0,0);}貌似是这样
告诉楼主一个噩耗!
这得用 “欧拉角”这种恶心的玩意儿来解决。楼主不哭
目测楼主看到这个视频 会想问我要脚本的
我来装个逼!!那个叫俯仰角!
「猎聘网」互联网名企招聘,年薪30万起工作,「0加班」 互联网行业垂直招聘网
我靠又看到这个帖子了,话说我虽然基本解决了旋转问题,但是旋转角度限制TM不会啊
限制旋转角度。。。。这种我都是直接调用mouselook脚本,有现成的不用我又不傻
angle += state.ThumbSticks.Left.Y * 25.0f * Time.deltaT//俯仰角
var kk = Mathf.Clamp(angle, -30, 30);
Quaternion _kk = new Quaternion();
_kk = Quaternion.AngleAxis(kk, Vector3.left);//上下旋转
angle2 += state.ThumbSticks.Left.X * 25.0f * Time.deltaT//俯仰角
Quaternion _kk2 = new Quaternion();
_kk2 = Quaternion.AngleAxis(angle2, Vector3.up);//左右旋转
var gg = _kk * originR
My.transform.localRotation =
挺厉害的, 大神能分享代码呢
登录百度帐号没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!untiy3d&Euler&和&Quatertion(在unity中用于处理旋转和方向)
Rotation and Orientation in
最直观的翻译就是unity中的旋转和方向的问题:
3D应用中的旋转通常以两种方式之一表示,即四元素或欧拉角。每个都有自己的用途
和缺点。Unity在内部使用四元素,但在inspector面板中显示等效的欧拉角的值,以方便你编辑。
The Difference Between Euler
Angles and Quaternions
Euler Angles
欧拉角具有更简单的表示,即依次应用的X,Y和Z的三个角度值。
为了将欧拉旋转应用于特定对象,每个旋转值依次应用为围绕其对应轴的旋转。
好处:欧拉角有一个直观的“人类可读”格式,由三个角度组成。
好处:欧拉角可以表示从一个方向到另一个方向通过大于180度的转弯的旋转
限制:欧拉角遭受Gimbal
Lock (云台锁)。当依次应用三个旋转时,第一或第二旋转可能导致第三轴指向与先前轴中的一个相同的方向。
这意味着已经失去了“自由度”,因为第三旋转值不能围绕唯一轴应用。
Quaternions
四元数可以用于表示对象的方向或旋转。这个表示在内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们。除非你特别有兴趣深入研究四元数学,你只需要知道四元数表示三维空间中的旋转,你通常不需要知道或修改x,y和z属性。
就像矢量可以表示位置或方向(其中方向是从原点测量)相同的方式,四元数可以表示取向或旋转
- 其中旋转从旋转“origin”或“Identity“。因为旋转是以这种方式测量的
- 从一个方向到另一个方向
- 四元数不能表示超过180度的旋转。
好处:四元旋转不会受到Gimbal
Lock(云台锁)的影响。
限制:单个四元数不能表示在任何方向上超过180度的旋转。
限制:四元数的数字表示不是直观可理解的。
在Unity中,所有游戏对象旋转在内部存储为四元数,因为利大于弊。
然而,在Transform
Inspector中,我们使用欧拉角显示旋转,因为这更容易理解和编辑。
输入到检查器中用于旋转游戏对象的新值被“底层”转换为对象的新的四元旋转值。
一个游戏对象的旋转被显示和编辑在inspector中用欧拉角,但在内部存储为一个
作为副作用,在检查器中可以为游戏对象的旋转输入例如X:0,Y:365,Z:0的值。
&这是一个不可能表示为四元数的值,因此当您按下Play时,您将看到对象的旋转值更改为X:0,Y:5,Z:0(或那里)。
&这是因为旋转被转换为不具有“全360度旋转加5度”的概念的四元数,而是简单地被设置为以与旋转的结果相同的方式定向。
Implications for Scripting
(在脚本中的意义)
在处理脚本中的旋转时,应该使用Quaternion类及其函数来创建和修改旋转值。
&在某些情况下,使用欧拉角是有效的,但您应该牢记:
&您应该使用处理欧拉角的四元数类函数
- 检索,修改和重新应用旋转中的欧拉值可能会导致无意
直接创建和处理四元素
Quaternion类有许多函数,允许你创建和操作旋转,而不需要使用欧拉角。
但是,有时候你需要在你的脚本中使用欧拉角。
在这种情况下,重要的是要注意,你必须保持你的角度在变量,
只使用它们作为欧拉角应用到你的旋转。
虽然可以从四元数检索欧拉角,如果您检索,修改和重新应用,将出现问题。
我创建了一个类来测试一些关于欧拉角和四元素正确和错误的示例:
UnityEngine.UI;
QuaternionAndEuler
MonoBehaviour
this for initialization
Update is called once per frame
MistakeExample1()
&&&&&&&这里的错误是我们正在修改四元素的X的值
该值不表示角度,并且不会产生所需的结果
transform.
rot.x += Time.deltaTime
transform.rotation =
MistakeExample2()
{在这个错误的例子中,我们在获得欧拉角的值,
然后修改了欧拉角的值,因为这些值都是通过四元素计算的
这可能遭受gimbal lock
transform.rotation.eulerA
angles.x += Time.deltaTime
transform.rotation = Quaternion.Euler(angles);
CorrectlyExample()
{&&我们存储我们的欧拉角在类变量中(也就是x)
然后我们也仅仅把它应用到欧拉角中,
x += Time.deltaTime
transform.rotation = Quaternion.Euler(x,0,0);
在动画中的应用:
许多3D创作包以及Unity自己的内部动画窗口允许您使用欧拉角来指定动画期间的旋转。
这些旋转值经常超过四元数表示的范围。
例如,如果对象应当就地旋转720度,则这可以由欧拉角X:0,Y:720,Z:0表示。
但是这根本不能用四元数值表示。
Unity动画窗口:
在Unity自己的动画窗口中,有一些选项允许您指定如何内插旋转
- 使用四元数或欧拉插值。
通过指定欧拉插值,你告诉Unity,你想要的角度指定的全范围的运动。
&然而,使用四元旋转,你只是想要以特定的方向旋转到目的地,Unity将使用四元插值并以最短的旋转距离到达那里。
有关更多信息,请参阅使用动画曲线。
外部动画源:
从外部源导入动画时,这些文件通常包含Euler格式的旋转关键帧动画。
&Unity的默认行为是重新取样这些动画并为动画中的每个帧生成新的四元关键帧,以避免任何关键帧之间的旋转可能超过四元数有效范围的情况。
例如,假设两个关键帧,相隔6帧,X的值在第一个关键帧上为0,在第二个关键帧上为270。
在没有重采样的情况下,这两个关键帧之间的四元数内插将在相反方向上旋转90度(-90),因为这是从第一取向到第二取向的最短方式。
但是,通过在每个帧上重新采样和添加关键帧,现在关键帧之间只有45度,因此旋转将正常工作。
仍然有一些情况,即使是重采样
- 导入的动画的四元数表示可能不够匹配原来足够,
因此,在Unity
5.3和以上,有关闭动画重采样的选项,所以你可以改为请在运行时使用原始的Euler动画关键帧。
有关更多信息,请参阅Animation
import of Euler Curve Rotations。
&本文来自Unity官网,仅用于个人笔记
官网链接:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。unity里面旋转是按照yxz顺序还是按照zxy?
看文档都是说的,但我测试结果是按照yxz顺序进行旋转的。请问到底是怎么顺序呢?难道我测试出错了??
&& & & & & &if(GUI.Button(new Rect(Screen.width - 100, 200, 50, 50), &x&))
&& & & & & &{
&& & & & & & & &transform.Rotate(Vector3.right, x);
&& & & & & &}
&& & & & & &if(GUI.Button(new Rect(Screen.width - 100, 300, 50, 50), &y&))
&& & & & & &{
&& & & & & & & &transform.Rotate(Vector3.up, y);
&& & & & & &}
&& & & & & &if(GUI.Button(new Rect(Screen.width - 100, 400, 50, 50), &z&))
&& & & & & &{
&& & & & & & & &transform.Rotate(Vector3.forward, z);
&& & & & & &}
测试数据与结果:x,y,z是三个自定义变量。比如分别为36, 48, 68:我按照yxz(分别点击y按钮,x,z)得到的欧拉角度就是(36, 48, 68), 然而按照zxy的顺序得到的欧拉角度是(327.2007f, 49.90851f, 68.86645f);
要评论请先&或者&
顶顶~有人知道的就说下呗~不清楚的也可以大家一起探讨探讨
用户被禁言,该主题自动屏蔽!
要不 transform.Rotate(Vector3.right,x,Space.Self 或者 Space.World);
:要不 transform.Rotate(Vector3.right,x,Space.Self 或者 Space.World);
试试? 难道说,,,,,unity的欧拉角度的旋转不是参照动态的物体自身坐标系,而是参照父空间坐标系?如果是这样的话。官方说的按照zxy顺序是没问题的。如果是参照动态的(比如旋转y轴会影响整个坐标系)物体坐标系,那就是按照yxz顺序的。看到一篇文章证明了前面两种顺序的旋转是等价的。
我试了一下,没效果???怎么回事??欧拉角到底是相对哪个坐标系的旋转??
我以前也做过一些类似的情况 ,旋转 还有移动都是根据的是父类的坐标系浏览量:26,216
重新看了三年前写的文章,感觉很多叙述并不到位,重新更新了一篇博客《》,里面有更加清晰的介绍。
对于四元数的概念也许大家不太熟悉,这里介绍下四元数概念,四元数、矩阵和欧拉角之间的关系,四元数球面插值的概念。
一. 四元数
1.1 四元数的概念
四元数是由爱尔兰数学家威廉o卢云o哈密顿在1843年发现的数学概念,在图形学中有重要的应用。在3D程序中,通常用四元数来计算3D物体的旋转角度,与矩阵相比,四元数更加高效,占用的储存空间更小,此外也更便于插值。 可以把四元数看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V或三个单独的分量(x,y,z),则四元数可以记为[ w, V]或[ w,(x,y,z)]。正规化四元数可以表示为:
在三维中,可以用四元数表示绕着某个轴的旋转,如下公式所示:
α表示旋转的角度,cos(βx), cos(βy) 和cos(βz)表示定位旋转轴的方向余弦
根据欧拉旋转定理,任何两个坐标系的相对定向,可以由一组四个数字来设定;其中三个数字是方向余弦,用来设定特征矢量(固定轴);第四个数字是绕着固定轴旋转的角值。这样四个数字的一组称为四元数。上面这段话阐述了四元数的原理:三维空间内所有的旋转都可以用四个数来表示。在通过四元数方法来计算旋转,已经替代了方向余弦方法,这是因为它能减少所需的工作,和它能减小舍入误差。在电脑图形学里,四元数与四元数之间,简易执行插值的能力是很有价值的。
1.2 旋转矩阵
旋转矩阵(Rotation Matrix)与一个向量相乘,会改变向量的方向但不改变大小的效果。旋转可分为主动旋转与被动旋转。主动旋转是指将向量逆时针围绕旋转轴所做出的旋转。被动旋转是对坐标轴本身进行的逆时针旋转,它相当于主动旋转的逆操作。在三维空间中,旋转矩阵有一个等于单位1的实特征值。只用三个实数就可以指定一个 3 维旋转矩阵。生成旋转矩阵的一种简单方式是把它作为三个基本旋转的序列复合。关于右手笛卡尔坐标系的 x-, y- 和 z-轴的旋转分别叫做 roll, pitch 和 yaw 旋转。因为这些旋转被表达为关于一个轴的旋转,它们的生成元很容易表达。
1.2 欧拉角
图1 欧拉角表示
设定 xyz-轴为参考系的参考轴,称 xy-平面与 XY-平面的相交为交点线,用英文字母(N)代表。zxz 顺规的欧拉角可以静态地这样定义:(1)a 是 x-轴与交点线的夹角;(2)B是 z-轴与Z-轴的夹角;(3)r 是交点线与X-轴的夹角。 欧拉角来描述刚体在三维欧几里得空间的取向,如图1所示。对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。 设定刚体取向的旋转矩阵[R]是由三个基本旋转矩阵合成的,单独分开作用,每个矩阵各自代表绕着其转动轴的旋转。但是,当它们照次序相乘,最里面的(最右的) 矩阵代表绕着 z 轴的旋转,最外面的(最左的) 矩阵代表绕着 Z 轴的旋转,在中间的矩阵代表绕着交点线的旋转。
旋转矩阵、欧拉角和四元数之间的转化关系
旋转矩阵、欧拉角、四元数都可以表示三维空间模型的旋转,三者间也可以相互转化。正规化四元数q0+iq1+jq2+kq3可以用矩阵形式表示:
欧拉角也可转化成矩阵形式,欧拉角φ, θ, ψ表示的顺时针旋转可以用下面的矩阵形式表示:
通过组合欧拉旋转(欧拉角分别是, θ, ψ)的四元数表达示,可以得到欧拉角到四元数的转化关系,如下面的公式所示:
同时可以得到,四元数到欧拉角的转换关系,如下面的公式所示:
arctan和arcsin的结果是[-π/2,π/2],这并不能覆盖所有朝向,因此需要用atan2来代替arctan,从而产生所有可能的朝向,得到新的公式如下面所示:
线性插值与球面插值
在二维空间对向量进行线性插值,如图2所示,从而在向量间取得线性平滑的插值。得到等式P(t)=P0+(P1-P0)*t , 0 &= t &=1,通常还要将它标准化,转化为P(t)=P(t)/|P(t)|,这种方式的缺点便是在以 |P0| 为半径的圆的曲线轨迹上不是恒速变化的。
图2线性插值
四元数在球面插值(Spherical Linear Interpolation)中仍只用于描述旋转,它是关于单位四元数构成的球表面上的操作,并且这一插值过程适用于在由三维向量升维构成的单位四元数中进行,所以基本上一次的插值过程可以降维到三维空间解释。其次,当向量仅发生旋转时,要求其起点向量到终点向量位于同一个二维空间,所以,球面插值本质上是处于二维空间的弧形插值。并且我们总是使用单位四元数来描述角度插值,因此在二维空间,被插值向量的长度是单位长度的,起始和终止向量以及由其长度为半径构成的圆中向量所夹的弧形便是我们观察的插值轨迹。 如图3球面插值所示,将 P(t) 分解为 P0 以及 P1 向量上的两个分量,根据平行四边形法则,我们首先观察在 P0 上的分量的长度 a(t),为了得到这个长度,作了 P0 末端到 A 以及 P(t) 末端到 B 的辅助线,根据相似三角形,各个边,得到比例关系a(t)/|P0|=sin(ang*(1-t))|P(t)|/(sin(ang)*|P0|),如果使用标准化的向量,简化为:a(t)=sin(ang*(1-t))/sin(ang)。使用同样的手段来计算另一个分量 b(t)=sin(ang*t)/sin(ang),最后得到这样的一组公式:P(t)=a(t)*P0+b(t)*P1。
图3 球面插值
▼ (6)
► (6)
► (57)
► (7)
► (8)
► (5)
► (4)
► (10)
► (7)
► (6)
► (4)
► (13)
► (1)
► (3)
► (10)
collapsItems['collapsCat-12:2'] = '';
collapsItems['collapsCat-13:2'] = '';
collapsItems['collapsCat-14:2'] = '';
collapsItems['collapsCat-15:2'] = '';
collapsItems['collapsCat-16:2'] = '';
collapsItems['collapsCat-17:2'] = '';
collapsItems['collapsCat-18:2'] = '';
collapsItems['collapsCat-19:2'] = '';
collapsItems['collapsCat-20:2'] = '';
collapsItems['collapsCat-21:2'] = '';
collapsItems['collapsCat-8:2'] = '► (5)
► (7)
► (8)
► (5)
► (4)
► (10)
► (7)
► (6)
► (4)
collapsItems['collapsCat-3:2'] = '';
collapsItems['collapsCat-10:2'] = '';
collapsItems['collapsCat-11:2'] = '';
collapsItems['collapsCat-4:2'] = '';
Collapse Functions, version 2.0
*--------------------------------------------------------------------------*/
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i

我要回帖

更多关于 js 触摸屏滑动事件 的文章

 

随机推荐