【学习笔记】unity脚本学习(三)(向量 Vector3)

目录

    • 向量复习
      • 高中向量基础
      • 【数学】向量的四则运算、点积、叉积、正交基
      • 叉乘公式
      • 叉乘运算定理
      • 向量、坐标系
      • 点积
      • 叉积
    • Vector3 三维向量
      • 静态变量
      • 变量
        • 变量normalized 与 Normalize() 方法
      • 静态方法
        • ClampMagnitude
        • Cross
        • Distance
        • Dot
        • MoveTowards
        • 其他变换类似
          • Lerp 在两个点之间进行线性插值。
          • RotateTowards 将向量 current 朝 target 旋转。
          • Slerp 在两个向量之间进行球形插值。
          • SmoothDamp 随时间推移将一个向量逐渐改变为所需目标。
        • Max
        • Min
        • Scale
        • OrthoNormalize 将向量标准化并使它们彼此正交。
        • Project 将向量投影到另一个向量上。
        • ProjectOnPlane 将向量投影到由法线定义的平面上(法线与该平面正交)。
        • Reflect 从法线定义的平面反射一个向量。
    • 结言

新的一周,开启新的学习,加油

向量复习

视频讲得笼统了,还是去复习下高中知识吧

高中向量基础

高中数学平面向量
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【数学】向量的四则运算、点积、叉积、正交基

在这里插入图片描述

叉乘公式

向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
对于向量a和向量b:在这里插入图片描述
a和b的叉乘公式为:
在这里插入图片描述
其中:在这里插入图片描述
根据i、j、k间关系,有:
在这里插入图片描述

叉乘运算定理

向量外积的高中数学运用
在这里插入图片描述

向量、坐标系

  • 向量、标量
    标量就是向量的模(取平方根)
  • 右手坐标系、左手坐标系
    在这里插入图片描述
    unity用的是左手坐标系在这里插入图片描述

点积

在这里插入图片描述
unity提供点积函数 Vector3.Dot(VectorA,VectorB)
点积的应用:
在这里插入图片描述
比如用游戏中飞机的forward和世界坐标up进行点积,为0也就是垂直,那么就给它最小的空气阻力,否则加大空气阻力。

叉积

数学上方向用右手螺旋来判断:
在这里插入图片描述
unity中用左手来判断?这点再继续搜查一下!
在这里插入图片描述

unity中叉积函数Vector3.Cross(VectorA,VectorB)

应用:
在这里插入图片描述
如上:坦克原先朝向A,想在想瞄准B方向,那么就可以A^B,得到垂直的C向量,对C轴进行旋转就能方便地操作物体

Vector3 三维向量

官网Vector3API

静态变量

在这里插入图片描述

变量

  • magnitude 返回该向量的长度。(只读)
  • normalized 返回 magnitude 为 1 时的该向量。(只读)
  • sqrMagnitude 返回该向量的平方长度。(只读)
  • this[int] 分别使用 [0]、[1]、[2] 访问 x、y、z 分量。

变量normalized 与 Normalize() 方法

normalized 返回 magnitude 为 1 时的该向量。(只读)

进行标准化时,向量方向保持不变,但其长度为 1.0。
请注意,当前向量保持不变,返回一个新的归一化向量。如果 要归一化当前向量,请使用 Normalize 函数。
如果向量太小而无法标准化,则返回零向量。

Normalize 使该向量的 magnitude 为 1。
请注意,此函数将更改当前向量。如果 要保持当前向量不变,请使用 normalized 变量。
如果该向量太小而无法标准化,则将其设置为零。

Vector3 v1;
    Vector3 v2;
    // Start is called before the first frame update
    private void Awake() {
        v1 = transform.position;
    }
    void Start()
    {
        v2 = v1.normalized;
        // v2 = Vector3.Normalize(v1);
        // v1.Normalize();
        Debug.Log("the value of v1:"+ v1.ToString() + " and v1 Magnitude:"+ v1.magnitude.ToString());
        Debug.Log("the value of v2:"+ v2.ToString() + " and v2 Magnitude:"+ v2.magnitude.ToString());
    }

v2 = v1.normalized;执行结果
在这里插入图片描述
v2 = Vector3.Normalize(v1);执行结果
在这里插入图片描述
v1.Normalize();执行结果
在这里插入图片描述
可以看到,只有v1.Normalize()才会对向量本身产生影响,Vector3.Normalize(v1)v1.normalized都会生成新的向量。

静态方法

ClampMagnitude

