OpenGL学习

文章介绍了在OpenGL中向量和矩阵的概念及其运算,包括向量的加减乘除、点乘和叉乘,以及矩阵的乘法和与向量的乘法。点乘用于计算角度、投影,叉乘用于计算法向量和旋转。矩阵在3D图形变换和投影中起到关键作用,矩阵相乘遵循特定规则,不满足交换律。
摘要由CSDN通过智能技术生成

向量

在OpenGL中,向量是一个数学概念,用于描述空间中的方向和大小。向量通常由一组数字表示,这些数字代表了在三个不同轴上的分量,例如三维空间中的x、y和z轴。

在OpenGL中,向量通常用于描述3D图形中的位置、方向和光照等属性。例如,一个法向量(也称为“表面法线”)用于描述一个面或曲面的朝向,它在渲染过程中用于确定面对光源时的亮度。

在OpenGL中,向量可以进行各种运算,如加法、减法、乘法和除法。这些运算可以用于执行各种图形转换和计算,例如矩阵变换、投影、旋转和缩放。

向量与标量运算

在OpenGL中,向量和标量运算是常见的数学操作。

向量运算是对向量的各个分量执行相应的数学操作,例如加法、减法、乘法和除法。这些操作可以用于执行各种图形转换和计算,例如矩阵变换、投影、旋转和缩放。例如,两个向量相加会将它们的各个分量相加,得到一个新的向量作为结果。

标量运算是对标量(即单个数字)执行数学操作。标量可以是整数或浮点数,而向量则由多个标量组成。标量运算可以与向量运算结合使用,例如将一个向量的各个分量乘以一个标量,或将一个标量加到一个向量的各个分量中。

在OpenGL中,向量和标量运算都是必要的操作,用于执行各种图形计算和变换。例如,在执行几何变换时,可以使用向量和标量运算来对顶点进行移动、旋转、缩放和投影。

点乘

在向量代数中,点乘(又称为“内积”或“数量积”)是指将两个向量相乘并将结果相加的操作。在OpenGL中,点乘通常用于计算两个向量之间的角度、投影和长度等。

点乘操作的结果是一个标量,它表示两个向量之间的相似程度。点乘操作的数学表示如下:

a · b = |a| × |b| × cos(θ)

其中,a和b是两个向量,|a|和|b|是它们的长度,θ是它们之间的夹角。

在OpenGL中,可以使用以下代码来计算两个向量a和b之间的点乘:

float dotProduct = dot(a, b);

其中,dot函数是OpenGL中的内置函数,用于计算两个向量之间的点乘。点乘的结果存储在dotProduct变量中。

点乘操作的结果有以下几个特点:

如果两个向量之间的夹角为0度,则它们之间的点乘结果为它们的长度的乘积,即两个向量之间的相似程度最高;
如果两个向量之间的夹角为90度,则它们之间的点乘结果为0,即它们之间没有相似程度;
如果两个向量之间的夹角为180度,则它们之间的点乘结果为它们长度的乘积的相反数,即它们之间的相似程度最低。

叉乘

在向量代数中,叉乘(又称为“外积”或“向量积”)是指将两个向量相乘得到一个新的向量的操作。在OpenGL中,叉乘通常用于计算面的法向量、角度和旋转等。

叉乘操作的结果是一个新的向量,它的方向垂直于原来的两个向量,并且遵循右手定则。叉乘操作的数学表示如下:

a × b = |a| × |b| × sin(θ) × n

其中,a和b是两个向量,|a|和|b|是它们的长度,θ是它们之间的夹角,n是一个垂直于a和b的向量,它的方向由右手定则确定。

在OpenGL中,可以使用以下代码来计算两个向量a和b之间的叉乘:

vec3 crossProduct = cross(a, b);

其中,cross函数是OpenGL中的内置函数,用于计算两间的叉乘。叉乘的结果存储在crossProduct变量中。

叉乘操作的结果有以下几个特点:

结果向量的长度等于两个向量长度的乘积与它们之间夹角的正弦值,即 |a × b| = |a| × |b| × sin(θ);
结果向量的方向垂直于原来的两个向量,并且遵循右手定则;
如果两个向量平行,则它们之间的叉乘结果为零向量;
如果两个向量反向,则它们之间的叉乘结果的方向相反。
叉乘操作在图形学中非常有用,因为它可以用于计算表面的法向量,从而实现光照、阴影和反射等效果。另外,叉乘操作还可以用于计算旋转矩阵,从而实现3D对象的旋转和变换。

矩阵

