线代与图形学的暧昧二三事

2024-05-28 22:12
文章标签 图形学 线代 二三 暧昧

本文主要是介绍线代与图形学的暧昧二三事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A Swift and Brutal Introduction to Linear Algebra

计算机图形学依赖于线性代数、微积分、统计...物理方面涉及到光学(波动光学:不再假设光是直线传播,作为一种光波与物体表面材质进行作用接触,如何生成不同的外观)和力学,还涉及到信号处理(分析走样、反走样技术,解决信号处理的事情),数值分析也很重要(解决一些复杂的数学计算:积分、渲染,解决递归定义的积分、模拟仿真、拓展方程...),还需要一点点美学

一个例子

52d7781f6f0745b8bb17d9a13e304a1d.png

旋转的小蜗,壳上的亮晶晶随着旋转来回摆动,不是匀速旋转,到中间速度达到峰值,不是以固定速度旋转,用到了旋转矩阵的知识

向量

基础认识

39dd8b5041644343ab55acfa6449a5df.jpeg

名称上有区别,在数学中他叫向量,物理学(照亮世界)的诨名叫矢量,表示方向(B坐标 - A坐标),平移向量不发生变化,还是最初的美好

向量的两个重要属性:方向 + 长度

73b6a53a2f2d468f87f98dbe19ba34b1.png

回忆单位向量,在图形学里用单位向量可直接表示方向(a头顶一个hat,在图形学中用于表示单位向量)

 操作

相加

f85c25f1d31c4875b49179bf1c2fdb2b.png

涉及平行四边形法则、三角形法则 

表示

笛卡尔坐标系表示向量

 f610211247514c24954accaf8bd8cc9f.png

X、Y通常垂直且定义成单位向量,好处:可用(4,3)表示向量

向量的缺省设置是列向量(矩阵左乘方便)

db830fbcf1924443965038259009d1f3.jpeg

为什么这样设置捏?

如果这样定义,两坐标轴垂直,以单位向量为单位,算向量长度就很简单啦

eq?%7C%7CA%7C%7C%20%3D%20%5Csqrt%7Bx%5E2+y%5E2%7D

Dot product

b265dae0f4f245e6928f00cb8030c57e.jpeg

在图形学中的应用: 做简单变换,给定两个向量可算出夹角余弦,可帮助我们快速得到两个向量的夹角,在两个向量都是单位向量的时候尤为方便

点乘满足这些定律:

b70c6c00ef604d4685163e2fab18ce0a.png

相乘后相加,定律可扩展到高维(2D -- > 3D) 

7e41610143714663acbcb1427074f3b3.jpeg

点乘在图形学中的应用:找到两个方向的夹角(光照模型的光照进来的方向,物体表面法线,从哪个方向看)

a91c0b3adfb44cc5a08b7acbd6d6eb7c.png

找到向量的投影长什么样:

ae08183e0ccb42bfba12f0915a171d35.png

现在a、b两个向量方向不一样,希望将b向量投影到a向量上去,假如有一束光线垂直于a向量的方向照射过来,则b向量会在a向量上投射出一片阴影(b在a上的投影),那我们具体应该怎样计算呢?需要用到向量的基本属性:长度和方向,既然b向量投影到a向量上了,那投影一定是沿着a方向的,b perpu(perpendicular)的方向确定,可以用它表示成a向量的单位向量x长度,最终长度为b向量的长度x   b向量与a向量夹角的余弦,夹角的余弦用点积求:

ffe2acfe9d4f470d9a856883f859d757.png

 算出投影有什么好处呢?

我们可以把一个向量分解成两个向量,一个方向平行于某个方向,另一个方向垂直于某个方向

叉乘,根据平行四边形法则可推导出上面的结果,点乘带来的好处是可以对任意一个向量进行垂直与平行的分解,在图形学中,点乘还可以带来另外的好处:可以计算两个向量的方向有多接近,接近:算两个向量点乘的结果,根据点乘的结果知道两个方向是接近还是远离

点乘还可帮助大家获取前与后的信息

288e44322e184ca1897f99969be6b1e2.png

给定向量a的方向,从a的方向上下割据形成两个半圆,如果向量的终点是落在虚线以上的,那可以认为a和b向量都是向前的,c向量的终点落在了下半部分,可以认定a向量和c向量方向基本上是相反的,点乘的好处这就体现出来了:a和b点乘会获得一个正数,a和c点乘会获得一个负数,假如还有一个向量刚好落在虚线上,那最终结果是0

向量的点乘可以告知我们方向性:基本一致,相反,垂直

同样的,点乘还可以告诉我们两个向量有多接近,如果比较接近,点乘出来的结果就会比较接近1,远离后渐渐变成0,再远一点会渐渐变成-1,直到完全变成-1,可以告诉我们值有多接近

那点乘看两个向量是否接近又有什么应用呢?

