unity3d math 常用的数学

2023-10-29

1.计算游戏中敌人被击退的方向:类似

   Vector3 lhs = (Vector3) (this.parentChara.MoveDirection * this.parentChara.MoveSpeed);
            Vector3 rhs = component.parentChara.myTransform.position - this.parentChara.myTransform.position;
            rhs.y = 0f;
            float num = Vector3.Dot(lhs, rhs);
            if (num > 0f)
            {
                component.parentChara.PushVelocity += (Vector3) ((rhs.normalized * num) * 0.5f);
            }

2.Vector.dot

Vector3.Dot也叫点积,它返回1个-1.0~1.0之间的一个值。网上确实也这么说。但是这个值表示什么呢?恩,表示返回进行Dot计算的两个向量之间的夹角余弦值(Cos弧度角).要注意的是能进行Dot计算的前提是两个向量首先要变成单位向量!

public class DotTest : MonoBehaviour {

 

public Vector3 v1;

public Vector3 v2;

public float dot;

public float cos;

// Use this for initialization

void Start () {

v1 = new Vector3(2,2,0);

v2 = new Vector3(100);

}

 

// Update is called once per frame

void Update () {

 

dot = Vector3.Dot(v1.normalized, v2.normalized);

cos = Mathf.Cos(Mathf.PI/4);

 

}

}


一、点积(又称“数量积”、“内积”)

    1、理论知识

   在数学中,点积的定义为a·b=|a|·|b|cos<a,b> 【注:粗体小写字母表示向量,<a,b>表示向量a,b的夹角,取值范围为[0,π]】。从定义上,我们知道向量的点积得到的是一个数值。而不是向量(这点大家要注意了!要与叉积进行区别)。另外点积中的夹角<a,b>没有顺序可言,即<a,b>=<b,a>(或a·b=b·a)。所以我们可以通过点积得到两个向量之间的夹角。<a,b>= arccos(a·b / (|a|·|b|))。并且通过点积的正负值,我们可以判断两个向量的方向关系。如果为正,即>0,他们夹角为(0,π/2)。如果为负,夹角为(π/2,π)。

   2、Unity3D中应用

   在Unity中,点积表示为Vector3.Dot(Vector3,Vector3):float——参数为2个向量,返回值为浮点型。

using UnityEngine;
using System.Collections;
 
public class Vector3_Dot : MonoBehaviour {
     
     //向量a
    Vector3 a;
     //向量b
    Vector3 b;
     
    void Start()
    {
         //向量的初始化
        a = new Vector3(3, 0, 0); //x轴方向,长度为3
        b = new Vector3(Mathf.Sqrt(2), Mathf.Sqrt(2), 0); //(根号2,根号2,0)
    }
 
    void OnGUI()
    {
         //点积的返回值
        float c=Vector3.Dot(a,b);
         //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        float angle=Mathf.Acos( Vector3.Dot(a.normalized,b.normalized))*Mathf.Rad2Deg;
        GUILayout.Label( "向量a,b的点积为:" + c);
        GUILayout.Label( "向量a,b的夹角为:" + angle);
    }
     
}

a.normalized表示该方向的单位向量,即方向与向量a相同,长度为1的向量。Mathf.Acos()即数学中的arccos()函数。Mathf.Rad2Deg表示将弧度转化为角度。

结果如下图:


二、叉积(又称“向量积”、“外积”)

   1、理论知识

   数学上的定义:c=axb【注:粗体小写字母表示向量】其中a,b,c均为向量。即两个向量的叉积得到的还是向量!

   性质1:c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面。

   性质2:模长|c|=|a||b|sin<a,b>

   性质3:满足右手法则。从这点我们有axb ≠ bxa,而axb = - bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。

   2、Unity中应用

   在Unity中,叉积表示为Vector3.Cross(Vector3,Vector3):Vector3——参数为2个向量,返回值也为向量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using UnityEngine;
using System.Collections;
 
public class Vector3_Cross : MonoBehaviour {
 
     //向量a
    Vector3 a;
     //向量b
    Vector3 b;
 
    void Start()
    {
         //向量的初始化
        a = new Vector3(3, 0, 0); //x轴方向,长度为3
        b = new Vector3(0, 4, 0); //y轴方向,长度为4
    }
 
    void OnGUI()
    {
         //叉积的返回值
        Vector3 c = Vector3.Cross(a, b);
        Vector3 d = Vector3.Cross(b, a);
         //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        float angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;
        GUILayout.Label( "向量axb为:" + c);
        GUILayout.Label( "向量bxa为:" + d);
        GUILayout.Label( "向量a,b的夹角为:" + angle);
    }
}

Vector3.Distance()用于计算2个Vector3的距离,在这里我们可以得到叉积向量的模长。

