2017-10-18 14:26:47 qq_39538753 阅读数 741
  • 3D数学Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16360 人正在学习 去看看 姜雪伟

向量(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);
  • 1
  • 2
  • 3
  • 4

如果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);
  • 1
  • 2
  • 3
  • 4

其实就是从向量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| 
    性质1:c⊥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));
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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 initialization
    void Start () {
        Vector3 v1 = new Vector3(1, 0, 0);
        Vector3 v2 = new Vector3(1, 0, 1);
        TestDot(v1, v2);
    }

    // Update is called once per frame
    void 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);
    }

}
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

叉乘



2019-10-28 17:28:53 u014361280 阅读数 38
  • 3D数学Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16360 人正在学习 去看看 姜雪伟

目录

 

Unity 3D 开发中需要掌握的数学基础知识概要整理(一)

学习目的:

一、3D 数学基础知识介绍

二、Unity 中的几种常用坐标系

三、向量的基本概念


 

Unity 3D 开发中需要掌握的数学基础知识概要整理(一)

 

学习目的:

3D数学:研究在3D几何世界中的数学问题。被广泛的应用于使用计算机来模拟3D世界的领域,比如图形学,游戏,虚拟现实和动画等。

为什么要学习3D数学:掌握了3D数学的知识之后,对我们将来学习图形学、游戏制作都有很大的帮助。

 

一、3D 数学基础知识介绍

1、1D 数轴

1D:关于计数和度量的数学。

  • 数学上,数轴是个一维的图,整数作为特殊的点均匀地分布在一条线上。数轴是一条规定了原点、方向和单位长度的直线。

2、2D 笛卡尔坐标系

2D:关于平面的数学。

  • 数学上,相交的两条直线可以确定一个唯一的平面。相交于原点的两条数轴,构成了平面放射坐标系。

  • 如果两条数轴上的度量单位相等,则称此放射坐标系为笛卡尔坐标系。

  • 数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。

  • 在2D笛卡尔坐标系中,我们用(x,y)来表示一个点。称之为坐标。

  • 坐标的每个分量都表明了该点与原点之间的距离和方位。每个分量都是到相应轴的有符号距离。

 

3、3D 空间直角坐标系

3D:关于3D空间的数学。

  • 从2D扩展到3D:相对于2D笛卡尔坐标系,我们需要3个轴来表示三维坐标系,一般叫做空间直角坐标系。

  • 第3个轴一般被称为z轴。一般情况下,3个轴互相垂直。

  • 任意2个轴可以组成一个平面,我们一般称为XY平面,XZ平面,YZ平面,每个平面又与另一个轴相垂直。我们可以认为这3个平面是3个2D笛卡尔空间。

  • 在3D中,我们用(x,y,z)来表示一个点。坐标的每个分量分别代表了该点到yz,xz,xy平面的有符号距离。

4、左手坐标系与右手坐标系

  • z轴方向的确定有2种方式:左手坐标系与右手坐标系。
  • 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
  • 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
  • 3D笛卡尔坐标系:右手坐标系
  • OpenGL:右手坐标系
  • Direct3D:左手坐标系
  • Unity3D:左手坐标系(世界坐标系),即+x, +y, +z分别指向右方,上方和前方。

二、Unity 中的几种常用坐标系

1、在不同的情况下使用不同的坐标系更加方便,所以在Unity中有多种坐标系:

  • 全局坐标系  World Coordinate System

a、全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系。

b、在Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的。

c、可以使用transform.position来获取游戏对象的世界坐标。
  • 局部坐标系  Local Coordinate System

a、局部坐标系也称为模型坐标系或物体坐标系。

b、每个物体都有自身独立的物体坐标系。当物体移动或改变方向时,和该物体相关联的坐标系将随之移动或改变方向。

c、模型Mesh保存的顶点坐标均为局部坐标系下的坐标。
transform.localPosition(本地坐标)可以获得物体在父物体的局部坐标系中的位置点。

父子关系,子物体以父物体的坐标点为自身的坐标原点。

如果该游戏物体没有父物体,那么transform.localPosition获得的依然是该物体在全局坐标系中的坐标。

如果该物体有父物体,则获得是在其父物体的局部坐标系中的坐标。

检视视图中显示的为localPosition的值。

 

  • 屏幕坐标系  Screen Space

屏幕坐标系是建立在屏幕上的二维坐标系。

以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值。

鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。

手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕时手指的坐标。

 

  • 视口坐标系  ViewPort Space

