学习 图形学01

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

左右手坐标系

3D笛卡尔坐标系:右手坐标系

OpenGL:右手坐标系

Direct3D:左手坐标系

左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

Unity3D:左手坐标系(世界坐标系),即+x, +y, +z分别指向右方,上方和前方

全局局部屏幕Screen视口ViewPort坐标系

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

transform.position来获取世界坐标

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

本地坐标系:子物体相对于父物体的坐标,transform.localPosition。

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

鼠标位置坐标属于屏幕坐标,input.mousePosition。

手指触摸屏幕也为屏幕坐标,input.GetTouch(0).position单个手指触摸屏幕。

视口坐标:左下角(0,0),右上角(1,1),Z轴坐标是相机的世界坐标的Z轴的负值。

坐标系之间的关联和相互转换

transform.Translate(translation:Vector3,relativeTo: Space= Space.Self);
在relativeTo坐标系中,沿着translation的方向移动,如果relativeTo为空,则默认为局部坐标系。

1.全局坐标系和局部坐标系转换·
Transform.TransformPoint(Vector3 position):将一个坐标点从局部坐标系转换到全局坐标系
Transform.InverseTransformPoint(Vector3 position).将坐标点从全局坐标系转换到局部坐标系。

Transform.forward,Transform.right,Transform.up,物体坐标系的Z轴,x轴,y轴在世界坐标系上的指向。
Vector3.forward(0.0.1)的缩写

Vector3.right,(1,0,0)的缩写
Vector3.up,(0,1,0)的缩写

在transform.Translate()中使用时。如果不表明坐标系,则为物体的局部坐标,即物体自身的正前方。
 

坐标系之间的相互转化

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

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

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

向量

向量(也称为矢量),是指具有大小和方向的量

行向量[1,2,3]

列向量

向量的长度

Vector3.magnitude计算向量的长度,Vector3.sqrMagnitude则返回向量长度的平方。

Vector3.Distance(A,B)可以计算2个点A,B之间的距离。

单位向量:Vector3.normalized,来计算运动的方向。

单位向量:Vector3.Normalize。

向量的加减

向量的加法可以理解成平移向量。

向量的减法则可以理解为平移负向量

向量的点积Vector3.Dot判断前后

Vector3.Angle来获得两个向量之间的夹角的大小。结果在0度到180度之间

a·b=(ax,ay)·(bx,by)=axbx+ayby

a·b = |a||b|cosθ

点乘的结果越大,两向量越相近。通常也被用来求两个向量之间的夹角的大小。

可以通过向量的点积的结果的符号来判断两个向量的位置关系。

如果值大于0,则夹角在0度到90度之间(不包含90),两个向量的方向基本相同。

如果值等于0,则夹角为90度,两个向量的方向相互垂直

如果值小于0,则夹角在90度到180度之间(不包含90),两个向量的方向基本相反

向量的点积还可以用来求得一个向量在另一个向量上的投影。

向量的叉积

a×b=(ax,ay,az)×(bx,by,bz)=(aybz-azby,azbx-axbz,axby-aybx)。

叉积得到的向量垂直于原来的两个向量

a×b的长度等于向量的大小与向量夹角的sin值的积,也是以ab为两边的平行四边形的面积的大小。

向量的叉积Vector3.Cross判断左右

通过向量的叉积来得到一个平面的法向量。

叉积得到的结果向量b是在向量a顺时针方向还是逆时针方向。用向量的方向来判断。

unity用的左手法则,计算的向量朝上为顺时针,朝下为逆时针

using UnityEngine;    
using System.Collections;    
    
public class MainScript : MonoBehaviour    
{    
        //向量a    
        private Vector3 a;    
        //向量b    
        private Vector3 b;    
            
