Unity学习日志_3D数学基础

unity3D关于旋转的积累 写在开头     空间向量是我目前学习开发游戏过程中的比较大的一个困难,所以在这里做一些笔记,将一些在开发过程中遇到的空间向量变换记录下来。 需求分析     在屏幕中拖拽箭头,箭头随着拖拽方向而改变指向方向。 涉及的知识点和小细节     需要注意的是unity3d中的各种坐标系 世界坐标 unity3d中使用的左手坐标系,如下图:  屏幕坐标系 要做的效果 在拖... 阅读详情

Unity学习日志_3D数学基础

1. Input类:

InputManager为开发者提供了官方的移动所需的变量。

1. 需要用的静态方法:

  1. GetAxis(string axisName);返回相应名称的虚拟轴值
  2. GetAxisRaw(string axisName);未经过平滑处理的GetAxis。
  3. 不要将Input.GetButton和GetKey系列方法用于物体移动。
    1. 这两个系列方法的返回值都为bool型,适合用来响应点击事件。
    2. 使用这两个系列的方法会将物体移动代码的操控写死。

2. Mathf类:

提供大量现成的数学运算的方法和常量。其函数均为静态函数。

舍入方法:Round(四舍五入),Ceil(向小取整),Floor(向大取整)等,三角函数:Cos,Sin,Tan等,限定范围:Clamp等,插值运算,指数运算,对数运算,等等一系列方法。

1. 三角函数:

1. 角度的度量:
  1. 角度degree
  2. 弧度radian
2. 角度与弧度转换:

弧度–》角度:数学公式:角度 = 弧度*180/PI;

角度–》弧度:数学公式:弧度 = 角度*PI/180;(求的结果是什么,什么就在分式的分子)

UnityAPI:

弧–》角:弧度*Mathf.Rad2Deg;

角–》弧:角度*Mathf.Deg2Rad;

3. 三角函数:

在unity中已知一边一角求另一边使用三角函数:

sinX = a/c(对边比斜边)

cosX = b/c(临边比斜边)

TanX = a/b(对边比临边)

在unity中已知两个边求角度使用反三角函数:

arcsin(a/c)= x;

arccos(b/c)= x;

arctan(a/b)= x;

UnityAPI提供的函数角度均需要换算为弧度。

UnityAPI提供的三角函数:

Mathf.San(弧度)

Mathf.Cos()

Mathf.Tan()

Mathf.Asin(a/c)

Mathf.Acos(b/c)

Mathf.Atan(a/b)

3. Vector3结构:

1. 向量:

  1. 有大小(模长)有方向的物理量。
1. 求向量模长:
  1. UnityAPI提供的变量:
    1. Vector3变量.magnitude;
  2. 数学公式:
    1. Mathf.sqrt(Mathf.Pow(x,2)+Mathf.Pow(y,2)+Mathf.Pow(z,2));
    2. Vector3.Distance(Vector3.Zero,vector);
2. 求向量方向:
  1. 求向量的方向也叫:“标准化向量”,“归一化向量”,即获得该向量的“单位向量”。
  2. 单位向量:模长为1的向量。所以向量的方向仍然是一个向量。
  3. 求向量方向的方法:
    1. 数学公式:
      1. Vector3 vectorDirection = vector/vector.magnitude;
    2. unityAPI:
      1. Vector3 vectorDirection = vector.normalized;
      2. Vector.Normalize();将自身变成自己的向量方向。
3. 向量相减:
  1. 两个向量详相减,结果仍然是一个向量。
  2. 各分量相减。
  3. 向量相减其大小为两向量之间的距离。Distance()方法的实现原理。
  4. 向量相减其方向为减数指向被减数(方向在游戏开发中非常重要)。
  5. 实际位置要移动到对应坐标系的原点(取决于相减的两个向量)。
  6. 如果只想要向量相减之后的方向,则需要把差向量标准化,防止受到模长的影响。
  7. 几何意义:对于a -= b;a向量末端的物体会向着b向量的反方向运动。物体本身方向是箭头的方向。
