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

news2025/1/19 2:57:09

目录

    • 向量复习
      • 高中向量基础
      • 【数学】向量的四则运算、点积、叉积、正交基
      • 叉乘公式
      • 叉乘运算定理
      • 向量、坐标系
      • 点积
      • 叉积
    • 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没懂的部分在这块也补充了。
加油!继续输入输出~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走出至暗时刻,手机“冲高”仍有新故事

随着数十年的发展变迁,智能手机行业已进入平稳发展期,在格局重塑的同时,也引来外界的质疑:出货量下滑,是否意味着行业开始进入至暗时刻? 事实上,这种质疑只看到表层的数据变化,没有…

[Java]Cookie机制

1.Session机制: Session机制https://blog.csdn.net/m0_71229255/article/details/130138826?spm1001.2014.3001.5501 2. 什么是cookie HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息&#xff0…

优维可观测轴心产品大观:HyperInsight超融合持续可观测解决方案

随着Kubernetes得到越来越广泛的采用,企业软件系统正在向复杂的云原生架构进行革命性转变。应用形式呈现有Web、APP、小程序等多种形式,访问的网络有4G、5G、Wi-Fi等。企业用云也从单一云时代,逐渐来到混合多云时代。在这些庞大复杂的多云环境…

【接口测试】从0不到1的心路历程

我是一名做了三年测试的tester,2020年以功能测试工程师的身份入职北京一家医疗培训公司,入职后为了提高测试效率,接触到接口测试,以下是从零到现在 (还有很大完善的空间,所以不能算是1) 的一些心路历程。 做接口测试的…

李宏毅教程系列——增强学习

目录 0. 强化学习wiki 1. 介绍 2. Exploration vs Exploitation 探索与开发 3. 各类最优化方法 3.1 Brute force猛兽蛮力法(暴力搜索) 3.2 Value function estimation(价值函数估计) 3.2.1 Monte Carlo methods 蒙特卡洛方…

linux安装南大通用数据库

linux安装南大通用数据库1、操作系统、数据库2、下载链接3、安装文档4、安装前准备4.1、以root用户创建 gbasedbt 组和用户4.2、创建 GBase 8s 数据库安装目录4.3、上传并解压安装包5、安装5.1、执行安装程序5.2、回车继续 直到接受许可条款5.3、输入安装目录绝对路径5.4、选择…

腾讯音乐笔试0414

介绍一 Triplet Loss的原理, 其中的样本分为哪几类?可以用于哪些场景? Triplet Loss是一种用于训练神经网络的损失函数,主要用于学习映射函数,将样本映射到低维空间中,使得同一类别的样本距离尽可能近,不同类别的样…

开发钉钉和企业微信微应用

钉钉应用开发流程: 1、登录钉钉后台管理 -- 应用管理 -- 工作台 -- 自建应用 2、上传内部应用logo和名字。注意需要添加可访问域名的配置。 3、配置首页可访问地址:打包到线上的路径(注意配置正式环境和本地环境) 4、在所在公司…

早有尔闻 | 低碳赋能,创新发展

01 2023中国管理科学大会 发布创新奖榜单 海尔位列第一 4月15日,2023中国管理科学大会暨第八届“管理科学奖”颁奖典礼在北京举行。大会发布了第八届中国管理科学学会“管理科学奖”获奖名单,海尔集团“基于用户端低碳升级的智慧能源管理体系建设”项…

[CVE漏洞复现系列]CVE2017_0147:永恒之蓝

Hi~ o( ̄▽ ̄)ブ 文章目录前言一、永恒之蓝是什么?1.SMB协议介绍。二、准备工作1.Windows7 and kali linux2.テストを開始总结前言 这是新的系列,我能力有限有的漏洞实现不了,我尽力吧 🥨🥨&…

Deep Glow(AE辉光特效插件)中文版安装教程

deepglow比AE自带的辉光效果好很多,基于GPU运算,同时控制调节发光效果,有了这款插件,我们就可以非常轻松的模拟出非常真实非常漂亮的物理发光特效,支持各种参数的自定义,喜欢的欢迎下载使用。 安装教程 1…

营收、净利创新高,股价却“跌跌不休”,紫光国微怎么了?

‍数据智能产业创新服务媒体——聚焦数智 改变商业要问当前科技圈处于“风口浪尖”的,除了ChatGPT就应该是半导体了。近日,紫光国微发布2022年年报,实现营收和净利双创新高。作为一家在集成电路设计领域深耕二十余年的企业,紫光国…

快速精简软件,如何让软件缩小到原来的5%大小,从删除文件入手,到修改C++引用库,合规解决存储问题

Hi~大家好,今天制作一个简单的精简软件的教学~ 事先说明下,精简软件并不违反任何规定,尤其是开源软件,这里也仅讨论开源软件的修改,根据几乎所有开源软件的开源规则,精简软件,本质也就是修改软件…

如何通过python实现一个web自动化测试框架?

要实现一个web自动化测试框架,可以使用Python中的Selenium库,它是最流行的Web应用程序测试框架之一。以下是一个基本的PythonSelenium测试框架的示例: 如果你想学习更详细的web自动化测试教程,我这边给你推荐一个详细的视频教程 …

第二章 webpack基础用法

webpack核心概念之entry Entry用来指定webpack打包的入口,下图中webpack找到入口文件后,会将该文件所有的代码和非代码依赖都梳理出来,最终遍历完依赖树后生成打包后的静态资源。 单入口:entry是一个字符串 module.exports{ entry…

HCIP之MPLS

目录 MPLS MPLS --- 多协议标签交换 包交换 标签交换 包交换的变更 MPLS主要应用于三大领域 ​编辑 MPLS和包交换一样,其过程也可以分为控制层面和数据层面 标签交换过程(数据层流量) 标签解读 静态搭建LSP 创建路由条件 配置MPL…

arduino自用简单图形化编程仿真

傻瓜式编程真的很适合初学者 这边就不提fritzing和proteus的pcb设计了 就推荐几个简单的 1、linkboy 官方网址:http://linkboy.com.cn/index.html 也有官方教程点我 使用方法:官网下载软件 优点:元器库特别丰富,还具备语音识别、…

新网站多久被google收录?谷歌当天收录网站靠谱吗?

新网站多久被google收录? 答案是:24小时内。 为什么你做的外贸网站在Google搜索引擎一直不收录或者收录很慢。 其实有一个很关键的原因,那就是谷歌爬虫到底有没有到你网站的页面上去抓取数据。 很大可能是没有,当然你可以通过…

ctfshow web入门 nodejs 334-341(更新中)

前言 说实在也没啥好说的,希望大家要有勇气,向难题挑战,别像我一样自始至终都是一个菜狗,哎。 这里在刚开始的,我就有一个问题就是我发现刚开始使用的是require来导入模块,但是到了后面发现大部分使用的都是…

5G网络优化工程师入职企业,都有什么不同呢?

通信行业内的网络优化工程师后期入职主要是在设备商、运营商,运营商的合作单位。 熟悉通信行业的同学肯定了解这个行业最基本的可以分为运营商和设备商,运营商在国内就是移动、联通、电信,广电四家,这四家目前不管是薪资、职业发展…