矩阵

Unity Shader学习笔记(一)坐标变换

喜夏-厌秋 提交于 2019-12-26 20:08:58
基本问题   试想我们的美术做了一个3D模型,然后渲染引擎把模型渲染到屏幕上。我们还可以选定不同的视角,模拟不同的光照条件去观察模型。现在来分析一下这个过程。如果说我们把这个过程看成一个函数,那么函数的输出就是屏幕上的图像。确切地说,是屏幕上的每个像素。这个函数的主要输入是这个3D模型,我们观察的视角,光照情况等等因素。渲染过程就是给出这些因素决定每个像素值的过程。   首先来看模型。模型通常是由可视化的建模软件制作,看上去是一个“实体”。然而从计算机的角度来说,模型文件只不过是包含渲染它所需要的数据的文件。真实世界中的物体细节是无法穷尽,极其复杂的。所以我们进行简化,把物体简化成多面体,进一步的,简化成每个面是三角形的多面体。(对于曲面和细节较多的地方,我们可以用更多更小的三角面来拟合)。很显然,每个顶点的相对位置是重要的。它决定了模型的形状。由于需要描述位置,自然就有了选择坐标空间的问题。模型描述自身顶点坐标的空间称为模型空间。于是我们可以得出模型文件里一定要包含模型空间下的顶点坐标。   通常,在一个渲染的场景中,包含了多个渲染的物体。它们根据不同的位置摆放,当然会构成不同的场景。那么为了描述场景里模型之间的相对位置,我们会选择一个独立于模型的坐标空间,称为世界空间。有了世界空间,我们也可以描述观察者的位置和观察的角度。这个观察者,通常我们可以叫它为camera

Direct3D基础(顶点坐标变换)

我的梦境 提交于 2019-12-26 20:07:06
开始的话:顶点坐标变换时Direct3D学习中的入门基础,在这里将详述其原理: Direct3D中渲染三维对象的过程分为两个阶段:《1》T&L(Transforming and Lighting),即坐标变换和光照; 《2》光栅化处理阶段。 一,T&L流水线: 如下图: 1,世界变换和世界坐标系( 局部坐标变为世界坐标 ): 物体在三维空间中的变形和运动的过程称为世界变换(平移,旋转,缩放),这个三维空间就是世界空间,其坐标系就是三维坐标系 世界变换 事实上就是将物体顶点从模型空间转换到世界空间中,模型空间其实就是在三维设计软件(如3DSMAX)中为物体设定的坐标系,也称局部坐标系。而世界坐标则是所有物体都是用同一个世界坐标原点的坐标系,变换就是指对模型进行平移,旋转,缩放及它们的任意组合变换。 使用以下公式对点P1进行世界变换。 P2(X,Y,Z,1)= dot( P1(X,Y,Z,1), M ) M 为世界变幻矩阵,它实现物体的平移,旋转,缩放,dot为点乘,P2为变换后的坐标,p1为变换前的坐标。 以下为实现世界坐标矩阵变换的DirectX代码(C++): D3DXMATRIX matWorld; // 世界变换矩阵 D3DXMATRIX matTranlate,matRotation,matScale; // 变换矩阵,旋转矩阵,缩放矩阵 D3DX

[算法系列之三十三]杨氏矩阵

安稳与你 提交于 2019-12-26 19:09:38
即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。 给出判定某个数是否存在该矩阵中的高效算法。 分析: 为了便于复杂度分析,我们暂时假定该矩阵为大小n*n。如下图所示为一个杨氏矩阵。 二分搜索解法: 许多人都观察到了矩阵在二维上都是有序的,所以使用在每一行(或者每一列)使用二分搜索是很自然的想法。由于每一行二分搜索需要O(lgn)时间,搜索n行需要O(nlogn)的时间。显然这个时间复杂度还是不够高效。当然这只是第一步尝试,不要让自己过早的陷入到二分搜索的泥潭中,好的方法还在后面。 一种错误的想法: 如果不细心也许会掉入一个陷阱中。有人也许认为可以先从行来判定,如果某个数位于某2行间,则只需要检查相应的2列即可,这是错误的。如下左边图所示,假定我们需要查找9是否在矩阵中,由于9位于7到11之间,所以接下来在7和11的这两列中(这2列在图中高亮显示)二分查找9,虽然能够查找到9,虽然查找9成功了,但是这个方法是错误的。因为10也位于7到11之间,但是10并不在这2列中。 即便是如下右边图示查询范围包括2行2列,尽管在查找9和10都成功,但是还是错误的,反例大家可以自己找一个。 Step-wise线性搜索解法: 从右上角开始,每次将搜索值与右上角的值比较

