Unity Shader 所需要的数学基础浅讲

       这篇文章是给想做3D游戏的同学们一个基础的数学性讲解,内容也是一年之前做的一篇PPT的内容。也不光是Shader中所能用到的

过于基础的我就不讲了,比如向量加减,矩阵的加减乘等基本运算。笛卡尔坐标系(左右手坐标系)(可以先搞明白这些再看)     

向量篇:

重要的有这几个

点乘(点积):

a·b=|a|·|b|cos<a,b>     float c = Vector3.Dot (a, b);

|a|和|b|表示向量的模<a,b>表示两个向量的夹角。<a,b>和<b,a> 夹角是不分顺序的。通过点积可以计算两个向量的夹角,这便是点乘的价值所在。如果两个向量a,b均 为单位 向量 ,那么a·b等于向量b在向量a方向上的投影的长度。

叉乘(叉积):

c =a x b    Vector3 c = Vector3.Cross (a, b);

其中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的顺时针方向还是逆时针方向。

总的来说点乘得到角度叉乘得到法线。

坐标系篇:

左右手坐标系不做细说,每个引擎都会有自己的坐标系法则,这里简单的说明一下Unity中的坐标系转换,Unity的坐标转化其实已经封装的很充分了,不需要你再去矩阵之间乘来乘去了:

说一下这个几个坐标系之间的转换

首先Unity有四种坐标系 1WorldSpace 世界的绝对坐标,transform.position可以获得该位置坐标。LocalSpace 本地坐标(通常以模型自身锚点为准)transform.localposition可以获得该位置坐标

2 Screen Space (屏幕坐标):以像素来定义的,以屏幕的左下角(0,0)点,右上角为(Screen.Width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可获得该位置坐标,手指触摸屏幕坐标,Input.GetTouch(0).postion可获得单个手指触摸屏幕坐标

Screen.width = Camera.pixelWidth  Screen.height = Camera.pixelHeigth

3 ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)Zdenka位置是以相机的世界单位来衡量的。

4.绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height);

四种坐标系的转换

1、世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

2、屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

3、视口坐标→屏幕坐标:camera.ViewportToScreenPoint();

4、视口坐标→世界坐标:camera.ViewportToWorldPoint();

下面讲下矩阵:

为什么要将矩阵呢那是因为描述一个三维的物体通常使用的是矩阵的边换来操作的,矩阵的变换指的是我们把一些数据,如点,方向矢量甚至是颜色等,通过某种方式进行转换的过程。在计算机图形学领域,变换非常重要。尽管通过变换我们能够进行的操作是有限的,但是这些操作已经足以支持我们工作了。

线性变换是一种非常常见的变换类型,物体的缩放旋转可以通过一个三维的矢量进行变换,那么仅仅用3x3的矩阵就可以表示所有的线性变换。线性变换还包括了错切,镜像,正交投影等,但是仅仅线性变换是不够的。物体的平移就不是一个线性变换,它既不满足标量乘法,也不满足矢量加法,因此,我们不能用一个3x3的矩阵来表示一个平移变换,这样就有了仿射变换。仿射变换就是合并线性变换和平移变换的类型,可以使用一个4x4的矩阵来表示,这就是齐次坐标空间:

这个基础变换矩阵我们可以分解4个部分左上角的矩阵M3x3表示旋转和缩放,t3x1用于表示平移,01x3是零矩阵,右下角的元素就是标量1。

接下来是如何用这样一个矩阵来表示平移旋转缩放

平移:

缩放:

绕x轴旋转:

绕y轴旋转

绕z轴旋转

当然矩阵的变换是有有顺序的,先缩放,再旋转,最后平移,至于为什么可以使用矩阵变换自己求证一下,由于我们经常用的是列矩阵因此阅读顺序是从右向左。

至于下一篇我会一起推导下 View Matrix 如何推导的,了解如何将世界坐标点如何对应到屏幕坐标的,以及BillBoard的如何制作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容