比如一束光打在一面镜子上,肯定是会反射的,如果眼睛从出射光方向看过去,就会发现一个反光点很亮,如果错开一点点就看不到闪烁的光亮(比如金属的发光,入射光打到金属表面,会反射,在周围观测会得到这样的结果,离远则看不到,需要方法提供两个向量是否接近标准)

Cross product

向量的叉积虽然也是乘法,但是和点积完全不一样的运算

579d78fdf831409d9b77b0469e350eb9.jpeg

叉积会输入两个向量a和b,会计算出另外一个向量,两向量叉积的结果和原本的两个向量都垂直,即该向量垂直于ab所在的平面内,那方向怎么确定捏?需要根据右手定则来弄了!

什么是右手定则(你不是学过吗)

其实有两种右手定则,一种是伸出三根手指(拇指食指中指),摆成互相垂直的方向

但更为常见的是右手螺旋定则,算叉积从a旋转到b方向,拇指指向的方向就是叉积结果向量的方向,我们可以发现从b到a方向是相反的(叉积并不满足交换律),那向量的叉积有什么作用呢?

我们可以用向量的叉积建立三维空间中的直角坐标系

7a093ba2af3340b98b199cc53ef83daf.jpeg

可以通过x轴叉乘y轴的方式算出z轴,如果x轴和y轴叉乘得到z轴建立三维空间直角坐标系,那这个坐标系就被称为右手坐标系

自己叉乘自己得到零向量

向量叉乘在代数上也可写出,但是相对复杂,a向量叉乘b向量得到的是一个列向量,在笛卡尔坐标系中,向量的叉乘也可以重新写出来,向量的叉乘可以表示成对应的矩阵形式,矩阵相乘一样可得出以上结果

35a3f4441231412dbe6eab8cee9555c9.jpeg

向量的叉积(叉乘)的重要应用:判定左右、判定内外

981c34e5aa34404e8f98264bdb53f3c1.png 

为什么给定两个向量的叉积就能判定左和右的信息呢?

 1634414c6ae64077a91160c47c009fb2.jpeg

 那怎么判断左右呢?左面这幅图的右手系xyz都有,判定b在a的左侧还是右侧,从直观上看图我们可以判断b向量在a向量的左侧,在数字上如何表示呢?也很简单,就是a叉乘b得到的结果是正的,就可以判定b在a的左侧,反过来则在右侧

判断左右是一方面,叉积还可判断内外,已知有三角形ABC,想要判断P点是否在三角形内部,就需要应用到叉积了,我们可以这样做叉积:AB和AP做叉积,BP和BC做叉积,CP和CA做叉积,得到的结果都是正的,也就是说P点在AB、BC、CA的左边(如果顺时针排布也没关系,如此就是P都在三条边的右边),如果擦边就自己说了算

Orthonormal bases and coordinate frames

1f939acb8d134d8b841b57f462fc29bd.jpeg

定义u、v、w都是单位向量,点乘等于零互相垂直,叉乘后得到三维右手直角坐标系,这样定义有什么好处呢?好处就是我们可以把任意向量分解到这三个坐标轴上去,投影做需要点积

Matrices

计算机图形学很多地方都会涉及到矩阵

f27cd660b8dd480b8befa80fa44b9fb6.png

矩阵在变换上应用较多,应用矩阵可做基础变换:移动、旋转、缩放...

矩阵是什么捏?

41e857e6ea684d4ca8a67339e163022d.jpeg

很简单,矩阵是一堆数安排在平面上变成几行几列的结构,上面矩阵三行两列(3×2)

矩阵×数即把矩阵中每个数都×这个数

最困难且有用的操作是矩阵的乘积

830684946c4f496fab8fd408b95c0991.jpeg

给定两个矩阵也要它们能乘才可以 (第一个矩阵的列数=第二个矩阵的行数)

矩阵相乘不满足交换律:

b46dc3ce810c4f378f98a491535eb13c.png

结合律很有用 

矩阵和向量相乘(列向量)

fea3cf8e1c9a4aeb8a222e0fb2f44976.png

通过算变换,将x和y变成-x和y,可用于求镜像

矩阵转置

68bc66244af146cfb0a2b35884279e85.jpeg

行列互换,没什么好说的 (乘积转置顺序要做调换)

单位矩阵

04e7c181b7ae415ea7fb4332c300ed19.jpeg

单位矩阵基本上不用来做任何操作,但可以用来计算矩阵的逆,两个矩阵相乘得到单位阵,则这两个矩阵互逆

415fa457141841e891a356fcd5e8ec3b.jpeg

 向量的点乘和叉乘都可以写成矩阵形式,叉乘则是A*和b相乘(后续旋转的 推导方面很有用)

场景实例:相机(视角)在场景中移动,可以向各个方向看,涉及到旋转,如何定义相机的运动和变换