4. 向量相加:
  1. 两个向量相加,结果仍为一个向量,这也是Translate()方法的实现原理。
  2. 各分量相加。
  3. transform.Translate(vector);挂载本脚本的物体会向着vector向量的正方向移动。
  4. 几何意义:对于a += b;a向量末端的物体会向着b向量的正方向移动。(Translate内部代码)当然方向是箭头的方向。
5. 向量与标量的乘除(数乘/数除):
  1. 几何意义:向量模的缩放,方向不变。
  2. 各分量同时乘/除一个数值。
6. 点乘:
  1. 又称“点积”或者“内积”。

  2. 公式:各个分量乘积和。

    1. [x1,y1,z1]·[x2,y2,z2] = x1x2+y1y2+z1*z2;
  3. 点积的结果是一个标量。

  4. 几何意义:a·b = |a|*|b|*cos<a,b>

  5. 如果两个向量均为单位向量则,a·b = cos<a,b>

  6. 点乘的几种情况:

    1. 结果为0:两向量垂直。
    2. 结果大于0:两个向量的夹角为锐角。
    3. 结果小于0:两个向量的夹角为钝角。
  7. 点积的应用:

    1. 求两个向量之间的夹角的余弦值。之后使用反余弦函数解得弧度或者角度。

      1. float dot = Mathf.Dot(a1.normalized,a2.normalized);
      2. Angel = Mathf.Acos(dot)*Mathf.Rad2Deg;
    2. 判断是否进入攻击范围

      1. 圆形攻击范围:使用Vector3.Distance判断。

      2. 扇形攻击范围:使用Vector3.Dot(transform.position+this.transform.forward,playerVector-enemyVector)来判断。判断角度是否小于一个值。小于则说明进入攻击范围。

在这里插入图片描述

7. 叉乘:
  1. 又称“叉积”或者“外积”。
  2. 公式:[x1,y1,z1]X[x2,y2,z2] = (y1z2-y2z1,x1z2-x2z1,x1y2-x2y1)。
  3. 几何意义:结果为一个向量,且为两个向量所组成平面的垂直向量。其模长为两个向量模长的乘积再乘其夹角的正弦值。即|aXb| = |a|*|b|*sin<a,b>。
  4. UnityAPI:Vector3 vector = Mathf.Cross(a,b);
  5. 叉乘应用:
    1. 创建垂直于两向量的向量。
    2. 判断两个向量的相对位置。
    3. 判断相对位置,物体在左边还是右边。

2. 欧拉角:

  1. 使用三个角度来存储物体方位。

  2. X和Z沿自身坐标轴旋转,Y沿世界坐标轴旋转。

  3. API:Vector3 eulerAngle = this.transform.eulerAngles;

  4. 与向量不同,这里的欧拉角只是借用了Vector3这个结构体,所以欧拉角并没有方向和大小,其表示的是各个分量的偏移角度。

  5. 优点:

    1. 只使用三个数来存储物体方位,占用空间小。
    2. 沿坐标轴旋转为单位的角度,符合人的思考。
    3. 任意三个数都是合法的,不存在不合法的欧拉角。
  6. 缺点:

    1. (导致角的表示不唯一)为保证每个角度都是唯一的,unity引擎限制了欧拉角的取值:X轴限制在-90到90度,Y,Z轴限制在0到360度。
    2. 万向节死锁:当物体沿X轴旋转到±90度时,Z轴与世界Y轴会重合,此时再沿Z或者Y旋转时就会失去一个自由度。默认规定此时旋转由Y轴完成,Z轴为0。

4. 四元数结构:

