Unity3D_向量(Vector3)数学基础
向量(Vector3)
在虚拟的游戏世界中,3D数学决定了游戏,如何计算和模拟出开发者以及玩家看到的每⼀帧画⾯。学习基础的3D数学知识可以帮主⽤户对游戏引擎产⽣更深刻的了解。
向量定义:既有⼤⼩⼜有⽅向的量叫做向量。在空间中,向量⽤⼀段有⽅向的线段来表⽰。应⽤⼗分⼴泛,可⽤于描述具有⼤⼩和⽅向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察⽅向、刚体受到的⼒等都是向量。因此向量是物理、动画、三维图形的基础。 与向量相对的量成为标量:即只有⼤⼩没有⽅向的量。例如物体移动中的平均速率、路程。
模:向量的长度标准化(Normalizing):保持⽅向不变,将向量的长度变为1.
unity3d animation单位向量:长度为1的向量。
零向量:各分量均为0的向量
向量运算——加减:向量的加法(减法)为各个分量分别相加(相减)。在物理上可以⽤来计算两个⾥的合⼒,或者⼏个速度份量的叠加。
向量运算——数乘:向量与⼀个标量相乘称为数乘。数乘可以对向量的长度进⾏缩放,如果标量⼤于0,那么向量的⽅向不变,若标量⼩于0,则向量的⽅向会变为反⽅向。
向量运算——点乘:两个向量点乘得到⼀个标量,数值等于两个向量长度相乘再乘以两者夹⾓的余弦值。如果两个向量a,b均为单位向
量,那么a.b等于向量b在向量a⽅向上的投影的长度(或者说向量a在向量b⽅向上的投影)。
把词语拆成字逐个分析。
“弦”代表长,也就是斜边,从“勾三股四弦五”中迁移过来。
“正”就是正对,表⽰直⾓三⾓形中⾓的对边。
“余”代表相邻,表⽰直⾓三⾓形中与⾓相邻的直⾓边。
“切”有垂直之意,在圆的切线中有体现。
这样⼀来,正弦就是对边⽐斜边,余弦就是邻边⽐斜边,正切就是对边⽐(与对边垂直的)邻边。
我们常说切割,在数学⾥,切和割是相差很远的,⽐如切线和割线。所以在三⾓函数⾥,切割相反。
叉乘:两个向量的叉乘得到⼀个新的向量,新向量垂直与原来的两个向量,并且长度等于原来向量长度相乘后夹⾓的正弦值
注意:叉乘不满⾜交换律 即a×b 不等于 b×a。
属性
forward Vector3(0, 0, 1)的简码,也就是向z轴。
right Vector3(1, 0, 0)的简码,也就是向x轴。
up Vector3(0, 1, 0)的简码,也就是向y轴。
zero Vector3(0, 0, 0)的简码。
one 是 Vector3(1, 1, 1)的简码。
Vector3.sqrMagnitude 长度平⽅(只读的)
【注】计算长度的平⽅⽽不是magnitude是⾮常快的。如果你是⽐较两个向量的长度差,你可以⽐较他们的平⽅长度。
向量的长度是⽤勾股定理计算出来,计算机计算两次⽅和开根的运算量⽐加减法要费时的多。所以如果是想⽐较两个向量的长度,⽤sqrMagnitude可以快出很多。
向量运算
向量加法
向量加法就是两个向量对应的x,y,z轴坐标进⾏加法运算 例如以下的代码
如果v1和v2都表⽰⼀个点的话,那么v3的⽅向是从v1开始指向v2的⼀个带有箭头的射线 此时v3就是⼀个向量
如果v1和v2都表⽰⼀个向量的话,那么v3是⼀个从v1的尾部指向v2的头部的⼀个带有⽅向箭头的⼀条射线
向量减法
向量加法就是两个向量对应的x,y,z轴坐标进⾏减法运算 例如以下的代码其实就是从向量b头部指向向量a头部的⼀个向量
Vector3 v1 = new Vector3(1, 2, 3);
Vector3 v2 = new Vector3(4, 2, 1);
Vector3 v3 = v1 + v2; //v3的结果 (5.0, 4.0, 4.0)Debug.Log(v3);
Vector3 v1 = new Vector3(1, 2, 3);
Vector3 v2 = new Vector3(4, 2, 1);
Vector3 v3 = v2 - v1; //v3的结果 (3.0, 0.0, -2.0)
Debug.Log(v3);
向量数乘
实数和向量相乘的过程就是数乘
如果实数⼤于0 那么数乘后的向量的⽅向和原始向量的⽅向⼀致,如果实数⼩于0 那么数乘后的向量的⽅向和原始向量的⽅向相反
数乘的⼏何意义:就是沿着原始变量的⽅向或者变量的相反⽅向放⼤或者缩⼩
⽅法
Vector3.Dot 点乘 (⼜称”点积”,”数量积”,”内积”)(Dot Product, ⽤*)
定义:a·b=|a|·|b|cos< a,b> 【注:粗体⼩写字母表⽰向量,< a,b>表⽰向量a,b的夹⾓,取值范围为[0,180]】
⼏何意义:是⼀条边向另⼀条边的投影乘以另⼀条边的长度.
v1和v2向量的点乘运算:相应元素的乘积的和:v1( x1, y1,z1) v2(x2, y2,z2) = x1x2 + y1y2+z1z2;
注意 : 结果不是⼀个向量,⽽是⼀个标量。
性质1: ab = |a||b|Cos(θ) ,θ是向量a 和向量 b之间的夹⾓。
性质2: ab = b*a 满⾜乘法交换律
Unity项⽬应⽤:
1.根据点乘计算两个向量的夹⾓。< a,b>= arccos(a·b / (|a|·|b|))
2.根据点乘的正负值,得到夹⾓⼤⼩范围,【⼤于>0,则夹⾓(0,90)】,【 ⼩于<0,则夹⾓(90,180)】,可以利⽤这点判断⼀个
多边形是⾯向摄像机还是背向摄像机。
3.根据点乘的⼤⼩,得到向量的投影长度,反应了向量的长度关系。
4.在⽣产⽣活中,点积同样应⽤⼴泛。利⽤点积可判断⼀个多边形是否⾯向摄像机还是背向摄像机。向量的点积与它们夹⾓的余弦成正
⽐,因此在聚光灯的效果计算中,可以根据点积来得到光照效果,如果点积越⼤,说明夹⾓越⼩,则物理离光照的轴线越近,光照越强。物理中,点积可以⽤来计算合⼒和功。若b为单位⽮量,则点积即为a在⽅向b的投影,即给出了⼒在这个⽅向上的分解。功即是⼒和位移的点积。计算机图形学常⽤来进⾏⽅向性判断,如两⽮量点积⼤于0,则它们的⽅向朝向相近;如果⼩于0,则⽅向相反。⽮量内积是⼈⼯智能领域中的神经⽹络技术的数学基础之⼀,此⽅法还被⽤于动画渲染(Animation-Rendering)。
Vector3.Cross 叉乘 (⼜称”叉积”,”向量积”,”外积”)(cross product,⽤x)
定义:c = a x b,其中a b c均为向量
⼏何意义是:得到⼀个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平⾏四边形的⾯积
v1和v2向量的叉乘运算:相应元素的乘积的和:v1( x1, y1,z1) x v2(x2, y2, z2) = (y1z2 - y2z1)i+(x2z1 - x1z2)j+(x1y2-x2y1)k;
利⽤三阶⾏列式计算
|i j k|
|x1 y1 z1|
|x2 y2 z2|
性质1:c⊥a,c⊥b,即向量c与向量a,b所在平⾯垂直
性质2:模长|c| = |a||b| sin< a,b>
性质3:(数学上)满⾜右⼿法则, a x b = -b x a,所以我们可以使⽤叉乘的正负值来判断
Unity当中叉乘的左⼿法则
Unity项⽬应⽤:
1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针⽅位。
简单的说: 点乘判断⾓度,叉乘判断⽅向。
形象的说: 当⼀个敌⼈在你⾝后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌⼈,点乘得到你当前的⾯朝向的⽅向和你到敌⼈的⽅向的所成的⾓度⼤⼩。
2.得到a,b夹⾓的正弦值,计算向量的夹⾓(0,90),可以配合点乘和Angle⽅法计算出含正负的⽅向。
3.根据叉乘⼤⼩,得到a,b向量所形成的平⾏四边形的⾯积⼤⼩,根据⾯积⼤⼩得到向量的相对⼤⼩。
Vector3.Distance 距离
void Test()
{
Vector3 v1 = new Vector3(0, 0, 2);
Vector3 v2 = new Vector3(2, 0, 0);
//求两个点之间的距离
Debug.Log(Vector3.Distance(v1,v2));
}
Vector3.Lerp 插值
obj1的位置是上⼀帧的位置加上(⽬标位置-上⼀帧的位置)*0.1
1
Vector3.Normalize 规范化
使向量编程长度为1的单位向量
- Vector2和Vector4
Vector2 ⼆维向量
这个结构⽤于在⼀些地⽅表⽰2D的位置和向量(例如:⽹格中的纹理坐标,或者材质中的纹理偏移)。在其他情况下⼤多数使⽤Vector3。其操作基本可Vector3差不多
静态变量
one
Vector2(1, 1)的简写。
right
Vector2(1, 0)的简写。
up
Vector2(0, 1)的简写。
zero
Vector2(0, 0)的简写。
Vector4 ⼆维向量
表⽰四维向量。
这个结构在⼀些地⽅⽤来表⽰四维向量(例如:⽹格切线,着⾊器的参数)。在其他情况下⼤多数使⽤Vector3。
其他操作和Vector3雷同
参考代码
点乘
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Vector3Test : MonoBehaviour {
// Use this for initialization
void Start () {
Vector3 v1 = new Vector3(1, 0, 0);
Vector3 v2 = new Vector3(1, 0, 1);
TestDot(v1, v2);
}
// Update is called once per frame
void Update () {
}
private void TestDot(Vector3 a,Vector3 b)
{
//计算两个向量点乘的结果得到的是⼀个数值
//求得的是向量b在向量a⽅向上的投影
float result = Vector3.Dot(a,b);
Debug.Log("Result = "+result);
//计算两个向量的夹⾓,该⽅法得到的是⼀个⾓度计算出来的夹⾓的范围是0-180度 float angle = Vector3.Angle(a,b);
Debug.Log("angle = " + angle);
//向量b⽅向上的单位向量在向量a⽅向单位向量的投影
//计算 a、b 单位向量的点积,得到夹⾓余弦值,|a.normalized|*|b.normalized|=1;
result = Vector3.alized);
Debug.Log("result = " + result);
// 通过反余弦函数获取向量 a、b 夹⾓(默认为弧度)
float radians = Mathf.Acos(result);
angle = radians * Mathf.Rad2Deg;
Debug.Log(angle);
}
}
叉乘
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论