        void Start ()    
        {    
                //向量的初始化    
                a = new Vector3 (1, 2, 1);    
                b = new Vector3 (5, 6, 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 和 b.normalized表示的是两个向量的单位向量。

Mathf.Rad2Deg表示的是 单位弧度的度数

public class CrossTest : MonoBehaviour
{
    public GameObject sphere;
    public GameObject cube;
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    void OnGUI() 
    {
        var v=sphere.transform.position-cube.transform.position;
        Vector3 cross=Vector3.Cross(cube.transform.forward,v);
 
        Debug.DrawLine(cube.transform.position,cube.transform.forward*10,Color.red);
        Debug.DrawLine(cube.transform.position,sphere.transform.position,Color.green);
        Debug.DrawRay(cube.transform.position,cross,Color.blue);
 
        if(cross.y>0)
        {
            Debug.Log("在右边");
        }
        else
        {
            Debug.Log("在左边");
        }
    }
 
}

矩阵

一个r×c矩阵有r行,c列。即2×3矩阵有2行3列。3×2矩阵则有3行2列。

数aij位于矩阵的第i行,第j列。

在Unity中,可以使用Matrix4x4.SetRow和Matrix4x4.SetColumn来设置一个4 X4矩阵的某行或某列在Unity中,可以使用Matrix4x4.GetRow和Matrix4X4.GetColumn来获取一个4 X4矩阵的某行或某列结果为Vector4类型,这里的index是从0开始。

矩阵和向量乘法

矩阵和矩阵相乘时。只有满足第一个矩阵的列数和第二个矩阵的行数相等的条件时,才可以相乘即 r x n矩阵,才能n x c矩阵相乘,得到到的结果是一个r x c矩阵。所以,向量与矩阵相乘时,行向量需要在左边,列向量需要在右边。

矩阵和矩阵的乘法

两个矩阵相乘的规则和矩阵和向量相乘的规则相同
矩阵A和矩阵B相乘,得到的矩阵C中的任意元素Cij等于A的第i行向量与B的第j列向量的点乘结果
在Unity中,可以使用Matrix4x4.operator“来进行矩阵和矩阵的乘法运算

单位矩阵

在Unity中,可以通过Matrix4x4.identity来获得一个4 x4的单位矩阵
在Unity中,可以通过Matrix4x4.isldentity来判断一个矩阵是不是单位矩阵
在Unity中,可以通过Matrix4x4.zero获得一个4x4的所有元素都为0的矩阵

转置矩阵

转置矩阵是对原矩阵进行转置运算后得到的矩阵。一个rxc的矩阵转置后,可以得到一个cxr的矩阵。转置运算,即将原矩阵的第i行变为第i列,第j列变成第j行,也可以看作是沿着对角线翻折。
在Unity中,可以通过Matrix4x4.transpose获取一个矩阵的转置矩阵

逆矩阵

逆矩阵,只有方块矩阵才可能有逆矩阵,因为一个矩阵A和它的逆矩阵B需要满足条件: AB=l是单位矩阵)。如果一个矩阵有相应的逆矩阵,则可以说这个矩阵是可逆的,或者说是非奇异的。如果一个矩阵没有相应的逆矩阵则可以说这个矩阵是不可逆的,或者说是奇异的。

Unity中,可以通过Matrix4x4.inverse来获取一个4×4矩阵的逆矩阵。

齐次坐标

一个标准的空间直角坐标系的

基向量是a = (1,0,0),b=(0,1,0),c=(0,0,1)。原点为O

任意一个向量v(vx,vy,vz)的坐标:v=vxa+vyb+vzc

用基向量来表示坐标系中的任意一个点的位置,则需要考虑原点的位置,所以一个P(px,py,pz)的坐标可以表示为:P = pxa+pyb+pzc+O

点的齐次坐标表示:(x,y,z,1)

向量的齐次坐标表示:(x,y,z,0)

用矩阵的形式来表示的话,可以表示为:

用矩阵表示向量

用矩阵表示点

我们的3D坐标系可以表示为:

仿射变换

平移、旋转、缩放都属于仿射变换

仿射变换可以用矩阵和向量相乘的方式来表示。

一个三维的变换可以表示为:

c1,c2,c3,c4表示一个点或者一个向量。前面的是变换矩阵

前面的3*3可以缩放和旋转,最后的m14,m24,m34表示平移。

2D变换

2D平移矩阵

将一个点P平移(tx,ty)单位到点P

2D缩放矩阵

2D旋转矩阵

变换矩阵的逆矩阵

平移矩阵的逆矩阵

缩放矩阵的逆矩阵

旋转矩阵的逆矩阵

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值