在unity中有单独的Quaternion类。详细方法请参考unity手册。

  1. Quaternion在3D图形学中代表旋转,由一个三维向量(X/Y/Z)和一个标量(W)组成。

  2. 旋转轴为V,旋转弧度为θ。使用四元数来表示则四个分量为:

    1. qt.x = sin(θ/2)V.x(旋转轴的x分量)
    2. *qt.y = sin(θ/2)*V.y(旋转轴的y分量)
    3. qt.z = sin(θ/2)*V.z(旋转轴的z分量)
    4. qt.w = cos(θ/2)
    5. 这里的θ为弧度,unity中计算角度都为弧度。
    6. X,Y,Z,W的取值范围都为-1到1。
  3. Inspector面板的rotation为四元数类型,但展示给用户的输入口为欧拉角类型。其内部原理是使用Quaternion.Euler()来将输入的欧拉角转换为四元数。

  4. API创建四元数:Quaternion qt = new Quaternion();

  5. 四元数之间通过相乘实现角度累加的效果:

    1. qt *= Quaternion.Euler(10,0,0) 等同于下面的欧拉角
    2. Vector3 vt += new Vector3(10,0,0)
  6. 四元数的优点:

    1. 避免万向节死锁
  7. 四元数的缺点:

    1. 难于使用
    2. 存在不合法的四元数。
  8. 四元数要和欧拉角配合使用,相互互补。

  9. 通过代码访问当前物体的角度:

    1. 欧拉角:this.transform.eulerAngles
    2. 四元数:this.transform.rotation
  10. 四元数计算(四元数没有加减操作):

    1. 四元数 * 四元数 实现旋转效果的组合。
    2. 四元数 * 向量 实现向量旋转四元数大小的角度。此相乘必须为左乘。

5. 坐标系

unity坐标系为左手坐标系,四指指向z轴方向,向x轴弯曲,大拇指指向Y轴方向。

Unity坐标系:

World space:世界坐标系
  1. 整个场景的固定坐标。
  2. 作用:在游戏场景中表示每个游戏对象的位置和方向。
Local space:自身坐标系
  1. 每个物体的独立坐标系,随物体的移动或者旋转而改变。
  2. 用于表示物体间的相对位置和方向。
Screen space:屏幕坐标系:
  1. 以像素为单位,屏幕左下角为(0,0)点,右上角为(Screen.width,Screen.Height)。屏幕坐标系隐式保留了z轴以方便坐标系的转换。z轴表示到相机的距离。
  2. 用于表示物体在屏幕的位置。
Viewport space:视口坐标系:
  1. 左下角为(0,0)右上角为(1,1),和屏幕坐标系一样保留了z轴,z轴表示到相机的距离。
  2. 用于表示物体在相机中的位置。

坐标系转换:

Local --》World:
  1. transform中提供的一些常量:

    1. transform.forward ==> rotation * Vector3.forward
    2. transform.right ==> rotation * Vector3.right
    3. transform.up ==> rotation * Vector3.up
    4. 会随着物体一起旋转,但如果想要跟随物体还需要加position
  2. transform.TranformPoint(Vector3 vector):

    1. 转换点,受到物体位置,旋转,缩放影响(转换方向矢量请使用TransformDirection)。
  3. transform.TransformDirection(Vector3 vector):

    1. 转换方向,只受物体旋转影响。
  4. transform.TransformVector(Vector3 vector):

    1. 受物体旋转和缩放影响。
World --》Local:
  1. 在转世界坐标系的方法前面加Inverse
World --》Screen/ViewPoint:
  1. 相机引用.WorldToScreen[Viewpoint]Point(Vector3 vector);
Screen/ViewPoint --》World:
  1. 相机引用.Screen[Viewpoint]ToWorldPoint(Vector3 vector);
Unity三维数学(三角函数) 三角函数 分为: 角度Degree 弧度Radian 当弧度 = 圆半径 = 1/3(Π)派//PI = 1 弧度; 角度与弧度的换算 PI = 180°; 1弧度 = 180°/PI; 1角度 = PI /180° 角度--->弧度的换算: 角度数 x PI/180° = 弧度 ... 阅读详情

相关推荐

Unity 3D 捕获错误日志 打印在屏幕上

