Unity3D_向量(Vector3)数学基础

article/2025/10/18 19:00:58

向量(Vector3)

在虚拟的游戏世界中,3D数学决定了游戏,如何计算和模拟出开发者以及玩家看到的每一帧画面。学习基础的3D数学知识可以帮主用户对游戏引擎产生更深刻的了解。 
向量定义:既有大小又有方向的量叫做向量。在空间中,向量用一段有方向的线段来表示。应用十分广泛,可用于描述具有大小和方向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察方向、刚体受到的力等都是向量。因此向量是物理、动画、三维图形的基础。 
与向量相对的量成为标量:即只有大小没有方向的量。例如物体移动中的平均速率、路程。 
:向量的长度标准化(Normalizing):保持方向不变,将向量的长度变为1. 
单位向量:长度为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轴坐标进行加法运算 
    例如以下的代码

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);
  • 如果v1和v2都表示一个点的话,那么v3的方向是从v1开始指向v2的一个带有箭头的射线 此时v3就是一个向量 

如果v1和v2都表示一个向量的话,那么v3是一个从v1的尾部指向v2的头部的一个带有方向箭头的一条射线 
这里写图片描述 
向量减法 
向量加法就是两个向量对应的x,y,z轴坐标进行减法运算 
例如以下的代码

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);
  • 其实就是从向量b头部指向向量a头部的一个向量 

向量减法图片 
向量数乘 
实数和向量相乘的过程就是数乘 
如果实数大于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| 
    性质1c⊥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

obj1.transform.position = Vector3.Lerp(obj1.transform.position, obj2.transform.position, 0.1f);
  • 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 initializationvoid Start () {Vector3 v1 = new Vector3(1, 0, 0);Vector3 v2 = new Vector3(1, 0, 1);TestDot(v1, v2);}// Update is called once per framevoid 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.Dot(a.normalized,b.normalized);Debug.Log("result = " + result);// 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)  float radians = Mathf.Acos(result);angle = radians * Mathf.Rad2Deg;Debug.Log(angle);}}
  • 叉乘

 


http://chatgpt.dhexx.cn/article/FbI4lV6v.shtml

相关文章

Vector3类详解

|| 欢迎讨论技术的可以相互加微信&#xff1a;windgs (请备注csdnxx职业) || --------------------- 作者&#xff1a;隨意的風 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/Windgs_YF/article/details/86550843 版权声明&#xff1a;本文为博主原创文章…

面试真的被问麻了......

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

实事求是,虚事求应

休谟之问&#xff0c;能否从“是”中得“应”&#xff1f;孟子回答说&#xff1a;二者不可得兼&#xff0c;舍身&#xff08;是&#xff09;取义&#xff08;应&#xff09;者也。 ​ 智能涉及人、机、环境三部分&#xff0c;其中人通过算计形成的意图、直觉、抽象等&#xff0…

管理就要“实打实”

https://www.toutiao.com/a6642491590042452483/ 2019-01-07 10:13:32 导语 如何才能使得企业的经营管理高效呢&#xff1f;这个问题没有什么捷径可走&#xff0c;唯有实打实的来落实各项工作。归纳起来就是三个方面的内容&#xff1a;说实话、办实事、讲实效。 一、 说实话…

8分钟的面试,我直呼太变态了......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你

&#x1f497;作者简介&#xff1a;大家好&#xff0c;我是卷心菜~~&#xff0c;第二季新星计划java领域第十名。&#x1f4dd;个人主页&#xff1a;卷心菜的CSDN博客&#x1f4d5;系列专栏&#xff1a;本文写在Java设计模式专栏&#xff1a;不就是java设计模式吗&#x1f4e7;…

Java岗:实打实掌握[Java多线程]和[并发编程]

概述 面试中&#xff0c;多线程和并发编程已经是必不可少的了&#xff0c;我经常看到此类问题&#xff0c;当时也简单了解过&#xff0c;什么继承Thread类&#xff0c;实现Runnable接口&#xff0c;这些都被说烂了&#xff0c;知道这些当然是远远不够的&#xff0c;于是这几天…

我用Java能干什么?

Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0c;…

什么是JAVA?JAVA能做什么?

什么是Java&#xff1f; Java既是一种编程语言&#xff0c;又是一个平台。 Java程序语言 Java是具有以下特征的高级程序语言&#xff1a; 简单   面向对象   可分布   可解释   强壮   安全性   结构化   轻便   功能强大   多线程   动态 Java既可以被编译…

Java是什么?主要是干什么的?

随着Java技术不断发展&#xff0c;许多人都想问&#xff1a;Java是什么?主要是干什么的呀&#xff1f;现在小朗来为大家解惑。java是一种高级计算机语言&#xff0c;一种可以编写跨平台应用软件、完全面向对象的程序设计语言。那Java主要是干嘛的呀&#xff1f; 一、java可以做…

学java可以从事什么工作-java岗位有哪些?

学java可以从事的工作主要有&#xff1a;企业级应用开发、网站开发、软件开发、嵌入式领域、大数据、科学应用等。java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。 1、企业级应用开发 企业级应用开发大可以做全国联网的系统&#xff0c;小到中小企…

Java到底能做什么事情呢?

相信很多小伙伴看到标题第一个出现在脑海里的想法是赚钱,难道你们只知道java薪资高?那么你太low,Java的应用领域很广,可以说是现在最普及的,遍布各行各业,可见其优势所在。 1、大数据领域 Hadoop以及其他大数据处理技术普遍用的都是Java,当然其他语言也有用到,基于Jav…

Java编程到底能干什么,可以从事哪些岗位?

听说程序员工资很高&#xff0c;想学Java语言&#xff0c;但不知道它到底能做什么&#xff1f;” 如果你是一个Java初学者&#xff0c;你可能对Java应用在什么地方感到困惑。除了“马里奥”“贪吃蛇”等经典游戏&#xff0c;其他领域好像也找不到Java的踪迹&#xff0c;那么Jav…

Java是用来干什么的?

Java是用来干什么的&#xff1f;这个问题首先我们得知道这个“Java”是个什么东西&#xff1f; Java是什么 有问题“百度一下&#xff0c;你就知道”&#xff0c;输入“Java”关键词&#xff0c;我们会看见“百度百科”对Java较官方的解释&#xff0c;看就是下图&#xff1a; …

Java是什么?Java能干嘛?

我刚开始学习Java的时候&#xff0c;很长一段时间都有这么个疑惑&#xff1f; Java到底是啥&#xff1f;它能干什么&#xff1f; 自己也看过不少的课程和书&#xff0c;大部分都是从Java的发展史开始讲&#xff0c;总之就是那些什么Java历史悠久&#xff0c;Java很优秀&#x…

Java能做什么?学完Java可以从事什么工作呢?

如果你是一个Java初学者&#xff0c;你可能对Java应用在什么地方感到困惑。除了“马里奥”“贪吃蛇”等经典游戏&#xff0c;其他领域好像也找不到Java的踪迹&#xff0c;那么Java究竟能做什么&#xff1f;学完Java可以从事什么工作呢&#xff1f;本文&#xff0c;小千就来详细…

什么是JAVA?JAVA能用来干什么?

我刚开始学习Java的时候&#xff0c;很长一段时间都有这么个疑惑&#xff1f; Java到底是啥&#xff1f;它能干什么&#xff1f; 自己也看过不少的课程和书&#xff0c;大部分都是从Java的发展史开始讲&#xff0c;总之就是那些什么Java历史悠久&#xff0c;Java很优秀&#x…