public static Vector3 ClampMagnitude (Vector3 vector, float maxLength);
返回 vector 的副本,其大小被限制为 maxLength

    public float radius = 1;
    Vector3 v;
    // Update is called once per frame
    void Update()
    {
        transform.position = Vector3.ClampMagnitude(transform.position, radius);   
    }
    private void OnGUI() {
        v = transform.position;
        GUILayout.TextArea("vector:"+ v.ToString() +" ClampMagnitude:" + v.magnitude.ToString());
    }

在这里插入图片描述
可以看到物体被限制在1的范围内(原点为中心,1为半径活动)

Cross

public static Vector3 Cross (Vector3 lhs, Vector3 rhs);
两个向量的叉积。
两个向量的叉积生成第三个向量, 该向量垂直于两个输入向量。结果的大小等于: 将两个输入的大小相乘,然后乘以输入之间角度的正弦值,即|a||b|sinθ。 可以使用“左手规则”确定结果向量的方向。
在这里插入图片描述

   Vector3 cross;

    // Update is called once per frame
    void Update()
    {
        cross = Vector3.Cross(transform.position,Vector3.up);
        Debug.DrawLine(Vector3.zero ,transform.position, Color.blue);
        Debug.DrawLine(Vector3.zero ,Vector3.up, Color.green);
        Debug.DrawLine(Vector3.zero ,cross, Color.red);
    }

在这里插入图片描述

Distance

public static float Distance (Vector3 a, Vector3 b);
返回 a 与 b 之间的距离。

Vector3.Distance(a,b) 与 (a-b).magnitude 相同。

【注意理解:向量表示的是大小和方向,与位置无关】

Dot

public static float Dot (Vector3 lhs, Vector3 rhs);
两个向量的点积

点积是一个浮点值,它等于 将两个向量的大小相乘,然后乘以向量之间角度的余弦值。
对于 normalized 向量,如果它们指向完全相同的方向,Dot 返回 1; 如果它们指向完全相反的方向,返回 -1;如果向量彼此垂直,则 Dot 返回 0。

MoveTowards

public static Vector3 MoveTowards (Vector3 current, Vector3 target, float maxDistanceDelta);
计算 current 指定的点与 target 指定的点之间的位置,移动距离不超过 maxDistanceDelta 指定的距离。

        // Move our position a step closer to the target.
        var step =  speed * Time.deltaTime; // calculate distance to move
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);

【这里我原来比较难以理解的是,向量不应该是与位置无关的吗,为什么还能标定起始点还有移动这种概念。我自己理解了下,这个Vector3 的moveTowards 实际上就是沿着(target - current)方向进行移动,移动大小不超过|target - current|和maxDistanceDelta,所以说还是向量的方向和大小的概念,所谓的位置改变针对的是position而已,更像是对物体施加一个力,力只有方向和大小,与位置无关,只是这个力使物体产生了位移了罢】

其他变换类似

Lerp 在两个点之间进行线性插值。
RotateTowards 将向量 current 朝 target 旋转。
Slerp 在两个向量之间进行球形插值。
SmoothDamp 随时间推移将一个向量逐渐改变为所需目标。

Max

public static Vector3 Max (Vector3 lhs, Vector3 rhs);
返回由两个向量的最大分量组成的向量。

 // prints (4.0f, 3.0f, 3.0f)
print(Vector3.Max(new Vector3(1, 2, 3), new Vector3(4, 3, 2)));

Min

返回由两个向量的最小分量组成的向量。

Scale

将两个向量的分量相乘。

// This will compute Vector3(2, 6, 12)
print(Vector3.Scale(new Vector3(1, 2, 3), new Vector3(2, 3, 4)));

下面是比较不好理解的几个

OrthoNormalize 将向量标准化并使它们彼此正交。

public static void OrthoNormalize (ref Vector3 normal, ref Vector3 tangent);
public static void OrthoNormalize (ref Vector3 normal, ref Vector3 tangent, ref Vector3 binormal);
将向量标准化并使它们彼此正交。
标准化 tangent。 标准化 tangent 并确保其与 normal 正交(即它们之间的角度为 90 度)。

    public Transform obj1;
    public Transform obj2;
    Vector3 a,b,c,d,e,f;

    // Update is called once per frame
    void Update()
    {
        a =transform.position;
        b = obj1.position;
        c = obj2.position;
        d = a;
        e = b;
        f = c;
        Vector3.OrthoNormalize(ref a, ref b, ref c);
        Debug.DrawLine(Vector3.zero,d,Color.yellow);
        Debug.DrawLine(Vector3.zero,e,Color.white);
        Debug.DrawLine(Vector3.zero,f,Color.black);
        Debug.DrawLine(Vector3.zero,a,Color.red);
        // 注:绿色切线我延长了,方便观察
        Debug.DrawLine(Vector3.zero,b*10,Color.green);
        Debug.DrawLine(Vector3.zero,c,Color.blue);
        Debug.DrawLine(d,e,Color.grey);
    }