结果如下图:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity3d math 常用的数学 的相关文章

  • Redis在实际项目中的使用

    redis host 127 0 0 1 port 6379 database 0 pool max idle 20 min idle 1 max active 20 max wait 60000 import org springfram
  • PCB快捷键的设置及推荐

    今天我们来讲解一下 在AD20中PCB快捷键是如何设置的 以及推荐给大家一些常用的快捷键的设置 废话不多说 直接进入主题 快捷键是如何设置的 就拿我们最常用的走线来举例 我们按住Ctrl键 鼠标左键点击走线 出现如下界面 我们可以在可选的下
  • (总结)Oracle 11g常用管理命令(用户、表空间、权限)

    总结 Oracle 11g常用管理命令 用户 表空间 权限 发表于 DataBase Linux Oracle Shell 个人日记 原创总结 作者 谋万世全局者 标签 11g Linux oracle 常用 总结 权限 用户 管理命令 表
  • 分享通过复旦微魔方来找到FM33LG048串口3无法发送和接收原因的例子

    今天来分享一个关于开发国产芯片 复旦微FM33LG048 串口3时候遇到一个无法发送和接收原因 通过使用官网的图形配置工具来成功解决问题的案例 具体情况是这样的 该芯片官网有提供相应的keil参考例子 因为我要用到这个芯片上面的五个串口 所
  • 交叉编译移植 lighttpd fastcgi 以及自己的fastcgi程序

    1 前期准备 安装 arm linux gcc 编译器可能用到指令 vim etc profile 在文件末尾添加 export PATH XXXXX PATH xxxxx 代表安装的交叉编译器的可执行文件的路径 source etc pr
  • 安装openssh-server失败解决

    sudo apt get install openssh server Reading package lists DoneBuilding dependency treeReading state information DoneSome
  • yum安装zabbix包失败问题

    我们使用yum安装zabbix的相关软件包时如果显示安装失败 那么原因基本就是访问外国网址造成的 有效的解决办法就是把zabbix的源换成国内的 vim etc yum repos d zabbix repo zabbix name Zab
  • 实体关系图 (ERD) 指南

    在本指南中了解有关实体关系图 ERD 它们的用途 如何理解它们 如何创建它们等的所有信息 实体关系图 ERD 是一种图表 可让您查看不同实体 例如人员 客户或其他对象 在应用程序或数据库中如何相互关联 它们是在设计新系统时创建的 以便开发团
  • 关于Excel不能显示加载项的问题解决

    20160322 Microsoft 2010版本 Excel不显示加载项 没有截图 点击 文件 gt 选项 gt 加载项 查看应用程序禁用的加载项 将其在下面选项中启用 若启用后还是不成功 软件会显示错误信息 按照信息查找缺失的文件VST
  • ES6中let和const关键字与var关键字之间的区别?

    聚沙成塔 每天进步一点点 专栏简介 变量作用域 Scope 变量提升 Hoisting 重复声明 初始化 全局对象属性 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅
  • 环境配置—Cuda和Cudnn版本对应关系

    文章与视频资源多平台更新 微信公众号 知乎 B站 头条 AI研习图书馆 深度学习 大数据 IT编程知识与资源分享 欢迎关注 共同进步 1 Cuda和Cudnn版本对应关系 官网链接 点击打开链接 2 常见版本对应关系 cuDNN Archi
  • HIS、CIS、LIS、EMR、PACS、RIS、CAD以上在医疗行业都是指哪些系统

    HIS Hospital Information System 医院信息管理系统 包含门诊和住院两部分 以药品和收费为主CIS Clinical Information System 临床信息系统 LIS Laboratory Inform
  • QWidget提升后,无法对提升的对象设置背景颜色,QFrame却可以。

    QWidget提升后 不能直接用setStyleSheet 对QWidget这个提升对象的背景颜色和样式做调整了 但是 如果是QFrame 的提升类 却可以用setStyleSheet 对QFrame的提升对象做样式调整 具体现象见下方实列
  • 项目周期性总结(一)

    加入新公司到现在即将三个月 新的项目从筹备分析 到设计开发 经历各种BUG 丛没有一个人试着做一个项目 虽然有BOSS的帮助 但还是会遇到很多各种各样的问题 今天抽空就总结一下 进来的问题与得失 1 项目分析 项目开发中 任何软件开发都必不
  • elasticsearchTemplate 更新数据

    Map
  • Linux 安装nrm报错 require() of ES modules is not supported

    centos7 安装nrm报错 require of ES modules is not supported usr local lib node modules nrm cli js 9 const open require open E
  • ubuntu18 安装jenkins

    1 搭建好jdk环境 2 按照官网走Debian Jenkins Packageshttps pkg jenkins io debian 3 install jenkins报错 Errors were encountered while p
  • 用tf.slim微调vgg模型时遇到的小坑

    首先 我进行微调的时候 代码并非slim提供的train image classifier py 而是自己的代码 我查了slim中的代码 应该是不会出现我文中的问题 我是在微调完inception模型后 修改代码 想要微调vgg 但是出现如
  • 设计模式之单例模式(Singleton)

    单例模式通常用于整个应用只存在一个类的实例的场景 单例模式分为懒汉式与饿汉式 实现的方式可以通过普通的class 也可以通过enum实现 1 饿汉式 对于应用启动后的访问响应时间要求高的应用可以尝试使用 性能消耗主要在创建对象上 单例模式

随机推荐