numpy的使用说明(一)

我怕爱的太早我们不能终老 提交于 2019-12-26 17:34:02
1、numpy的简介 numpy是"Numerical Python"的简称。 numpy提供了一个高性能的多维数组对象ndarray(N Dimension Array),以及大量的库函数和操作,可以帮助程序员轻松地进行数值计算。 原生python语言执行速度很慢,C执行500次,python差不多只能执行一次,但是python语法比其它编程语言要简单的多得多。因此我们既想要某一个编程语言执行速快,同时还编程简单。最终python通过集成C和C++,最终解决这个问题,也就是说:底层运行的是C和C++的代码,但是上层使用的是python语言去写的。这就是我们为什么都喜欢使用"numpy库"的原因。 numpy作为很多的用来做数据挖掘,数据分析,人工智能相关的技术组件的底层实现。像SciPy、Matplotlib、Scikit-learn在一定程度上,都需要依赖numpy。 2、学习numpy的套路 学习怎么使用numpy组织数据 (怎么创建出,你想要的不同维度,不同形状的数组) :numpy提供了一个高性能的多维数组对象:ndarray。 学习numpy提供的函数处理这个组好的数据:numpy提供了很多很多的库函数,帮助我们处理这些数据。 3、关于numpy中ndarray数据对象的结构说明 numpy中最重要的数据结构是称为ndarray的n维数组对象,这个对象由两部分构成: 1

C#矩阵运算类

只谈情不闲聊 提交于 2019-12-26 10:01:20
命名空间:matrix 定义类:Matrix 方法: public Matrix(int mm, int nn) 定义矩阵A: Matrix A=new Matrix(int mm, int nn); public double read(int i, int j) 获取Aij: A.read(i,j); public int write(int i, int j, double val) 将数据b写入Aij: A.read(i,j,b); 释放矩阵: public void freeMatrix() A.freeMatrix(); 方法: //C = A + B //成功返回1,失败返回-1 public int add(ref Matrix A, ref Matrix B, ref Matrix C) //C = A - B //成功返回1,失败返回-1 public int subtract(ref Matrix A, ref Matrix B, ref Matrix C) //C = A * B //成功返回1,失败返回-1 public int multiply(ref Matrix A, ref Matrix B, ref Matrix C) //行列式的值,只能计算2 * 2,3 * 3 //失败返回-31415,成功返回值 public double det(ref

C--动态申请二维数组

。_饼干妹妹 提交于 2019-12-26 09:55:15
# include <stdio.h> # include <malloc.h> int * * malloc2d ( int row , int col ) { int * * ret = NULL ; if ( ( row > 0 ) && ( col > 0 ) ) { int * p = NULL ; ret = ( int * * ) malloc ( row * sizeof ( int * ) ) ; p = ( int * ) malloc ( row * col * sizeof ( int ) ) ; if ( ( ret != NULL ) && ( p != NULL ) ) { int i = 0 ; for ( i = 0 ; i < row ; i ++ ) { ret [ i ] = p + i * col ; } } else { free ( ret ) ; free ( p ) ; ret = NULL ; } } return ret ; } void free2d ( int * * p ) { if ( * p != NULL ) { free ( * p ) ; } free ( p ) ; } int main ( ) { int * * a = malloc2d ( 3 , 3 ) ; //malloc申请的内存需要先清零

优雅的线性代数系列一

