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

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.mzph.cn/news/843002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32硬件接口I2C应用(基于BH1750)

目录 概述 1 STM32Cube控制配置I2C 1.1 I2C参数配置 1.2 使用STM32Cube产生工程 2 HAL库函数介绍 2.1 初始化函数 2.2 写数据函数 2.3 读数据函数 3 光照传感器BH1750 3.1 认识BH1750 3.2 BH1750寄存器 3.3 采集数据流程 4 BH1750驱动实现 4.1 接口函数实现 4.2…

vite+js配置

vite js 配置路径 npm install types/node --save-dev vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue //需要引入 import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {a…

港口与航运3D三维虚拟仿真展区让更多人了解到海洋知识

在短短20天内,搭建起200多家线上3D展厅,听起来似乎是一项艰巨的任务。然而,对于我们的3d云展平台而言,这早已成为常态。连续三年,我们已成功为众多会展公司在短时间内构建出几百家甚至上千家的线上3D展会,见…

简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

代码很简单。 import numpy as np import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------ def bandstop(M,low,high,Fs):#50Hz removalk1 int( (low/Fs)*M) # index 22k2 int( (high/Fs)*M) # index 27#DC removalk0 …

关于C++的IO流简单总结

基础IO流 C的IO以面向对象的形式实现, 同时兼容了C语言面向过程的IO方式 C 标准库提供了四个基本流对象: cin:用于从标准输入(通常是键盘)读取数据。 cout:用于向标准输出(通常是控制台)写入…

怎么使用Stable diffusion中的models

Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model,是预先训练好的Stable diffusion权重,用于生成特定风格的图像。模型生成的图像类型取决于训练图像。 如果训练数据中从未出现过猫的图像,模型就无法生成猫的…

面试八-存泄漏是什么,有哪几种,怎么解决?

一、内存泄漏几种情况 当使用基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么在使用基类指针来删除这个对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这就导致了派生类中的资源无法正确释放&#xff…

22公司斩获亚洲品牌经济峰会“亚洲数字化服务领军企业奖”

5月25日,以“亚洲新势力:创新、融合与可持续发展”为主题的亚洲品牌经济峰会2024深圳会议在深圳益田威斯汀酒店举办,本次活动由中国亚洲经济发展协会指导,由亚洲国际品牌研究院主办,旨在搭建品牌创新与经济发展交流平台…

B站pink老师CSS学习(一)

文章目录 一、CSS基础选择器1.标签选择器2.类选择器3. id选择器4.通配符选择器 二、字体属性1.字体2.字体大小3.字体粗细4.文字样式5.复合属性 三、文本属性1.文本颜色2.对齐文本3.装饰文本4.文本缩进5.行间距 四、CSS引入方式1. 内部样式表2.行内样式表3.外部样式表 一、CSS基…

CTF流量分析之wireshark使用

01.基本介绍 在CTF比赛中,对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含流量数据的pcap文件,参赛选手通过该文件筛选和过滤其中无关的流量信息,根据关键流量信息找出flag或者相关线索。 pcap流量包的分析通常…

响应式页面布局处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种,当然也会有其他方法,欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap, 最后,你可以通过给子元素设置 flex 属性来控制它们的…

布隆过滤器-详解及使用

一、什么是布隆过滤器 1、简介 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。可以用于检索一个元素是否在一个集合中。。理解为SET集合。 布隆过滤器其内部维护了一个全为 0 的 bit 数组,需要说明的是,布隆过滤器有一个误判的概念&#xf…

如何搭建雾锁王国多人联机服务器,搭建教程分享

雾锁王国(Enshrouded)是一款融合了生存、制作以及动作RPG战斗的游戏,2024年1月24日在Steam平台以抢先体验形式发售,支持中文。游戏背景设定在一个基于体素构筑的辽阔大陆上。玩家将在这个开放世界中自由选择前进的方向&#xff0c…

机器视觉HALCON:3.图像获取,运算,率噪,滤波(边缘),锐化

目录 图像获取生成单通道图像图像运算加法运算减法运算乘法运算除法 仿射变换图像平滑(噪点处理)高斯滤波均值滤波中值滤波多图像均值 边缘滤波索贝尔滤波凯尼滤波 图像锐化索贝尔锐化拉普拉斯锐化高通滤波锐化几种锐化方式对比 图像获取 用到的函数&…

8个最佳实践,助你打造成功的短剧平台开发团队

当涉及到跨境电商平台开发,成功的团队至关重要。在这篇文章中,我将分享8个最佳实践,助你打造成功的短剧平台开发团队。无论是经验丰富的团队还是初创企业,这些实践都能为你的团队带来价值,提高开发效率,确保…

lua 计算第几周

需求 计算当前赛季的开始和结束日期,2024年1月1日周一是第1周的开始,每两周是一个赛季。 lua代码 没有处理时区问题 local const 24 * 60 * 60 --一整天的时间戳 local server_time 1716595200--todo:修改服务器时间 local date os.date("*t…

快速复制成功模式:解读SaaS裂变工具的核心价值

在数字化快速发展的今天,企业如何在竞争激烈的市场中迅速站稳脚跟,成为许多企业家和管理者关注的焦点。SaaS裂变工具作为一种创新的解决方案,以其独特的优势,帮助企业快速复制成功模式,实现业务的快速增长。 SaaS裂变工…

Mysql 单行转多行,把逗号分隔的字段拆分成多行

一、拆分前后的数据 二、执行SQL select substring_index(substring_index(a.gzlx,,,b.help_topic_id1),,,-1) gzlxname, a.gzlx,a.* from dt_task_zxgz_info a join mysql.help_topic b on b.help_topic_id < (length(a.gzlx) - length(replace(a.gzlx,,,))1) 三、解释说…

cobalt strike基础测试

下载链接4.3&#xff1a;https://pan.baidu.com/s/1E_0t30tFWRiE5aJ7F-ZDPg 链接4.0&#xff1a;https://pan.baidu.com/s/1SkMmDem3l6bePqIDgUz2mA 提取码&#xff1a;burp 一、简介&#xff1a; cobalt strike(简称CS)是一款团队作战渗透测试神器&#xff0c;分为客户端…

使用大模型LLM实现销售AI

想象一个场景&#xff0c;客户通过聊天窗口咨询一款产品。销售AI首先使用LLM解析客户的问题&#xff0c;然后通过智能代理查询数据库获取产品详细信息&#xff0c;并以自然而友好的方式回应客户。 在对话过程中&#xff0c;AI可以评估客户的兴趣&#xff0c;并主动提供促销信息…