视口坐标系是将Game视图的屏幕坐标系单位化,左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。

 

2、坐标系之间的关联与相互转换

a.全局坐标系和局部坐标系

关联:
transform.Translate(translation:Vector3, relativeTo: Space = Space.Self);
沿着translation的方向移动|translation|的距离,其结果将应用到relativeTo坐标系中。如果relativeTo为空,则默认为局部坐标系。

转换:
Transform.TransformPoint(Vector3 position) :将一个坐标点从局部坐标系转换到全局坐标系。
Transform.InverseTransformPoint(Vector3 position):将坐标点从全局坐标系转换到局部坐标系。
Transform.TransformDirection(Vector3 direction):将一个方向从局部坐标系转换到全局坐标系。
Transform.InverseTransformDirection(Vector3 direction):将一个方向从全局坐标系转换到局部坐标系。
Transform.TransformVector(Vector3 vector):将一个向量从局部坐标系转换到全局坐标系。
Transform.InverseTransformVector(Vector3 vector):将一个向量从全局坐标系转换到局部坐标系。

其他:
Transform.forward, Transform.right, Transform.up:当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向。
Vector3.forward ,(0,0,1)的缩写。在transform.Translate()中使用时,如果不表明坐标系,则为物体的局部坐标,即物体自身的正前方。
Vector3.right,(1,0,0)的缩写。
Vector3.up ,(0,1,0)的缩写。

b.屏幕坐标系与全局坐标系

转换:
Camera.ScreenToWorldPoint(Vector3 position): 将屏幕坐标转换为全局坐标。
Camera.WorldToScreenPoint(Vector3 position):将全局坐标转换为屏幕坐标。
Input.mousePosition:获得鼠标在屏幕坐标系中的坐标。

c.屏幕坐标系与视口坐标系

转换:
Camera.ScreenToViewportPoint(Vector3 position):将屏幕坐标转换为视口坐标。
Camera.ViewportToScreenPoint(Vector3 position):将视口坐标转换为屏幕坐标。

d.全局坐标系与视口坐标系

转换:
Camera.WorldToViewportPoint(Vector3 position):将全局坐标转换为视口坐标。
Camera.ViewportToWorldPoint(Vector3 position):将视口坐标转换为全局坐标。

三、向量的基本概念

1、向量的定义

  • 在数学中,向量(也称为矢量),是指具有大小和方向的量。

  • 向量的大小就是向量的长度,也叫做模。向量的方向描述了空间中向量的指向。

  • 在数学中,书写向量时,通常用方括号将一列数括起来,如[1,2,3]。

  • 水平书写的向量叫做行向量,垂直书写的向量叫做列向量。上面的向量可以书写成列向量:   。

  • 通常,我们用x,y来代表2D向量的分量,用x,y,z来代表3D向量的分量。

  • 向量中的数表达了向量在每个维度上的有向位移。

2、点和向量的关系

  • 点(Point):点中的数表示了一个位置,它没有大小、方向的概念。

  • 在笛卡尔坐标系,我们可以使用2个或3个实数来表示一个点的坐标。在2D空间中,用P=(Px,Py)来表示一个点的坐标。在3D空间中,用P=(Px,Py,Pz)来表示。

  • 向量(Vector):向量中的数表示了向量在每个维度上的有向位移。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向。线段长度:代表向量的大小。

  • 在坐标系中,可以使用v = [x, y]来表示一个2维向量,用v = [x, y, z]来表示一个3维向量。

 

3、Unity中的点和向量

  • 在Unity中,只有Vector2、Vector3类型,没有Point2、Point3类型。

  • Vector2类型可以用来表示2D向量和点。Vector3类型可以用来表示3D向量和点。

  • Transform.position表示一个点,即游戏物体在世界坐标系中的点。

  • Transform.forward表示一个向量,即当前物体的物体坐标系的z轴在世界坐标系上的指向。

  • 在Unity中,点和向量都是以(x,y,z)的形式表示。

  • 当我们想让游戏物体处于某个位置时,我们可以使用Vector3类型来表示这个点的位置坐标。

  • 当我们想让游戏物体沿着某个方向以一定的速度移动时,我们可以使用Vector3类型来表示速度的向量值,即速度的大小和方向。

  • 当我们想计算2个游戏物体之间的距离时,实际上计算的就是以这2个游戏物体为起点和终点的向量的长度。

 

2017-06-15 11:13:16 nanzhengluo 阅读数 818
  • 3D数学Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16360 人正在学习 去看看 姜雪伟