矩阵是一个二维数组,其中的元素可以是数字、符号或函数。在计算机图形学中,矩阵被广泛应用于3D图形的变换、投影和仿射等方面。矩阵是图形学中非常重要的概念,因为它们可以用于描述和处理2D和3D对象的位置、方向、大小和形状等信息。

矩阵可以表示为一个m×n的矩形阵列,其中m表示行数,n表示列数。矩阵中的每个元素都可以用下标来表示,如a[i][j]表示第i行、第j列的元素。矩阵中的每个元素都可以进行加、减、乘、除等基本运算,以及转置、求逆、行列式等高级运算。

在OpenGL中,矩阵被广泛用于3D图形的变换。例如,通过变换矩阵可以将一个3D对象从一个位置、方向、大小和形状变换为另一个位置、方向、大小和形状。变换矩阵通常是4×4的矩阵,其中前三列表示对象的方向和大小,第四列表示对象的位置。

OpenGL提供了许多矩阵操作函数,例如矩阵乘法、矩阵求逆、矩阵转置等。这些函数可以帮助开发人员轻松地进行矩阵运算,从而实现各种3D图形的变换和投影效果。

矩阵相乘

矩阵相乘是指将两个矩阵相乘得到一个新的矩阵的操作。在OpenGL中,矩阵相乘是3D图形变换中非常重要的操作之一。矩阵相乘可以用于将一个3D对象从一个位置、方向、大小和形状变换为另一个位置、方向、大小和形状。

矩阵相乘的规则是:两个矩阵A和B相乘得到的新矩阵C,其第i行第j列的元素为A的第i行与B的第j列对应元素相乘再相加的结果,即:

C[i][j] = A[i][1]×B[1][j] + A[i][2]×B[2][j] + … + A[i][n]×B[n][j]

其中,A和B分别为两个矩阵,n为矩阵的列数。

在OpenGL中,可以使用以下代码来计算两个4×4的矩阵A和B的乘积:

float A[16], B[16], C[16];
// 初始化A和B矩阵
...
// 计算A和B的乘积
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(A);
glMultMatrixf(B);
glGetFloatv(GL_MODELVIEW_MATRIX, C);

其中,glMultMatrixf()函数是OpenGL中的内置函数,用于将当前的变换矩阵与指定的矩阵相乘,并将结果存储在当前的变换矩阵中。glMatrixMode(GL_MODELVIEW)和glLoadIdentity()函数分别用于设置当前的矩阵模式和将当前的变换矩阵设置为单位矩阵。最后,使用glGetFloatv(GL_MODELVIEW_MATRIX, C)函数将结果矩阵C从OpenGL中读取出来。

需要注意的是,矩阵相乘不满足交换律,即A×B不等于B×A。因此,在进行矩阵相乘时,需要注意矩阵的顺序。

矩阵与向量相乘

矩阵与向量相乘是指将一个矩阵和一个向量相乘得到一个新的向量的操作。在OpenGL中,矩阵和向量的乘法常常被用于进行3D图形的变换。

矩阵和向量的乘法规则是:一个m×n的矩阵A与一个n×1的列向量B相乘得到一个m×1的列向量C,其中C的第i个元素为A的第i行与B的对应列相乘再相加的结果,即:

C[i] = A[i][1]×B[1] + A[i][2]×B[2] + … + A[i][n]×B[n]

其中,A是一个m×n的矩阵,B是一个n×1的列向量,C是一个m×1的列向量。

在OpenGL中,可以使用以下代码来计算一个4×4的矩阵A和一个4维向量V的乘积:

float A[16], V[4], R[4];
// 初始化A和V矩阵
...
// 计算A和V的乘积
R[0] = A[0]*V[0] + A[4]*V[1] + A[8]*V[2] + A[12]*V[3];
R[1] = A[1]*V[0] + A[5]*V[1] + A[9]*V[2] + A[13]*V[3];
R[2] = A[2]*V[0] + A[6]*V[1] + A[10]*V[2] + A[14]*V[3];
R[3] = A[3]*V[0] + A[7]*V[1] + A[11]*V[2] + A[15]*V[3];

其中,矩阵A和向量V分别为4×4的矩阵和4维向量,R为结果向量。这段代码通过对A的每一行和向量V进行内积的方式计算了结果向量R的每个元素。

需要注意的是,在矩阵和向量相乘时,矩阵的列数必须等于向量的维数,否则无法进行相乘操作。同时,由于矩阵和向量的乘法规则中的元素顺序是固定的,因此在编写代码时需要注意元素的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值