在这里插入图片描述
从图中可以看到,生成的切线、次法线只与第一和第二个参数有关,所以提供了一个两个参数的函数。
其中生成的切线(绿色)与 向量a和向量b同平面,且垂直于向量a,生成的次法线(蓝线)垂直于法线(红线)与切线(绿线)。

Project 将向量投影到另一个向量上。

public static Vector3 Project (Vector3 vector, Vector3 onNormal);
在这里插入图片描述

    public Transform target;
    public Vector3 rail;
    private void Update() {
        Vector3 heading = target.position-transform.position;
        Vector3 project = Vector3.Project(heading,rail);
        Debug.DrawLine(transform.position,target.position,Color.green);
        Debug.DrawLine(transform.position,transform.position + project,Color.red);
    }

在这里插入图片描述

ProjectOnPlane 将向量投影到由法线定义的平面上(法线与该平面正交)。

public static Vector3 ProjectOnPlane (Vector3 vector, Vector3 planeNormal);
两个投影和数学概念一致

public Transform target;
    public Vector3 rail;
    private void Update() {
        Vector3 heading = target.position-transform.position;
        Vector3 project = Vector3.ProjectOnPlane(heading,rail);
        Debug.DrawLine(transform.position,target.position,Color.green);
        Debug.DrawLine(transform.position,transform.position + project,Color.red);
        Debug.DrawLine(transform.position,transform.position+rail,Color.white);        
    }

在这里插入图片描述

Reflect 从法线定义的平面反射一个向量。

public static Vector3 Reflect (Vector3 inDirection, Vector3 inNormal);
在这里插入图片描述

public Transform target;
    public Vector3 rail;
    private void Update() {
        Vector3 heading = transform.position-target.position;
        Vector3 reflect = Vector3.Reflect(heading,rail);
        Debug.DrawLine(transform.position,target.position,Color.green);
        Debug.DrawLine(transform.position,transform.position + reflect,Color.red);   
        Debug.DrawLine(Vector3.zero +transform.position,transform.position + rail,Color.white);    
    }

在这里插入图片描述

结言

ok,花了两天终于把Vector搞完了,内容也挺多的,之前transform没懂的部分在这块也补充了。
加油!继续输入输出~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/9968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现一个简单但有趣的AR效果(Web)

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。

MySQL 库操作

目录 创建数据库 语法 案例 字符集和校验规则(建数据库/建表用) 查看系统默认字符集以及校验规则 db.opt 更改 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 排升序 操纵数据库 查看数据库 显示创建语…

洛谷P2822:组合数问题 ←(帕斯卡法则+取模+前缀和)

【题目来源】https://www.luogu.com.cn/problem/P2822https://www.acwing.com/problem/content/525/【题目描述】 组合数​表示的是从n个物品中选出m个物品的方案数。举个例子:从(1,2,3)三个物品中选择两个物品可以有(1,2),(1,3),(2,3) 这三种…

MySQl_1

一.相关概念 数据库:存放数据的仓库 数据库管理系统:操作和管理数据库的大型软件,如mysql SQL:一种操作 关系型数据库管理系统的语言,定义了一套操作关系型数据库管理系统的统一标准。 关系型数据库:有多…

客户案例 | 迎接智能化浪潮,传统水厂数字化势在必行

关键发现 客户痛点:传统水厂业务离散,无法实现数据实时同步,为收集和分析处理数据并辅助决策带来障碍。需要智能化管理系统帮助水厂提升管理效率,优化管理流程,实现数字化、智能化的目标。 解决方案:天津腾…

PyTorch深度学习实战 | 基于ResNet的人脸关键点检测