狂风中的少年 提交于 2019-12-26 09:47:51
 说道线性代数, 我们自然就想到矩阵, 那我们该如何理解矩阵呢? 矩阵与线性变换 若一个变换 \(L\) 满足以下两条性质 \[ \begin{align*} L(\vec v+ \vec w) &= L(\vec v) + L(\vec w) &(1) \text{"可加性"} \\ L(c\vec v) &= c L(\vec v) \quad\quad\ &(2) \text{"成比例"} \end{align*} \] 则称 \(L\) 是线性的. 值得注意的一点时, 线性变换中, 坐标系的原点不动, 即零向量的变换结果还是零向量. 我们来看看矩阵与线性变换的关系 \[ A(v+w) = Av + Aw \Leftrightarrow L(\vec v+ \vec w) = L(\vec v) + L(\vec w)\\ A(cv) = c(Av) \Leftrightarrow L(c\vec v) = c L(\vec v) \] 可以看出矩阵完全满足线性变换的要求, 所以现在你应该将矩阵看做线性变换, 这会给我们理解很多线性问题带来很大的好处. \(\bigstar\) 如果想知道线性变换对于一个输入向量空间有什么影响, 我们只需要知道该线性变换对该输入空间的基有什么影响, 我们就能知道所有信息. 假设 n 维输入空间 \(R^n\) 的基为 \(v1, v_2,

Matlab操作矩阵的相关方法

社会主义新天地 提交于 2019-12-26 09:34:47
Matlab操作矩阵的相关方法 下面这篇文章主要是对吴恩达老师机器学习中matlab操作的一个整理和归纳 一、基本操作 1.生成矩阵( ones、zeros ) A = [1 2;3 4;5 6] #生成3行4列的矩阵 B = [1 2 3] #B就是一个行向量 C = [1;2;3] #定义c为一个列向量 D = 1:0.1:2 #定义开始值为1,步长为0.1,结束值为2的一个行向量 E = 1:6 #定义开始值为1,步长默认为1,结束值为6的行向量 ones(2,3) #矩阵中所有元素都为1 定义一个2行3列的矩阵 zeros(2,3) #矩阵中所有的元素都为0 定义一个2行3列的矩阵 2.生成随机矩阵( rand、randn ) rand(1,3) #生成1行3列的随机矩阵 randn(2,3) #生成高斯随机矩阵,高斯随机矩阵即为标准差或方差为1 3.生成单位矩阵( eye(n) ) eye(n) #生成n行n列的单位矩阵 4.帮助命令( help ) help 变量名 #可查看函数的API详解 二、移动数据 1.操作.txt文件( load ) 1.1 加载.txt文件并且拆分文件的行和列的值 data = load('文件路径') #加载文件 获取多列的数据(获取多行的数据和多列类似,只需要修改第一个参数即可) data(:,1) #拿到所有行第一列的数据 data(:

MATLAB基础(3)

落爺英雄遲暮 提交于 2019-12-26 09:34:29
1.MATLAB的运算 本次介绍的是MATLAB中的运算符。分别有算术运算符,关系运算符和,逻辑运算符。 表3.1 算术运算符 运算符 说明 运算符 说明 + 加法 .\ 左除法 - 减法 \ 矩阵左除法 .* 乘法 .^ 求幂 * 矩阵乘法 ^ 矩阵求幂 ./ 右除法 .' 转置 / 矩阵右除法 ' 矩阵求秩,复数求共轭 表3.2 关系运算符 运算符 说明 函数 < 小于 lt(a,b) <= 小于等于 le(a,b) > 大于 gt(a,b) >= 大于等于 ge(a,b) == 恒等于 eq(a,b) ~= 不等于 ne(a) 表3.3 逻辑运算符与函数对应表 运算符 说明 函数 & 与运算 and(a,b) | 或运算 or(a,b) ~ 非运算 not(a) xor 异或 xor(a,b) 2.MATLAB的矩阵 表3.4 构造特殊矩阵函数表 函数 说明 ones(n); ones(n,m) 建立一个元素都为1的矩阵 zeros(n); zeros(n,m) 建立一个元素都为0的矩阵 eye(n); eye(n,m) 建立一对角线元素为1,其他元素都为0的矩阵 diag(v); diag(X); diag(v,k); diag(X,k) 将一个向量变成一个对角矩阵,或求一个矩阵的对角元素 magic(n) 建立一个方阵使得它的每一行,每一列,和对角线元素的和都相等

Matlab语法

倖福魔咒の 提交于 2019-12-26 09:34:08
第一节 基本 数值计算 1. 变量:分为数值变量和字符变量 2. 常量:计算机中不变的量。如i、j、pi、NaN(不确定)、Inf(无穷大) 3. 字符变量:将字符串作为变量。有三种方法表示: (1) 用单引号' ' (2) 用函数sym(' ') (3) 用命令symbs 4. 举例 x=2 % 将2赋给变量x y=3 ; % 有;表示在命令窗口不显示y的值 z=x^2 -y % 数值计算。输出结果为1 f='sin(x)' % 用单引号定义一个字符变量 g=sym('cos(y)') % 用函数sym(' ')定义一个字符变量 syms a b % 用命令syms定义字符变量。一般用于多符号变量的定义 u=2*a % 字符计算。输出结果为2*a w=b^2-1 % 字符计算。输出结果为b^2-1 fg=f+g % 字符计算。输出结果为sin(x)+cos(y) uw=u*w % 字符计算。输出结果为2*a*(b^2-1) u/w % 字符计算。输出结果为2*a/(b^2-1) 第二节 矩阵构造及运算 Matlab中数据的结构形式就是一个矩阵。如x=2是一个1×1的矩阵 1. 矩阵的建立 (1) 直接输入法。 (2) 冒号法(1×N)。 (3) 函数法(特殊矩阵)。 (4) 矩阵的编辑(Array Editor)。 2. 向量 向量是1×N的特殊矩阵 ,即只有一行或者一列