[学习笔记]三维数学(1)-向量
2023-06-13 09:16:13 时间
向量
什么是向量
- 一个数字列表,表示各个维度上的有向位移
- 一个有大小有方向的物理量(大小即向量的模长,方向即描述空间中向量的指向)。
- 可以表示物体的位置和方向。向量的大小(模)
- 向量各分量平方和的平方根。
- 公式:
- API:float dis=vector.magnitude; 模的平方:vector.sqrMagnitude;(因为平方根的计算耗时长,所以效率高于magnitude)向量的方向
- 获取向量的方向也称"标准化向量",或"归一化向量",即获取该向量的单位向量。
- 单位向量:大小为1的向量。
- 公式:
- 几何意义:将该向量拉长或者缩短,使模长等于1.
- API:
Vector3 vectmp = vec.normalized;
vectmp为vec的单位向量。vec.normalized():返回vec的单位向量
向量相减 - 等于各分量相加减
- 公式:[x1,y1,z1] - [x2,y2,z2] = [x1-x2,y1-y2,z1-z2]
- 几何意义:向量a与向量b相减,结果理解为以b的终点为始点,以a的终点为终点的向量,方向由b指向a。
- 应用:计算两点之间的距离和相对方向。向量相加
- 等于各分量相加和。
- 公式:[x1,y1,z1]+[x2,y2,z2] = [x1+x2,y1+y2,z1+z2];
- 几何意义:向量a与向量b相加,平移使b的始点与a的终点重合。结果为以a的始点为终点,以b的终点为终点的向量。
- 应用:物体的移动。向量与标量的乘除
- 乘法:该向量的各分量与标量相乘k[x,y,z] = [xk,yk,zk]
- 除法:该向量的各分量与标量相除[x,y,z]/k = [x/k,y/k,z/k]
- 几何意义:缩放向量长度
实例
在unity中画出向量和单位向量
打开unity项目,新建一个cube,为了方便查看可以缩小一点。给cube新建一个脚本,脚本代码如下:
public class VectorDemo : MonoBehaviour
{
// Update is called once per frame
void Update()
{
Demo01();
}
private void Demo01()
{
Vector3 pos = this.transform.position;
//画出物体位置所对应的的向量
Debug.DrawLine(Vector3.zero, pos);
//画出物体位置所对应的单位向量,用红线表示
Debug.DrawLine(Vector3.zero, pos.normalized,Color.red);
print(pos.magnitude); //输出向量模长
}
}
运行效果
获取物体B指向物体A的向量(向量相减)
复制之前的cube,并给它附上画出相减向量的relDemo脚本,脚本代码如下:
public class VectorRelDemo : MonoBehaviour
{
public GameObject cube; //在组件面板中把另一个cube拖入这个变量
// Update is called once per frame
void Update()
{
Demo();
}
private void Demo()
{
Vector3 relativeDirection = cube.GetComponent<Transform>().position - this.GetComponent<Transform>().position;
Debug.DrawLine(Vector3.zero,relativeDirection,Color.green);
}
}
运行效果
使物体C向物体B移动(向量相加)
实现当按下A键后在物体B的坐标生成一个物体C,物体C从物体B向物体A的方向径直移动。 在上面实例的基础上,先创建一个按A生成物体C的脚本FireDemo,并赋给物体B,脚本代码如下:
public class FireDemo : MonoBehaviour
{
public GameObject bullet;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
CreateBullet();
}
}
private void CreateBullet()
{
bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);
bullet.transform.parent = this.transform; //作为物体B的子物体
bullet.AddComponent(System.Type.GetType("Bullet")); //添加脚本Bullet
bullet.transform.position = this.transform.position;
}
}
需要让物体C从B移动到A,只需要用从原点指向C的向量加上从B指向A的向量(上面的向量相减所求得的向量),为了能看到移动过程,可以缩短b->A的向量,脚本代码如下:
public class Bullet : MonoBehaviour
{
private Vector3 move;
// Start is called before the first frame update
void Start()
{
move = this.GetComponentInParent<VectorRelDemo>().relativeDirection;
}
// Update is called once per frame
void Update()
{
//为了确保移动速度不与两物体间距(向量模长)相关,需要
//先把移动向量变为单位向量,再根据后面的参数自定义速度。
this.transform.Translate(move.normalized*0.05f);
}
}
运行效果
相关文章
- Spring学习笔记(一)——Spring介绍及工厂模式解耦
- Python笔记 第一章
- urdf 学习笔记一
- 《零基础学机器学习》笔记-第2课-数学和Python知识
- Mybatis | Mybatis学习笔记(下)
- LinkedList 源码笔记
- 难以置信!网易首席架构师竟用了500页笔记,把网络协议给趣谈了
- Linux学习笔记之mac系统Vmware Fusion虚拟机黑屏问题
- Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法「建议收藏」
- 【论文笔记】Multi-Domain Dialogue State Tracking based on State Graph
- 摘录一下Python列表和元组的学习笔记
- [学习笔记]三维数学(2)-三角函数
- 鸟哥的私房菜学习笔记 -- 网络速查
- 【笔记php】如何使用PHP从JSON提取数据?
- CSS flex笔记
- Nginx学习笔记,持续记录
- 【探花交友】通用设置总结笔记
- 数据治理专业认证CDMP学习笔记(思维导图与知识点)- 数据管理
- 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程
- MongoDB 复制(副本集)学习笔记
- Spring AOP 简单入门笔记详解编程语言
- Spring-data-jpa 学习笔记(二)详解编程语言
- 快乐Linux之旅:学习笔记(linux学习笔记)
- MySQL学习笔记如何实现两表多列合并(mysql 两表多列合并)
- DB2UDBV8.1管理学习笔记(三)
- Jquery学习笔记(一)
- JQueryStudyNotes学习笔记(一)
- jquery跨域访问问题解决方法(笔记)
- JavaScript高级程序设计(第3版)学习笔记13ECMAScript5新特性
- python网络编程学习笔记(三):socket网络服务器
- Javascript学习笔记之对象篇(一):对象的使用和属性
- Ruby简洁学习笔记(二):类继承、属性、类变量