人脸关键点检测指的是用于标定人脸五官和轮廓位置的一系列特征点的检测,是对于人脸形状的稀疏表示。关键点的精确定位可以为后续应用提供十分丰富的信息。因此,人脸关键点检测是人脸分析领域的基础技术之一。许多应用场景(如人脸识别、人脸三维重塑、表情…

Mariadb10.5基于同服务器多实例主从配置

本次部署环境:Centos8stream 本次部署mariadb版本: mariadb:10.5 本次部署方式:rpm包直接安装,并通过systemd直接托管 可以参考 /usr/lib/systemd/system/mariadb.service 该文件 # Multi instance version of mariadb. For i…

python wannier90 基于wannier90的*_hr.dat文件选取截断hopping绘制能带图

我们知道wannier90可以根据选取TMDs的轨道信息生成详细的hopping energy *_hr.dat文件,选取所有的hopping绘制起来的时候比较简单,但是我们发现取几圈的近似hopping也可以将band表示出来,类似的思想有Pybinding的三带近似(DOI: 10…

初中级Android工程师如何快速成长寻求突破

前言 写这篇文章的初衷是看到很多同学在一家公司工作了三五年,因为技术没有得到提升而随着年龄的增长导致不敢提出涨薪和跳槽找工作。希望这篇文章能够给这些还是初中级Android工程师的朋友一些启发。 快速成长 我们在向领导提出加薪申请或者是准备跳槽到更大的平…

【论文阅读】On clustering using random walks

《On clustering using random walks》阅读笔记 1. 问题建模 1.1 问题描述 let G(V,E,ω)G(V,E,\omega)G(V,E,ω) be a weighted graph, VVV is the set of nodes, EEE is the edge between nodes in VVV, ω\omegaω is the function ω:E→Rn\omega&#xff1a…

初识掌控板2.0、官方拓展板和配套编程软件mpython

不是广告!!不是广告!! 一、掌控板2.0概览 掌控板又名掌上联网计算机,是一款为青少年学习Python编程和创意制造,特别是物联网应用而设计的开源硬件。内置microPython开源嵌入式Python运行环境,可…

快排非递归 归并排序

递归深度太深会栈溢出 程序是对的&#xff0c;但是递归个10000层就是栈溢出 int fun(int n) {if (n < 1){return n;}return fun(n - 1) n; }所以需要非递归来搞快排和归并&#xff0c;在效率方面没什么影响&#xff0c;只是解决递归深度太深的栈溢出问题 有的能直接改&am…

快速尝鲜Oracle 23c免费开发者版,惊喜多多

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Matplotlib数据可视化

Matplotlib是⼀个Python 2D&#xff0c;3D绘图库&#xff0c;它以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形。 MatplotlibMatplotlib中文网、Matplotlib官方中文文档。https://www.matplotlib.org.cn/ 1.模块导⼊ import matplotlib.pyplot as plt #使⽤py…

代码随想录算法训练营第六天|242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

文章目录哈希表242 有效的字母异位词思路代码总结349 两个数组的交集思路代码总结202 快乐数思路代码总结1 两数之和思路代码总结哈希表 哈希碰撞&#xff1a;拉链法&#xff08;链表&#xff09;线性探测法&#xff08;顺序向后&#xff09; std::unordered_map, std::unorde…

nacos集群搭建

1.本实验使用四台centos7主机&#xff0c;均关闭防火墙和selinux服务 2.数据库选择 不推荐使用nacos自带的嵌入式数据库derby&#xff0c;因为需要保证数据的一致性&#xff0c;本集群使用mysql数据库&#xff0c;因为nacos自带的嵌入式数据库derby是每个nacos服务一个数据库…

Vue - 超详细 Element 组件库主题颜色进行 “统一全局“ 替换,将默认的蓝色主题色更换为其他自定义颜色(保姆级教程,简易且标准全局替换主题色)

前言 网上的文章可以用乱七八糟来形容了,各种奇葩的引入、安装各种东西,本文提供简洁且符合官方标准的解决方案。 Element UI 默认主题色是蓝色,很可能与我们设计稿不一致(比如设计稿是绿色主题), 这时候问题就出现了,难不成每个组件都要来一遍颜色样式覆盖? 绝对不可…

Python 进阶指南(编程轻松进阶):四、起个好名字

原文&#xff1a;http://inventwithpython.com/beyond/chapter4.html 计算机科学中最困难的两个问题是命名事物、缓存失效引起错误."这个经典的笑话&#xff0c;出自利昂班布里克之手&#xff0c;并基于菲尔卡尔顿的一句话&#xff0c;包含了一个真理的核心&#xff1a;很…

第2章 微服务架构的构建

2.1搭建父工程 第一步:新建maven工程,java8 第二步:设置字符编码 第三步:注解激活生效 2.2父工程的pom文件 <?xml version="1.0" encoding="UTF-8

十分钟教你部署一个属于自己的chatgpt网站

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…