一、3D坐标系
笛卡尔坐标系。分为 左手坐标系和右手坐标系。
按照X,Y,Z的顺序表示坐标。
1.全局坐标系(世界坐标系)
坐标原点(0,0,0),例(1,2,1)
2.局部坐标系(模型坐标系,物体坐标系)
每个物体有自己独立的坐标系,并且随物体进行相同的移动和旋转。模型mesh中保存的顶点坐标,均为局部坐标系下的坐标。
建立父子关系,子物体的坐标系以父物体的坐标点为自身的坐标原点。
3.相机坐标系
根据观察位置方向建立的坐标系。使用此坐标系可以方便的判断物体是否在相机前方以及物体之间的先后遮挡顺序等。
4.屏幕坐标系
建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置

Unity中,Transform组件的
Transform.TransformPoint 方法可以将坐标点从局部转换到全局坐标系
Transform.InverseTransformPoint 可以讲坐标点从全局坐标系转换到局部坐标系。
Transform.TransformDirection用于对向量从局部坐标系转换到全局
Transform.InverseTransformDirection从全局坐标系转换到局部坐标

Transform.TransformDirection 变换方向
function TransformDirection (direction : Vector3) : Vector3
Description描述
Transforms direction from local space to world space.
从自身坐标到世界坐标变换方向。
This operation is not affected by scale or position of the transform. The returned vector has the same length as direction.
这个操作不会受到变换的缩放和位置的影响。返回的向量与direction有同样的长度。


二、向量 Vector
向量又称矢量,在数学里,既有大小又有方向的量,就是向量。在几何中,向量可以用一段有方向的线段来表示。
1.向量的运算
1)加减:向量的加减为 各分量分别相加减,在物理上可以用来计算两个力的合力,或者几个速度分量的叠加
2)数乘:向量与一个标量相乘为数乘。数乘可以对向量的长度进行缩放,如果标量小于0,向量的方向会变反方向。
3)点乘:两个向量点乘得到一个标量,数值等于两个向量长度相乘后再乘以二者夹角的余弦。
a•b = ax*bx + ay*by 
=  (|a|*sinθ1) * (|b| * sinθ2) +   (|a| * cosθ1) * (|b| * cosθ2)
= |a||b|(sinθ1*sinθ2 + cosθ1*cosθ2)
=|a||b|(cos(θ1-θ2))
= |a||b|cosθ

通过两个向量的点乘结果符号,可以快速判断两个向量的夹角,
若:U·V = 0,则U,V互相垂直
若:U·V > 0,则U,V夹角小于90度
若:U·V < 0,则U,V夹角大于90度a
点乘的几何意义是:是一条边向另一条边的投影乘以另一条边的长度
平行四边形,面积相等,cos点乘满足 :交换律a·b=b·a ,分配率a·(b+c) = a·b + a·c

4)叉乘:两个向量的叉乘得到一个新的向量,新向量垂直于原来两个向量,并且长度等于原来两个向量长度相乘后,再乘夹角的正弦值
可用左手拇指和食指来代表UV,中指则为叉乘向量的方向
另外叉乘不满足交换律:UxV ≠ VxU
2.Vector3类
Unity中和向量有关的类有:Vector2,Vector3,Vector4,分别对应不同维度的向量。其中Vector3使用广泛。
三、矩阵
矩阵是一个矩形阵列,有指定的行和列,使用矩阵可以简化数据的表示变换处理
M × N的矩阵是一个具有M行、N列的矩形数组,行数和猎术分别为矩阵的维度。Unity中常用4X4矩阵,它可以描述向量的平移,旋转,缩放等所有线性变换
平移矩阵,
旋转矩阵,
缩放矩阵

四、齐次坐标
将原本三维向量的(x,y,z)用四维向量(Wx,Wy,Wz,W)来表示。
目的1区分向量和点(x,y,z,1)来表示坐标点,(x,y,z,0)表示向量
2统一用4X4矩阵乘法来表示平移旋转和缩放变换。
3当分量w=0时,可以用来表示无穷远的点。

五、四元数
四元数包含一个标量分量和一个三维向量分量
Q可以计作:Q = [w,(x,y,z)]
四元数用表示旋转
(其余两种旋转表示方法:欧拉角和矩阵)

2018-12-14 15:14:31 trickstone 阅读数 53
  • 3D数学Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16360 人正在学习 去看看 姜雪伟

1.3D坐标系

Unity使用的是笛卡尔左手坐标系,X水平方向,Y垂直方向,Z深度。

