Unity中⽤到的数学知识整理(为⾃⼰)
缓动数学知识
CSS
CSS properties transition and animation allow you to pick the easing function. Unfortunately, theydon’t support all easings and you must specify the desiredeasing function yourself (as a Bezier curve).
Selectan easing function to show its Bezier curve notation.
div {
-webkit-transition: all 600ms
easing’s Bezier curve
;
transition: all 600ms
easing’s Bezier curve
; }
SCSS
Sass/SCSS candescribe animations too! Compass removes prefixes before the transition and animation properties,and
the plugin lets youpass the easing function by name (without specifying the exact Beziercurves).
div {
@include transition(all 600ms ceaser(
$easing name
)); }
JavaScript
jQuery with the is theeasiest way to describe animation with easing. Pass the easing name (like easeInCirc)
to the .animate() function as the third argument, or use itas the value of the easing option.
div.animate({ top: '-=100px' }, 600, '
easing name
', function () { … })
在Unity3D中,有时候我们需要计算⼆维向量的夹⾓。⼆维向量夹⾓⼀般在0~180度之前,可以直接调⽤Vector2.Angle(Vector2 from, Vector2 to)来计算。
但是在有些场景,我们需要-180~180度的夹⾓,此时可以⽤下⾯的脚本进⾏计算:
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross=Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z > 0 ? -angle : angle;
}
1.
1 2 3float angle = Vector3.Angle (fromVector, toVector); //求出两向量之间的夹⾓
Vector3 normal = Vector3.Cross (fromVector,toVector);//叉乘求出法线向量
angle *= Mathf.Sign (Vector3.Dot(normal,upVector)); //求法线向量与物体上⽅向向量点乘,结果为1或-1,修正旋转⽅向
2.
1 2Vector3 velocity = Quaternion.Inverse (ation)*destinationVector; //对⽬标向量进⾏反向旋转,得到的新向量与z轴的夹⾓即为⽬标向量与当前物体⽅向的夹⾓
float angle = Mathf.Atan2 (velocity.x,velocity.z) * Mathf.Rad2Deg; //返回tan值为x/z的⾓的弧度,再转化为度数。
3.
数学法:已知a,b两个向量
cosθ=X; (X=(a*b)/(|a|*|b|))
然后求θ=arccosX c#⾥是Mathf.Acos(X);如下图
Vector3 srcPos = new Vector3(0,0,0);
Vector3 tarPos = new Vector3(0,0,-1);
Vector3 srcRot = new Vector3(0,90,0);
Quaternion srcQua = Quaternion.Euler(srcRot);
Vector3 direction = tarPos - srcPos;
Vector3 r = Quaternion.Inverse(srcQua) * direction;
Debug.Log(r);unity3d animation
float angle = Mathf.Atan2(r.x, r.z) * Mathf.Rad2Deg;
Debug.Log(angle);
其中结果r为(1,0,0),angle为90 ;
关于Quaternion * Vector3
Quaternion * Vector3就是Vector3进⾏⼀次Quaternion 旋转。理论总是枯燥的,下⾯以实际项⽬代码为例,这是简化之后的部分项⽬代码:(c#)
[csharp] view plain copy
Vector3 directionVector = tarPosition - srcPosition;
Vector3 resultDirection = ation * directionVector;
代码的⽬的就是计算出当前帧⼈物应该移动的⽅向。提⼀下这是⼀个FPS项⽬,即第⼀⼈称射击类,当玩家按住向右移动时,⼈物的旋转是不变的,只是移动
⽅向相对于玩家是向右,理解这⼀点很重要。
那么为什么movingDirection就是当前帧⼈物应该移动的⽅向呢?
我们不妨假设directionVector=(1,0,1);这就表⽰玩家想让⼈物向右移动的同时向前移动,且移动量相同。
⾄于具体的移动量没有意义,我们随便加⼀个系数就可以调节移动快慢。
关于Atan2
结果为正表⽰从 X 轴逆时针旋转的⾓度,结果为负表⽰从 X 轴顺时针旋转的⾓度。
ATAN2(a, b) 与 ATAN(a/b)稍有不同,ATAN2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),
⽽ATAN(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。
若要⽤度表⽰反正切值,请将结果再乘以 180/3.14159。
另外要注意的是,函数atan2(y,x)中参数的顺序是倒置的,atan2(y,x)计算的值相当于点(x,y)的⾓度值。
Vector3 srcPos = new Vector3(0,0,0);
Vector3 tarPos = new Vector3(0,0,-1);
Vector3 srcRot = new Vector3(0,90,0);
Quaternion srcQua = Quaternion.Euler(srcRot);
Vector3 direction = tarPos - srcPos;
Vector3 r = Quaternion.Inverse(srcQua) * direction;
Debug.Log(r);
float angle = Mathf.Atan2(r.x, r.z) * Mathf.Rad2Deg;
Debug.Log(angle);
其中结果r为(1,0,0),angle为90 ;
关于Quaternion * Vector3
Quaternion * Vector3就是Vector3进⾏⼀次Quaternion 旋转。理论总是枯燥的,下⾯以实际项⽬代码为例,这是简化之后的部分项⽬代码:(c#)
[csharp] view plain copy
Vector3 directionVector = tarPosition - srcPosition;
Vector3 resultDirection = ation * directionVector;
代码的⽬的就是计算出当前帧⼈物应该移动的⽅向。提⼀下这是⼀个FPS项⽬,即第⼀⼈称射击类,当玩家按住向右移动时,⼈物的旋转是不变的,只是移动
⽅向相对于玩家是向右,理解这⼀点很重要。
那么为什么movingDirection就是当前帧⼈物应该移动的⽅向呢?
我们不妨假设directionVector=(1,0,1);这就表⽰玩家想让⼈物向右移动的同时向前移动,且移动量相同。
⾄于具体的移动量没有意义,我们随便加⼀个系数就可以调节移动快慢。
关于Atan2
结果为正表⽰从 X 轴逆时针旋转的⾓度,结果为负表⽰从 X 轴顺时针旋转的⾓度。
ATAN2(a, b) 与 ATAN(a/b)稍有不同,ATAN2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),
⽽ATAN(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。
若要⽤度表⽰反正切值,请将结果再乘以 180/3.14159。
另外要注意的是,函数atan2(y,x)中参数的顺序是倒置
旋转矩阵(Rotation Matrix)的推导及其应⽤//
世界坐标中的⼀个点乘以⼀个四维矩阵,可以实现平移,旋转和缩放等等。
平移就是,旋转和缩放就是(M分别是对应的旋转缩放矩阵)
当中为0时,是向量,为1时,是坐标。
旋转:
缩放:
矩阵如何进⾏计算呢?之前的⽂章中有简介⼀种⽅法,把⾏旋转⼀下,然后与右侧对应相乘。在⾕歌图⽚搜索旋转矩阵时,看到这张动图,觉得表述的很清晰了。
稍微复杂⼀点的是旋转,如果只是⼆维也很简单(因为很直观),但因为是三维的,有xyz三个轴,先推导⼆维的再延伸到三维。
有点P(Xa,Ya),当坐标由 x –> y 旋转 θ 度后,求该点在新坐标轴的坐标是多少
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论