哼哼,,,

8e3bec2f1ac9499396da6ef2181fa5b4.png

 

 

这篇关于线代与图形学的暧昧二三事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011837

相关文章

图形学之腐蚀膨胀

腐蚀(erode)膨胀(dilate)其实是两种非常形象的操作,但是有的时候容易搞混淆。 腐蚀(erode),是将灰度值小(视觉上就是比较暗)的区域增强扩展,主要用来去除比较亮的噪点。膨胀(dilate),是将灰度值大(视觉上就是比较亮)的区域增强扩展,主要用来连通相似颜色或强度的区域。 然后腐蚀与膨胀涉及的一个重要概念就是核,也可以称之为模板或者掩码。核具有几个重要的属性,形状(圆形、方

工作二三事

最近工作上的事让我很尴尬,首先,帮助开发的一个系统生产上功能出现了bug,两次都是很隐藏很深的bug,一下子就感觉有点抬不起头,自尊心太强了哎,虽然以前也常出bug,不过这次是帮助别人开发系统,总归有点觉得对不起同事也觉得让别人失望了。同时自己的团队也出现了问题,也基本没管下面的开发,带的一个开发连续两次被测试追着要解决问题,大领导也知道在那边讨论,一下感觉自己的压力山大。 回家中,坐下慢慢思

图像处理(计算机图形学)和计算机视觉的区别和关系

随着工业互联网的发展,图片处理(计算机图形学)和计算机视觉的应用越来越多,两者有区别也有紧密联系,在此进行简单介绍,共同学习。 图像处理(计算机图形学): 是对输入的图像做某种变换,输出仍然是图像,基本不涉及或者很少涉及图像内容的分析。比较典型的有图像变换,图像增强,图像去噪,图像压缩,图像恢复,二值图像处理等等。基于阈值的图像分割也属于图像处理的范畴。它一般处理的是单幅图像。 计算机视觉:

计算机图形学:中点画圆算法

在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可以通过

GAMES101图形学笔记1

一、图形学的应用 1.游戏渲染、光照 2.电影特效 3.面部、动作捕捉,如Avatar(阿凡达)中的面部捕捉 4.设计 建筑设计,汽车设计 5.虚拟现实VR 增强现实AR 6.数码插画 笔刷 PS软件等 7.模拟、仿真 8.GUI 界面设计等 9.字体设计typography 二、为什么学习图形学 1.图形学是一门Awesome的学科,能够创造很多有意思的东西,有意思的图像 2.了解并学习一

关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构

前言 作为一个爱好Java的程序猿,自然少不了对JVM的学习和研究,《深入理解Java虚拟机》一书,大概从头到尾完整地看了四五遍,有些地方感觉讲的粒度比较粗,但只是少数,总体而言,这本书讲解的非常棒,不少东西都是看了第二次,甚至第三次之后才有了进一步的理解。 走进Java-Java技术体系 从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关程序都属于J

计算机图形学入门18:曲面

1.曲面定义         曲面(Surface)在图形学中应用非常广泛,可以用它来描述各种三维物体的表面。如下图所示。 2.贝塞尔曲面 2.1 介绍         曲线和曲面一样都是物体显示的表示方法,自然可以把曲线的概念延伸到平面上。如上图所示,就是贝塞尔曲面(Bezier Surface)构成的表面,并且可以看到是分段面拼接的。         如果对完整的表面进行分解

25考研线代攻略,老师及习题册推荐!

其实很多经验贴对大家有一定的误导 网上很多人说李永乐讲的好,确实好,但是没有说听李永乐的线代需要一定的基础 于是很多人去听完李永乐,就懵逼了,这讲的很乱啊,听的一头雾水。 其实,李永乐的基础班授课采用串联式,非常系统。他在讲解行列式时会涉及特征值,讲解向量时又会提到方程组的知识点,因此容易让人感觉有些跳跃。 你听得吃力是完全正常的。 如果你在学习线性代数时也遇到类似问题,推荐大家试试以下

计算机图形学之图像变换与标定

一.齐次坐标的定义 1.齐次坐标定义 2.齐次坐标的理解 二.最小二乘法 1.最小二乘法 2.最小二乘计算仿射矩阵 三.图像变换 1.关于图像变换的总结 2.旋转矩阵推导 3.刚体变换与仿射变换实现 4.利用SVD求解刚体变换矩阵 5.计算两个点集间的刚体变换 6.奇异值分解的推理 7.3D点云配准之刚体变换 四.标定 1.九点标定 2.opencv九点标定 五.

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针,分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast,最后一个空间的下一个位置Myend;当你插入数据的时候,先判断当前容量够不够,不够的话通过内存分配子扩充容量,至于扩充的算法,可能有些编译器不大相同,像vc6.0的话,就是成倍扩充,比如当前是2,扩充到4,4不够用了之