2.屏幕坐标系

建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置。

Transform组件的

Transform.TransformPoint方法将坐标点从局部坐标系转换到全局坐标系,

Transform.InverseTransformPoint方法可以将坐标点从全局坐标系转换到局部坐标系,

Transform.TransformDirection方法将向量从局部坐标系转换到全局坐标系,

Transform.InverseTransformDirection方法将向量从全局坐标系转换到局部坐标系。

3.向量

向量(矢量),用于描述具有大小和方向两个属性的物理量。

3.1向量的运算

(1)加减

(2)数乘

向量与标量相乘,得到向量。标量大于0,方向不变,标量小于0,方向变反。

(3)点乘

两个向量点乘,得到标量,数值为长度相乘后再乘二者夹角的余弦值。

cos0°=1,cos30°=√3/2,cos45°=√2/2,cos60°=1/2,cos90°=0。

通过点乘结果可以快速判断两个向量的夹角情况:

u·v=0,向量u、v相互垂直;

u·v>0,向量u、v夹角小于90度;

u·v<0,向量u、v夹角大于90度;

(4)叉乘

两个向量叉乘,得到向量,新向量垂直于原来的两个向量,长度等于原向量长度相乘后再乘二者夹角的正弦值。

左手判断叉乘结果的方向,假设有向量Result=a×b,拇指指向a,食指指向b,中指指向方向为Result方向。

3.2Vector3类

Vector3成员变量
成员变量 说明
x 向量的X分量
y 向量的Y分量
z 向量的Z分量
normalized 得到单位化后的向量(只读)
magnitude 得到向量长度(只读)
sqrMagnitude 得到向量长度的平方(只读)
Vector3常用方法
常用方法 说明
Cross 向量叉乘
Dot 向量点乘
Project 计算向量在另一向量上的投影
Angle 返回两个向量之间的夹角
Distance 返回两个向量之间的距离
operator + 向量相加
operator - 向量相减
operator * 向量乘标量
operator / 向量除以标量
operator == 两向量相等,返回true
operator != 两向量不等,返回true

4.矩阵


平移矩阵

T(p)=\begin{bmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0 &0 &0&1 \\ P_{x}&P_{y} &P_{z} &1 \end{bmatrix}

旋转矩阵

X(\theta )=\begin{bmatrix} 1 & 0 & 0 &0 \\ 0 & cos\theta &sin\theta & 0\\ 0&-sin\theta &cos\theta & 0\\ 0 & 0& 0& 1 \end{bmatrix}

缩放矩阵

S(q)=\begin{bmatrix} q_{x} &0 &0 & 0\\ 0 &q_{y}& 0 &0 \\ 0 & 0& q_{z} &0 \\ 0& 0 &0 &1 \end{bmatrix}

组合

矩阵变化可以通过矩阵乘法进行组合。

使用

在Unity中,Matrix4x4仅在Transform,Camera,Material和GL等几个类的函数中用到。

 

 

《unity 5.x从入门到精通》学习记录,p458-p470

2015-02-28 09:37:03 jxw167 阅读数 65
  • 3D数学Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16360 人正在学习 去看看 姜雪伟
3D数学在Unity中运用—15125人已学习
课程介绍    
201502280348236827.jpg
    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。
课程收益
    大家在开发的时候对于如何使用已经学到的数学知识如何在实际开发中去运用感到苦恼,通过本课程的学习,让你真正的做到知其然知其所以然。
讲师介绍
    姜雪伟更多讲师课程
    网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习。从事IT行业15年,主导或参与了18款大型游戏的研发;曾在网龙、久游、趣游等知名IT公司担任核心技术团队负责人;目前个人拥有3项软件著作权和一个发明专利。 已出版书籍《手把手教你架构3D游戏引擎》电子工业出版社,《Unity3D实战核心技术详解》电子工业出版社。
课程大纲
    1.课程概述  10:38
    2.坐标系讲解  20:37
    3.向量运用  18:36
    4.矩阵运用  31:30
    5.四元数  16:33
    6.欧拉角  6:57
    7.剖析射线拾取  6:33
    8.摄像机  11:26
    9.剖析阴影生成  11:33
    10.线性插值  8:26
    11.Bezier曲线  10:29
    12.二叉树算法运用  13:14
    13.网格动态生成  10:33
    14.海水算法  17:01
    15.行为树运用  11:44
大家可以点击【查看详情】查看我的课程

Unity_3D数学基础_005

阅读数 553

没有更多推荐了,返回首页