错误日志的现场往往是非常珍贵的,我们需要尽可能的将错误日志保存下来。如果是移动平台,保存和提取日志其实不方便。所以可以监听错误以及异常,并及时打印在屏幕上。 using System.Collections.Generic; using UnityEngine; public class ErrorLogOnGUIMyTools : MonoBehaviour { private...

songhuanfei2017的博客 5019

Unity】Unity 几何知识、弧度、三角函数、向量运算、点乘、叉乘

角的度量方式分为角度(Degree)和弧度(Radian)两种。角度就是将一个圆形切成360份,每一份就是1度角。弧度是当弧长等于圆的半径时即为1弧度。

习惯冬天的静谧 2401

自己写得一个Unity 3d日志打印工具类

using UnityEngine; using System.IO; using System; public class Debuger : MonoBehaviour { public static bool EnableLog; public static bool EnableTime = false; public static bool EnableSave

qq_35528646的博客 1240

Unity中关于Mathf的Sin、Cos

在开发设计中,有些需求会涉及数学知识,就我来说吧,最近想到了好想法,然后试着码了一下。 做圆的参数方程的时候,卡住了。因为圆的参数方程 x=a+r cosθ y=b+r sinθ(θ∈ [0,2π) ) (a,b) 为圆心坐标,r 为圆半径,θ 为参数,(x,y) 为经过点的坐标。 问题出现在cosθ和sinθ了,按常理我们直接Mathf.Cos(_angle*Mathf.Deg2Rad)--...

小小小小羽的博客 1万+

Unity学习日志

获取相机可视范围的世界坐标(2D)、视口转世界坐标和屏幕转世界坐标的区别、视口转屏幕结合3D数学实现可视范围的怪物生成、transform.up游戏对象的方向问题、C#抽象类和接口的区别

jianhenhen的博客 1047

Unity 3D 自学日记

Unity 3D自学日志 因为本人比较喜欢游戏,对游戏开发感兴趣,在网上看了好多U3D和虚幻引擎做的视屏,就想要自己做着试试看咯,今天是学习的第一天,我想在我学习的同时记录一下我学习的过程,废话不多说,从安装开始,因为Unity3D引擎是可以以个人开发者的身份进行使用的,所以大家不必要费劲去找所谓的“绿色版”。这里因为买到的教材使用的是Unity2018,而我选择了比较新的Unity2019,所以有些操作不太一样。这里记录一下。 第一步,去unity官网https://unity.cn/下载,注册unity

weixin_43427752的博客 575

unity --21 数学基础---三角函数

角度Degree与弧度Radian 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一 段弧。当弧长等于圆周长的360分之一时,夹角为1度。 如果弧长等 于圆的半径时,夹角为1弧度。 可见单位弧度的计量比角度要大得多。 API:弧度=角度数Mathf.Deg2Rad API:角度=弧度数Mathf.Rad2Deg 日常生活中人类用角度比较多,但是在unity中,计算都是弧度。 三角函数 已知根...

暗色调的博客 4082

Unity运行时查看日志-游戏内像看Console一样看Log

真机、Game视图中看log,做到就像Editor中的Console中看到的Log一样效果。 有以下几个靠谱的工具。 1、Unity-Logs-Viewer 游戏内的画面 官方github zhaoqingqing的中文说明-便捷的方式在手机上查看Unity3D的Console Log(调试信息 日志)(https://zhaoqingqing.github.io/2016/08/19/unity...

winzjqwin的专栏 6093

Unity 3D学习资料集合

本文包含了unity3D 游戏开发相关的学习资料,包含了入门、进阶、性能优化、面试和书籍等学习资料

m0_67537062的博客 3577

Unity学习日志 1

Unity学习日志 7.22 1.从官网下载 2018.3.15f1版本 的unity3d,成功安装 2.创建空项目,熟悉操作界面 3.尝试在场景中创建3d物体,体验对物体进行移动,伸缩,旋转等操作,通过alt快捷键和鼠标左右键对当前视角进行改变 4.通过game窗口,看到照像机预览的场景 7.23 1.学习视频教学的小栗子学习到为物体增加纹理,增加刚体部件来附加重力,选中相机对齐当前视图来调整相机的视角 2.通过为篮球增加物理材质,修改弹性,摩擦系数和计算方式可以模拟一个篮球从高处落下的情景 3.尝试

spisahero的博客 464

unity100天学习计划

每天学习后建议记录开发日志,每周末进行知识点复盘。坚持完成100天后,你不仅将掌握Unity全流程开发能力,还会拥有属于自己的作品集!

IT深耕十余载,大道之简 1506

Unity Shader - 搬砖日志 - 3D Noise, Noise 3D 相关

文章目录ProjectReferences 备忘,2D 的 noise 有纹理或是现成的比较多 3D noise 在 unity SG 出奇的没有封装 显示再 shader graph 中,没找到 3D noise:Gradient Noise Node - 看目录中的每个 noise,都没有 3d noise 然后 google :generate 3d noise in unity,找到一堆 Project Backup : Testing3DNoise_U3D_2019_4_30f1 R

Jave.Lin 的学习笔记 2022

MATLAB图像去噪实战:如何用巴特沃斯滤波器完美去除横条纹(附完整代码)

本文详细介绍了如何使用MATLAB中的巴特沃斯滤波器有效去除图像中的横条纹噪声。通过频域分析和滤波处理,结合完整的代码示例,帮助读者掌握从噪声分析到参数优化的全流程技术,实现高质量的图像去噪效果。

weixin_30566063的博客 562

unity 3D游戏开发

从零开始 快速入门Unity 3D游戏开发。

nyknbnb的博客 2129

java链接opc报异常org.jinterop.dcom.common.JIException: Access is denied解决

记录一下这次从发现问题到解决问题的过程 项目是通过java链接OPC,读取数据,并且发送数据的 程序一直运行正常,最近客户反馈说无法读取数据,通过查看,发现访问异常了。花了2天的时间才解决了这个异常。 org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please c

机器学习菜鸟 1万+

基于STM32的PID恒温恒湿控制系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了基于双路PID算法的恒温恒湿闭环控制系统,覆盖高精度温湿度采集、双模式控制、参数在线配置、异常安全保护、掉电记忆等全功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 346

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料,涵盖入门、进阶、性能优化、面试和书籍等多个维度,旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏

2401_86900375的博客 3380

DisplayPort 1.4数据扰码实战:16bit LFSR并行优化技巧(附Verilog代码)

本文深入探讨了DisplayPort 1.4协议中16bit数据扰码的并行化实现。针对高带宽视频传输需求,文章详细推导了16位LFSR(线性反馈移位寄存器)的单周期16步并行计算公式,并提供了可直接使用的Verilog代码,解决了传统8bit串行处理吞吐量不足的瓶颈,为高速接口设计提供了关键优化技巧。

y4z5a6b7的博客 259

Unity学习日志_Unity父子关系与Camera

Unity学习日志_Unity父子关系与Camera ​ 本次组件简单介绍将不包含monoBehaviour类及其向上回溯的父类。 1. 关于父子物体 ​ 首先需要声明的一点是所有游戏物体的Transform组件中的position,rotation和Scale属性都是相对于父物体而言的。可以通过右击Inspector面板名称来选择Debug模式进行查看。 ​ 在unity中带有local字样的属性也就意味着其数值是相对于父物体的。 关于父子物体的一些现象 1. position: ​ 改变父物体的p

BraveRunTo的博客 2528

医学图像标注工具教程——从零开始使用3D Slicer进行医学图像手动分割

3D Slicer手动分割软件下载及安装数据导入导入CT序列文件夹导入单张超声基本交互操作窗位和窗宽的调整改变切片及寻找特定点对应的三维切片图像分割功能介绍PaintDrawEraseLevel tracingGrow from seedsFill between slicesThreshold & Margin & HollowSmoothingScissors & IslandsLogical operator分割结果的保存 软件下载及安装 下载地址:官网的4.11.0版本 数据

神仙院B栋4楼保安的博客 1万+

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6092

Unity 学习日志—Unity基础知识

~如果感兴趣可以去支持一下b站一唐老狮一

Nan_Gua_pie的博客 1001

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3158

Unity 3D 学习笔记

编辑器: Hierarchy窗口中是场景中的Game Object列表 Project窗口中是磁盘上Assets文件夹中的内容,可用来创建Game Object 调试: 调试用Debug.Log()或者print函数打日志 目前完全无法采用VisualStudio进行调试,只能用MonoDevelop。因Unity采用的是Mono运行时引擎而不是CLR,参考Debugging using Visu

仰望星空 3710

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Unity学习日志_Unity地形系统简介
下一篇: Unity学习日志_物理系统简介
BraveRunTo
博客等级 码龄7年 91粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值