精华内容
下载资源
问答
  • 矩阵缩放
    2021-01-20 20:00:49





    一、绘制三角形



    先绘制一个三角形 , 矩阵变换的主题就是该三角形 ;

    OpenGL 三角形绘制相关参考 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 ) 博客 ;


    代码示例 :

    		// 渲染场景
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    

    运行效果 :

    在这里插入图片描述





    二、选中矩阵设置



    【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )
    博客中简单介绍了 投影矩阵 和 模型视图矩阵 ;

    进行 平移 , 缩放 , 旋转 等矩阵操作 , 主要针对 模型视图矩阵 进行操作 ;

    在进行 OpenGL 环境渲染时 , 选中了 GL_MODELVIEW 模型视图矩阵后 , 就开始了渲染 , 后面操作的矩阵都是针对该 GL_MODELVIEW 矩阵的 ;

    下面的代码是设置矩阵的代码 , 之后就开始了 OpenGL 模型渲染 , 也就是说模型渲染过程中 , 全程都选中了模型矩阵 , 在渲染时进行的矩阵操作 , 都是操作的该选中的 模型视图矩阵 ;

       // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 
    
       // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
       glMatrixMode(GL_PROJECTION);
       // ( 给投影矩阵设置值 ) 向投影矩阵设置参数
       // 参数一 : 50.0f 是摄像机的视口角度
       // 参数二 : 800.0f / 600.0f 是窗口的宽高比
       // 参数三 : 0.1f , 可视的最近的距离
       // 参数四 : 1000.0f , 可视的最远距离
       gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
    
       // 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置
    
       // ( 选中模型矩阵 )
       glMatrixMode(GL_MODELVIEW);
       // ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
       glLoadIdentity();
    

    下面讲的 旋转 , 平移 , 变换 , 都是针对模型视图矩阵进行的操作 ;





    三、矩阵缩放变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glScalef 方法设置缩放矩阵 , 第 1 1 1 个参数代表 x 分量的缩放 , 第 2 2 2 个参数代表 y 分量的缩放 , 第 3 3 3 个参数代表 z 分量的缩放 ;

    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		glScalef(2.0f, 2.0f, 1.0f);
    

    代码示例 : 这里将 x , y 两个分量增加 2 倍 , 相应的点的 x, y 分量都乘以 2 ;

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		glScalef(2.0f, 2.0f, 1.0f);
    
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行效果 : 对比 ( 一 ) 中的三角形 , 增加了 2 倍 ;

    在这里插入图片描述





    四、矩阵旋转变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glRotatef 方法设置旋转矩阵 , 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 如果对应值设置为 1 , 则绕该轴旋转 , 这里设置的是绕 z 轴旋转 30 度 ;

    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    

    旋转的方向确定 : 大拇指指向旋转轴的方向 , 食指指向的方向就是旋转方向 ;


    代码示例 :

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		//glScalef(2.0f, 2.0f, 1.0f);
    
    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行结果 : 三角形绕 z 轴旋转了 30 度 ;

    在这里插入图片描述





    五、矩阵平移变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glTranslatef 方法设置平移矩阵 , 三个参数对应 xyz 三个方向平移的值 ;

    		// 平移变换 
    		// 设置 xyz 三个方向平移的值
    		glTranslatef(0.0f, -2.0f, 0.0f);
    

    代码示例 :

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		//glScalef(2.0f, 2.0f, 1.0f);
    
    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		//glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    
    		// 平移变换 
    		// 设置 xyz 三个方向平移的值
    		glTranslatef(0.0f, -2.0f, 0.0f);
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行结果 :

    在这里插入图片描述





    六、相关资源



    GitHub 地址 : https://github.com/han1202012/OpenGL
    ( GitHub 源码始终都会随着后续博客的进度更新覆盖 , 可能没有本博客的相关源码 , 推荐下载博客源码快照 ) ;

    博客源码快照 : https://download.csdn.net/download/han1202012/14895562
    ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )

    更多相关内容
  • 【OpenGL】二十、OpenGL 矩阵变换 ( 矩阵缩放变换 | 矩阵旋转变换 | 矩阵平移变换 ) https://hanshuliang.blog.csdn.net/article/details/112859256 博客源码 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio ...
  • 1、矩阵缩放 对一个向量进行缩放(Scaling)就是对向量的长度进行缩放,而保持它的方向不变。由于我们进行的是2维或3维操作,我们可以分别定义一个有2或3个缩放变量的向量,每个变量缩放一个轴(x、y或z)。 OpenGL通常...

    1、矩阵缩放

    对一个向量进行缩放(Scaling)就是对向量的长度进行缩放,而保持它的方向不变。由于我们进行的是2维或3维操作,我们可以分别定义一个有2或3个缩放变量的向量,每个变量缩放一个轴(x、y或z)。
    OpenGL通常是在3D空间进行操作的,对于2D的情况我们可以把z轴缩放1倍,这样z轴的值就不变了。我们刚刚的缩放操作是不均匀(Non-uniform)缩放,因为每个轴的缩放因子(Scaling Factor)都不一样。如果每个轴的缩放因子都一样那么就叫均匀缩放(Uniform Scale)
    我们下面会构造一个变换矩阵来为我们提供缩放功能。我们从单位矩阵了解到,每个对角线元素会分别与向量的对应元素相乘。如果我们把1变为3会怎样?这样子的话,我们就把向量的每个元素乘以3了,这事实上就把向量缩放3倍。如果我们把缩放变量表示为(S1,S2,S3)我们可以为任意向量(x,y,z)定义一个缩放矩阵:
    在这里插入图片描述
    注意,第四个缩放向量仍然是1,因为在3D空间中缩放w分量是无意义的。w分量另有其他用途,在后面我们会看到。

    2、矩阵平移

    位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程,从而在位移向量基础上移动了原始向量。我们已经讨论了向量加法,所以这应该不会太陌生。

    和缩放矩阵一样,在4×4矩阵上有几个特别的位置用来执行特定的操作,对于位移来说它们是第四列最上面的3个值。如果我们把位移向量表示为(Tx,Ty,Tz),我们就能把位移矩阵定义为:
    在这里插入图片描述
    这样是能工作的,因为所有的位移值都要乘以向量的w行,所以位移值会加到向量的原始值上(想想矩阵乘法法则)。而如果你用3x3矩阵我们的位移值就没地方放也没地方乘了,所以是不行的。
    在这里插入图片描述
    有了位移矩阵我们就可以在3个方向(x、y、z)上移动物体,它是我们的变换工具箱中非常有用的一个变换矩阵。

    3、矩阵旋转

    上面几个的变换内容相对容易理解,在2D或3D空间中也容易表示出来,但旋转(Rotation)稍复杂些。如果你想知道旋转矩阵是如何构造出来的,我推荐你去看可汗学院线性代数的视频。
    首先我们来定义一个向量的旋转到底是什么。2D或3D空间中的旋转用角(Angle)来表示。角可以是角度制或弧度制的,周角是360角度或2 PI弧度。我个人更喜欢用角度,因为它们看起来更直观。

    大多数旋转函数需要用弧度制的角,但幸运的是角度制的角也可以很容易地转化为弧度制的:
    弧度转角度:角度 = 弧度 * (180.0f / PI)
    角度转弧度:弧度 = 角度 * (PI / 180.0f)
    PI约等于3.14159265359。

    在3D空间中旋转需要定义一个角和一个旋转轴(Rotation Axis)。物体会沿着给定的旋转轴旋转特定角度。如果你想要更形象化的感受,可以试试向下看着一个特定的旋转轴,同时将你的头部旋转一定角度。当2D向量在3D空间中旋转时,我们把旋转轴设为z轴(尝试想象这种情况)。

    使用三角学,给定一个角度,可以把一个向量变换为一个经过旋转的新向量。这通常是使用一系列正弦和余弦函数(一般简称sin和cos)各种巧妙的组合得到的。当然,讨论如何生成变换矩阵超出了这个教程的范围。

    旋转矩阵在3D空间中每个单位轴都有不同定义,旋转角度用θ表示:
    在这里插入图片描述
    利用旋转矩阵我们可以把任意位置向量沿一个单位旋转轴进行旋转。也可以将多个矩阵复合,比如先沿着x轴旋转再沿着y轴旋转。但是这会很快导致一个问题——万向节死锁(Gimbal Lock,可以看看这个视频(优酷)来了解)。在这里我们不会讨论它的细节,但是对于3D空间中的旋转,一个更好的模型是沿着任意的一个轴,比如单位向量 ( 0.662 , 0.2 , 0.7222 ) (0.662, 0.2, 0.7222) (0.662,0.2,0.7222)旋转,而不是对一系列旋转矩阵进行复合。这样的一个(超级麻烦的)矩阵是存在的,见下面这个公式,其中(Rx,Ry,Rz)代表任意旋转轴:

    在数学上讨论如何生成这样的矩阵仍然超出了本节内容。但是记住,即使这样一个矩阵也不能完全解决万向节死锁问题(尽管会极大地避免)。避免万向节死锁的真正解决方案是使用四元数(Quaternion),它不仅更安全,而且计算会更有效率。
    在这里插入图片描述

    4、矩阵的组合

    使用矩阵进行变换的真正力量在于,根据矩阵之间的乘法,我们可以把多个变换组合到一个矩阵中。让我们看看我们是否能生成一个变换矩阵,让它组合多个变换。假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。我们需要一个位移和缩放矩阵来完成这些变换。结果的变换矩阵看起来像这样:

    注意,当矩阵相乘时我们先写位移再写缩放变换的。矩阵乘法是不遵守交换律的,这意味着它们的顺序很重要。当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的,所以你应该从右向左读这个乘法。建议您在组合矩阵时,先进行缩放操作,然后是旋转,最后才是位移,否则它们会(消极地)互相影响。比如,如果你先位移再缩放,位移的向量也会同样被缩放(译注:比如向某方向移动2米,2米也许会被缩放成1米)!

    用最终的变换矩阵左乘我们的向量会得到以下结果:
    在这里插入图片描述

    不错!向量先缩放2倍,然后位移了(1, 2, 3)个单位。
    在这里插入图片描述

    展开全文
  • 1. Qt5.9 2. OpenGL 3.3 3.矩阵:缩放矩阵,旋转矩阵 移动矩阵. 4.shader :mat4x4
  • 我们知道,在空间里的点的坐标是vector3类型的,即是三维的,那为什么要用4维矩阵才能进行旋转平移和缩放呢?要解决这个问题就要从变换的本质来谈起。我们知道,在变换里分为线性变换和非线性变换,比如: 我们対...

    为什么模型的变换是4X4而不是3X3的矩阵变换?平移操作

    矩阵复合变换顺序是什么?按先缩放、再旋转、最后平移这样的顺序

    当我们直接给出一个(θx,θy,θz)的旋转,unity的旋转顺序是zxy

     

    1.为什么模型的变换是4X4而不是3X3的矩阵变换?


            我们知道,在空间里的点的坐标是vector3类型的,即是三维的,那为什么要用4维矩阵才能进行旋转平移和缩放呢?要解决这个问题就要从变换的本质来谈起。我们知道,在变换里分为线性变换和非线性变换,比如:
    我们対模型进行缩放,那么缩放后的点坐标是
    Pn=aPo (Po是以前的坐标空间,Pn是新的坐标空间,a是缩放比例)
    好的,现在缩放用3x3是没问题的,那么先缩放再平移呢?
    如:Pn= Apo+B (B是平移量)
    我们发现不能写成Pn =A(Po+B’)形式的线性变换,所以3X3矩阵是不够的,所以采用多一维的扩充矩阵来实现平移


    2.平移矩阵


    在三维齐次坐标表示中,任意点P= (x, y, z)通过将平移距离tx、ty和tz,加到P的坐标上而平移到位置P’= (x’, y’, z’)
    x’= x + tx, y’= y + ty,z’= z + tz
    用齐次矩阵表示为


    3:旋转矩阵


    我们在处理旋转时可以绕任何轴旋转,但是绕平行于坐标轴的轴旋转时最容易的,现在我们来处理绕z轴旋转,旋转的表达式为:

    参数θ是绕X轴的旋转角度,写成矩阵形式为:

    绕Y轴旋转则是

    绕Z轴旋转则是


    4.缩放矩阵


    我们可以对一个模型沿空间的x轴、y轴和z轴进行缩放。 同样, 我们可以使用矩阵乘法来表示一个缩放变换:

    如果kx=ky=kz,则称为是统一缩放。否则称为非统一缩放。


    5.矩阵复合变换


    通过平移,缩放,旋转组合我们组成复合变换,复合变换可以通过矩阵串联来变换。例如,使模型先进行缩放变换,然后旋转,然后平移,那变换矩阵如下:

    由于上面我们使用的是列矩阵,因此阅读顺序是从右到左,即先进行缩放变换,再进行旋转 变换,最后进行平移变换。需要注意的是,变换的结果是依赖于变换顺序的,由于矩阵乘法不满足交换律,因此矩阵的乘法顺序很重要。也就是说,不同的变换顺序得到的结果可能是不一样的。究其本质是因为矩阵的乘法不满足交换律。
    为了从数学公式上理解变换顺序的本质,我们可以对比不同变换顺序产生的变换矩阵的表达 式。如果我们只考虑对 y 轴的旋转的话,按先缩放、再旋转、最后平移这样的顺序组合 3 种变换得到的变换矩阵是:

    如果改变变换顺序,如先平移,再缩放,后旋转,则变换矩阵是:

    从结果上可以看出变换的矩阵是不一样的。
    除此之外,旋转时的变换顺序也是很重要的,当我们直接给出一个(θx,θy,θz)的旋转,则需要定义一个旋转顺序,unity的旋转顺序是zxy,这意味着在给以一个这样的旋转角时,得到的变换矩阵为:

    展开全文
  • 前言 在图像处理中有的图片较大,像素点很多,导致图像的像素矩阵维度... 2、通过OpenCV中resize()函数对图片进行’缩放‘,该方法可以通过参数调制实现不同的缩放功能,本文针对这种方法进行图像像素矩阵缩放。 ...

    前言

    在图像处理中有的图片较大,像素点很多,导致图像的像素矩阵维度过高,以至于计算机处理的速度较慢。

    此时需要对图像的像素点进行策略性的减少,但是不能丢失图像的特征:

    这里提供两个方法,1、是将图像的通过特定的卷积核将图像进行降维,例如将1000*1000的图片降维为200*200的图片。

                                     2、通过OpenCV中resize()函数对图片进行’缩放‘,该方法可以通过参数调制实现不同的缩放功能,本文针对这种方法进行图像像素矩阵的缩放。

    .size()参数说明

    cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 

    重要的参数为src,dsize,interpolation

    src - 原图

    dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同(可选,不填写即直接返回被缩放后的图)

    dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出:

    所以,参数dsize和参数(fx, fy)不能够同时为0

    fx - 水平轴上的比例因子。当它为0时,计算公式如下:

    fy - 垂直轴上的比例因子。当它为0时,计算公式如下:

     

    interpolation - 插值方法。共有5种:

    1)INTER_NEAREST - 最近邻插值法

    2)INTER_LINEAR - 双线性插值法(默认)

    3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

    4)INTER_CUBIC - 基于4x4像素邻域的3次插值法

    5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

    实现

    import cv2 as cv
    import os
    from sklearn import svm
    import matplotlib.pyplot as plt
    import numpy as np
    
    def showImage(img):
        cv.namedWindow('img', 0)
        cv.resizeWindow('img', 600,400)
        cv.imshow("img", img)
        cv.waitKey()
    
    img = cv.imread('D:\\dataFile\\traindata\\OCSvm\\test.jpg',1)
    showImage(img)
    print('原图的shape',img.size)
    
    def changeImage(img, pra):
        #pra为缩放的倍率
        height, width = img.shape[:2]
        #此处要做integer强转,因为.resize接收的参数为形成新图像的长宽像素点个数
        size = (int(height*pra), int(width*pra))
        img_new = cv.resize(img, size, interpolation=cv.INTER_AREA)
        return img_new
    
    showImage(changeImage(img, 0.5))
    #缩放倍率为0.5,即将原图的长宽都减少一半
    print('缩放后的shape',changeImage(img, 0.5).size)

     结果为:

    runfile('D:/PythonFile/OneClassSVM/imgtest.py', wdir='D:/PythonFile/OneClassSVM')
    原图的shape 1000000
    缩放后的shape 250000

    原图为:

    处理之后的图为:

    虽然图片变得模糊了一点,但是人骑着摩托车的意思还是没有变。如果让模型学习人骑着摩托车的特征,处理之后的图片还是可以hold住的,不需要高清无码的图,以便减少计算量。

    展开全文
  • [缩放矩阵]缩放矩阵推导

    千次阅读 2019-03-23 14:54:55
    已知p1(x1,y1,z1)、p0(x0,y0,z0),求p1点基于p0点的缩放矩阵,x、y、z方向缩放因子分别为sX,sY,sZ。 p1基于原点缩放矩阵为,,而实际上是需要p1点基于p0点进行缩放,那么需要再将p0到原点一段坐标恢复过来, 即,...
  • 图形学 二维图形的几何变换 对称平移缩放旋转 矩阵实现 C++
  • 2D坐标系中的矩阵变换,坐标位置根据某一点做旋转,平移,得到新的坐标位置。附件中的实例下载运行后可以直接看到效果
  • 二维坐标轴旋转公式推导 ... 设点M在原坐标系中的坐标为(x,y),对应向量的模为r,幅角为α....矩阵旋转公式推导 https://www.cnblogs.com/wywnet/p/3585075.html Matrix4x4矩阵 https://www.cnblogs
  • 缩放矩阵

    千次阅读 2017-11-25 18:58:20
    缩放变换 原文: http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html 背景 缩放变换非常简单,它的目的是增大或者缩小...
  • 矩阵的目的就是线性变换,线性变换分平移、旋转、缩放 平移矩阵:1 0 x0 0 1 y0 0 0 1 旋转矩阵 cos -sin sin cos 缩放矩阵 m 0 0 n 代码实现:仅实现旋转和缩放 import numpy as np import cv2 path = 'test.jpg' ...
  • 图像按矩阵缩放:Matrix matrix = new Matrix();matrix.postScale(...);matrix.postTranslate(...);matrix.postRotate(...);...我希望缩放的图像不会小于原始图像的一半,因此总变焦不应小于0.5.但是怎么做呢?我试图...
  • 7.移动旋转和缩放矩阵

    千次阅读 2020-08-30 20:11:25
    1.逆时针(正旋转):如果旋转角是...3.平移矩阵: 如图:x' = x + Tx ; y' = y + Ty ; z' = z + Tz; 则平移矩阵就是: 4.旋转矩阵: 在二维平面中,x' = x * cosB - y * sinB ; y' = y * sinB + y * cosB ;
  • sy表示纵坐标y缩放的比例 简单示例如下: 2.2 剪切(shearing) shear变换直观理解就是把当前2维图像的一边进行固定,然后向某个方向拉伸,相较于缩放,剪切会改变原先图像的具体样貌 切变矩阵如下:(左边是"拉伸...
  • 注意:必须是相同维度矩阵才行,比如2*3矩阵不能和3*3矩阵进行加减. 如下所示: 同样的减法也是类似. 矩阵与标量数乘 矩阵与标量数乘和矩阵与标量加减类似, 实际是对矩阵的每个元素和该标量进行相乘,如下图...
  • %% ----------------------双线性插值法缩放矩阵或图像--------------------------- % Input: % I:图像文件名或矩阵(整数值(0~255)) % zmf:缩放因子,即缩放的倍数 % Output: % 缩放后的图像矩阵 ZI % Usage...
  • H5圆圈缩放矩阵图案动画特效是一款基于HTML5 Canvas制作的全屏圆圈缩放矩阵图案动画背景特效。
  • 缩放 缩放是一种针对于沿着坐标轴的变换方式,2D缩放矩阵定义如下: 上述效果代表了分别沿x轴和y轴进行0.5倍缩放变换 2.剪切 剪切是把当前2维图像的一边进行固定,然后向某个方向拉伸,相较于缩放,剪切会改变原先...
  • Cesium创建平移、旋转、缩放矩阵

    千次阅读 2020-03-06 22:29:01
    创建平移矩阵 4x4 //创建平移矩阵方法一 const mat4 = Cesium.Matrix4.fromArray([ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, x, y, z, 1.0 ]); //创建平移矩阵方法二 const translation = ...
  • 变换矩阵总结摘要1 2D线性变换1.1 缩放(scaling)1.2 剪切(shearing)1.3 旋转(rotation)2 3D线性变换2.1 3维缩放(scaling),剪切(shearing),旋转(rotation)2.2 3维绕任意轴旋转3 仿射变换3.1 位移(translation)...
  • 在unity中,一个平移矩阵是一个单位矩阵与平移参数构成的一个矩阵 把物体的位置转换为矩阵后可得知矩阵中的值与物体位置的关系。 物体设置的位置参数 物体输出的矩阵值 通过图可得知矩阵值的关系和物体位置...
  • 2.cv2.warpAffine,将其中的变换矩阵变为(coe代表缩放比例) 结果: 实现缩放 二、 # 图像缩放矩阵操作实现方法 import cv2 import numpy as np coe = 0.4 img = cv2.imread('image01.jpg',1) ...
  • 创建(x,y,z)平移矩阵,分别绕X,Y,Z轴旋转rad角度的矩阵缩放矩阵
  •  GLSL 语言中,数据类型mat4 表示 4 x 4 的矩阵  GLM 中,有一个类 class 叫 mat4,表示 4 x 4 的矩阵  单位矩阵:identity matrix  在 GLM中,调用函数 glm::mat4 m(1.0f) 创造一个4x4 的单位矩阵,叫m ...
  • 使用numpy缩小矩阵的大小

    千次阅读 2021-01-13 08:11:33
    稀疏矩阵(如suggested by @phg)很好,因为矩阵中的大多数条目可能是0(假设大多数用户只关注少数电视节目)。在不过,可能更重要的是,构建矩阵的方法非常低效(生成大量python列表并四处复制),而不仅仅是将它们放在一...
  • import cv2 import numpy as np img = cv2.imread("./mm1.jpg",1) cv2.imshow("src",img) imgInfo = img.shape ...# 利用缩放矩阵,与之前讲述移位矩阵时类似同样拆分成两个矩阵,原理一样;改变矩阵...
  • 主要介绍了详解通过变换矩阵实现canvas的缩放功能的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 遇到了一些情况需要将图片...仿射变换可以通过一系列的原子变换的复合来实现,包括平移,缩放,翻转,旋转和剪切。 1)图像的几何变换 对图像进行放大、缩小、旋转等操作,会改变原图中各区域的空间关系,这类操...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,709
精华内容 31,883
关键字:

矩阵缩放