三维向量叉乘
I a(向量) x b(向量) I = I a(向量) I I b(向量) I sin角度
叉乘得到的最终向量的方面,按照所遵循的左手和右手定则 而不同。
叉乘的意义:
判断三角面的朝向。
叉乘的值
三维向量叉乘
I a(向量) x b(向量) I = I a(向量) I I b(向量) I sin角度
叉乘得到的最终向量的方面,按照所遵循的左手和右手定则 而不同。
叉乘的意义:
判断三角面的朝向。
叉乘的值
#### 叉积的应用
* 得到一个平面的法向量
* 判断旋转方向:axb旋转方向就是从a到b,顺时针和逆时针取决于观察方向,走到对侧观察,顺逆性就刚好反过来了。
** 用左手定则,假设知道了axb(中指),和a(大拇指),我们大致可以判断b的方向,知道axb(大拇指)和b(食指)也是一样。在该系中,axb,a到b永远是顺时针。 +
就是说,站在大拇指和食指形成的平面,头朝向axb观察,是顺时针,顺时针就是角度变大的旋转方向。
** 0 共线(可能同向,或反向)
### unity中的点和向量
vector2 vector3 分别用来表示二维 或 三维 的点或向量。
* transform.position transform所在对象在世界坐标系中的点的位置
* transform.forwoard 等相关值,是transform所在对象z正向在世界坐标系的单位向量
* 在unity中,用vector3来表示对象的位置
* 在unity中,*用vector3来表示物体移动的长度和方向*。
** update函数相当于差分,每帧移动ds距离
** 设匀速运动s=vt,则ds=v*dt,从t到t+1秒积分得:s=v,也就是说,累积一秒的若干帧更新,刚好走过了速度标定的距离,因此我们也把向量当作速度来用
*** update函数中的移动距离计算为:ds=time.deltatime*移动矢量,其中移动矢量是一秒物体移动的距离,也就是速度
* 在unity中,可以通过两个对象transform.position值相减得到的矢量的模,得到两个对象的距离
[source,csharp]
----
private Vector3 movingvect;
private bool movingSetted=false;
private float movingtime=3;
//set in inspector panel
public Transform target;
// Update is called once per frame
void Update()
{
//第一次,求移动矢量,也就是距离
if (movingSetted==false){
movingSetted=true;
movingvect=target.position-transform.position;
}
//距离足够小停止运动
var distanceVector=target.position-transform.position;
//模平方获得较好运行性能
if(Vector3.SqrMagnitude(distanceVector)>=0.1f)
transform.Translate(movingvect/movingtime*Time.deltaTime,Space.World);
}
----
void Update()
{
//每秒移动两秒抵达屏幕边界时停止
var vpp = Camera.main.WorldToViewportPoint(transform.position);
if (vpp.x > 0 && vpp.y > 0 && vpp.x < 1 && vpp.y < 1)
transform.Translate(Time.deltaTime * Vector3.right * 2, Space.World);
}
### 屏幕坐标与视口坐标转换
#### Camera.ScreenToViewportPoint
public Vector3 ScreenToViewportPoint(Vector3 position);
Transforms position from screen space into viewport space.
Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the camera.
#### Camera.ViewportToScreenPoint
public Vector3 ViewportToScreenPoint(Vector3 position);
Transforms position from viewport space into screen space.
Viewport space is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
//下列两条语句等价
transform.Translate(Time.deltaTime*transform.up,Space.World);
transform.Translate(Time.deltaTime*Vector3.up);
## 坐标系关联与相互转换
### Transform.Translate
`public void Translate(Vector3 translation, Space relativeTo = Space.Self);`
将transform,相对于space坐标系,移动translation的距离
* 移动谁:移动transform所在对象
* 相对于哪个坐标系移动:相对于space移动
* 移动多少:移动translation
* space枚举取值有哪些:space.world,space.self(默认值)
## Transform.TransformPoint
`public Vector3 TransformPoint(Vector3 position);`
将本transform空间中的点position,转换到世界坐标系。
## Transform.InverseTransformPoint
`public Vector3 InverseTransformPoint(Vector3 position);`
将世界坐标系中的点position,转换到本transform的局部坐标系
* 屏幕坐标系 Screen Space
** 标准定义:Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the camera.
*** 以像素为单位
*** 原点左下角,右上角宽度screen.width和高度screen.height
** unity实现
*** 原点左下角,右上角宽度screen.width和高度screen.
**** 注意:Event.mousePosition原点在左上角,而不是坐下
height
*** 鼠标位置坐标属于屏幕坐标,input.mouseposition,是一个**三维向量**,z始终为0,可能是为了性能,不处理z。如果要精确,可以理解为z在视锥近平面cam.nearClipPlane。
*** 将世界坐标转换为屏幕坐标时,*Z是以世界单位衡量的到相机的距离*:摄像机对游戏世界的渲染范围是一个平截头体,渲染边界是一个矩形,用与near clippingplane或者far clippingplane平行的平面截取这个平截头体,可以获得无数个平行的矩形面,也就是我们看到的屏幕矩形。离摄像机越远,矩形越大,离摄像机越近,矩形越小。所以,同样大小的物体,随着离摄像机越来越远,相对于对应屏幕矩形就越来越小,所看起来就越来越小。在屏幕上,关键在于这个点在哪个截面上,也就是说,关键在于这个截面离摄像机有多远!*参数中的z坐标的作用就是:用来表示上述平面离摄像机的距离*。
**** Input.mouseposition移动到屏幕之外也会有值
*** 手指触摸屏幕也为屏幕坐标, 单手指input.gettouch(0).position,是一个**二维向量**
* 视口坐标系 ViewPort Space
** 标准定义:Viewport space is normalized and relative to the camera. The bottom-left of the viewport is (0,0); the top-right is (1,1). The z position is in world units from the camera.
*** 将屏幕坐标系单位化
*** 左下角 (0,0),右上角 (1,1)
** unity实现
*** 无法直接得到
*** 可以将屏幕坐标->视口坐标,或反之
*** 可以将世界坐标->视口坐标,或反之
*** 左下角 (0,0),右上角 (1,1)
*** 如前所述,当采集鼠标位置时,z不做处理,此时,z始终为0
三维向量基本运算
三维坐标系中的向量OP
三维向量的加减法 和 模 的计算, 和二维向量基本一致,只是多了一个Z轴需要参与运算
加减法
模的计算
[ x(平方) +y(平方) +z(平方) ](开根号)
三维坐标系
三维坐标系,分为左右手坐标系。
就像OpenGL 和 DX 一样。
OpenGL 先旋转180度 在镜像 得 DX
Unity 是左手坐标系
二维坐标系旋转和平移
x = x` cos角度 + y`sin角度 + a
y = y` cos角度 - x`sin角度 + b
(a,b) 是坐标平移的向量
角度 是坐标先转的角度。
二维向量的叉乘
叉乘的其他叫法:
向量积,外积,叉积
点乘最后生成的是一个标量。
叉乘最后生成的是一个向量。
叉乘
a (向量) * b(向量)= c(向量)
(叉乘后得到的最终向量)
模长:
|c| = | a(向量) * b(向量)| =|a| |b| sin角度
方向:
c(向量) 的方向垂直于 a(向量) 与 b(向量)所在平面。
二维向量的点乘
1、a(向量) 点乘 b(向量) = x1x2 + y1y2 = 标量(数值)
=a(向量的模长) * b(向量的模长) cos(角度)
向量的点乘 可以换算成角度
角度 = ac cos( (a(向量) * b(向量) ) / a(向量模长) * b(向量模长) )
2、余弦定理
余弦定理推演:
余弦定理的推理是通过,三角函数平方关系+勾股定理 一起推演出来的。
三角函数平方关系:
勾股定理:
直角三角形 俩个直角边的平方和等于对边的平方
二维向量减法
二维向量的加法 = a(向量) + b(向量)
二维向量的减法 = a(向量) + -b(向量)
二维向量减法: 被减向量 与 减向量 平移到共起点, 减法得到的最终二维向量是 减向量的终点为起点,指向被减向量的终点。
二维向量加法
二维坐标系旋转
(根据上图的推到)
将坐标系顺时针旋转后,求得点坐标为:
x` = x cos角度 + y sin角度
y` = y cos角度 - x sin角度
将坐标逆时针旋转后,求得点坐标为:
x = x` cos负角度 + y` sin负角度
y = y` cos负角度 - x` sin 负角度
( 坐标变换 顺时针 和 逆时针 的区别在于角度的正负 )
二维坐标系平移
二维坐标的平移,是平移坐标系。
o`p`(向量) 是 op(向量) 经过 oo`(向量)平移 后得到的。
op`(向量) 是 o`p`(向量)在 XOY坐标系中的呈现。
op`(向量) 坐标等于
x` = x + a
y` = y + b
二维单位向量
叉乘不符合交换律,俩个向量互换位子叉乘,得到的结果是不一样的。
单位向量:
模长等于一的向量。
求一个非零向量的单位向量:
(如何理解单位向量的计算公式)
单位向量是模长为1 ,有方向的,向量。
向量是有模长,有方向的。
用向量除以自身的模长,这样,向量的模就被化成1,方向不变。
零向量:
零向量长度为0
方向是任意方向
任何向量乘零向量都等于0
一个单位向量在平面直角坐标系上的坐标为(x,y) 根据勾股定理 和 单位向量模长为1 的特性 得 x(平方) + y(平方) = 1 。
斜率: y / x
mode基类不要继承moni类 切记
否则后面查找的时候会报空
登录UI前两次都可以,第三次开始无法消失的,可能是因为弹出栈时未清除所有的addlistener,导致下一次push的时候addlistener被绑定了多次,所以在loginpanel.cs中onexit函数中加上closeButton.onClick.RemoveAllListeners();