精华内容
参与话题
问答
  • 1. 矩阵维度变换 1.1 numpy.reshape(a, newshape, order=’C’) reshape()函数经常用做一维数组维度的变化,也就是将一维数组变化成为指定维度的矩阵。order是指不同的索引规则,一般默认C,按照行进行运算。 ...

    1. 矩阵维度变换

    1.1 numpy.reshape(a, newshape, order=’C’)

    reshape()函数经常用做一维数组维度的变化,也就是将一维数组变化成为指定维度的矩阵。order是指不同的索引规则,一般默认C,按照行进行运算。
    示例:

    print np.reshape(np.arange(10), (2, 5))
    
    [[0 1 2 3 4]
     [5 6 7 8 9]]

    1.2 numpy.ravel(a, order=’C’)

    ravel函数是将矩阵数据进行降维操作,例如,将二维的数据降成一维的
    示例:

    data = np.reshape(np.arange(10), (2, 5))
    print data.reshape(-1)
    print data.ravel()
    
    [0 1 2 3 4 5 6 7 8 9]
    [0 1 2 3 4 5 6 7 8 9]

    1.3 flatten([order])

    该成员函数也是用于降维使用的,起作用与ravel函数类似
    示例:

    data = np.reshape(np.arange(10), (2, 5))
    print data.flatten()
    
    [0 1 2 3 4 5 6 7 8 9]

    与ravel函数的区别:ravel是原始数据的视图,对其进行修改之后原始数据也将会被修改;而flatten函数则返回原始数据的拷贝,对其进行修改并不会对原始数据产生影响。
    示例:

    # ravel函数
    data = np.reshape(np.arange(10), (2, 5))
    data1 = data.ravel()
    data1[0] = 100
    print data
    
    [[100   1   2   3   4]
     [  5   6   7   8   9]]
    
    # flatten函数
    data = np.reshape(np.arange(10), (2, 5))
    data1 = data.flatten()
    data1[0] = 100
    print data
    
    [[0 1 2 3 4]
     [5 6 7 8 9]]

    2. 矩阵组合

    这里使用两个测试用矩阵:

    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6], [7, 8]])

    2.1 水平组合

    示例:

    print np.hstack((a, b))
    print np.concatenate((a, b), axis=1)
    
    [[1 2 5 6]
     [3 4 7 8]]

    2.2 垂直组合

    示例:

    print np.vstack((a, b))
    print np.concatenate((a, b), axis=0)
    
    [[1 2]
     [3 4]
     [5 6]
     [7 8]]

    2.3 深度组合

    示例:

    print np.dstack((a, b))
    
    [[[1 5]
      [2 6]]
    
     [[3 7]
      [4 8]]]

    3. 矩阵分割

    这里使用如下数据进行测试:

    a = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

    3.1 水平分割

    在理解了2.1节中的水平组合之后,其逆过程就很容易理解了。
    示例:将示例矩阵分为等分成为三份

    print np.hsplit(a, 3)
    
    [array([[1],
           [4],
           [7]]), array([[2],
           [5],
           [8]]), array([[3],
           [6],
           [9]])]

    3.2 垂直分割

    其过程类似上面的过程
    示例:

    print np.vsplit(a, 3)
    
    [array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

    3.3 深度分割

    示例:注意,深度分割只对三维以上矩阵有效

    print np.dsplit(np.arange(27).reshape((3, 3, 3)), 3)
    
    [array([[[ 0],
            [ 3],
            [ 6]],
    
           [[ 9],
            [12],
            [15]],
    
           [[18],
            [21],
            [24]]]), array([[[ 1],
            [ 4],
            [ 7]],
    
           [[10],
            [13],
            [16]],
    
           [[19],
            [22],
            [25]]]), array([[[ 2],
            [ 5],
            [ 8]],
    
           [[11],
            [14],
            [17]],
    
           [[20],
            [23],
            [26]]])]

    4. 矩阵的属性

    这里测试用的数据还是3节中的数据

    4.1 矩阵维度

    print np.shape(a)
    
    (3, 3)

    4.2 矩阵数据类型

    print a.dtype
    
    int64

    4.3 矩阵元素个数

    print a.size
    
    9

    4.4 矩阵元素占用字节数

    print a.itemsize
    
    8

    4.5 矩阵总占用字节数

    print a.nbytes
    
    72

    5. 参考

    Python之数组拼接,组合,连接

    展开全文
  • OpenGL 矩阵变换顺序与MVP矩阵变换

    千次阅读 2018-12-24 16:03:14
    一、矩阵变换的顺序 对于一个坐标点,一般都是先缩放、后旋转、最后平移, 但是变换矩阵是和变量进行右乘的,所以要先计算平移矩阵、再旋转、再计算缩放。 这里重点讲述矩阵变换为什么一定要按照缩放、旋转、平移...

    一、矩阵变换的顺序

    对于一个坐标点,一般都是先缩放、后旋转、最后平移,

    但是变换矩阵是和变量进行右乘的,所以要先计算平移矩阵、再旋转、再计算缩放。

    这里重点讲述矩阵变换为什么一定要按照缩放、旋转、平移的顺序,不然就会出错。

    矩阵变换的顺序解释参考:https://blog.csdn.net/pizi0475/article/details/9840921,这篇博客做了一些简单讲述,但是还不够详细清楚。

    首先要知道这些矩阵变换是用来干什么的,当我们把一个物体从一个坐标系放入到另一个坐标系中,这两个坐标系可以视为是完全重合的(但是这个时候所有的顶点的坐标都是在新坐标系下的,只不过在没有进行变换的时候,这些坐标的xyz是和原坐标系下相同的,做过变换之后就不同了,但是不要混淆了这一点,到了新坐标系下,所有的顶点坐标都是基于新坐标系的),我们要做的,就是把物体放置到一个合适的位置(平移变换),摆放一个合适的角度(旋转变换),调整到一个合适的大小(缩放变换),然后再重新计算在新坐标系下顶点坐标。那如何计算呢,我们必须先知道如何计算,才能知道为什么变换顺序不能打乱,这是一切一切的基础。

    先以缩放变换举例,一个坐标(x,y,z)放大到2倍,通过矩阵的计算公式,它的坐标会变化为(2x,2y,2z),这个时候就必须要明确一点,这个缩放的原点以及缩放的方向是什么,对于x,它缩放的原点就是坐标系的原点,缩放的方向就是(1,0,0),缩放的倍数是2,记住,它的缩放是以这组数据为参数的,这个参数的数据只和矩阵里的那四行四列也就是你设置的数字有关,与其它坐标系什么的都没有关系,甚至于要明白,缩放矩阵的只是为了设置缩放的大小,理论上对于所有的旋转矩阵来说,它的缩放方向和缩放的参考点都还是原来的那些参数。

    那如果我们先旋转再缩放会出现什么情况呢?我们可以在世界变换中分析一下这个问题,其它类型的变换都是类似的。

    先旋转,旋转之后再缩放,我们希望的效果是这个物体依然能够按照模型坐标系来进行缩放,可事实确实它的缩放变换矩阵还是那个矩阵,也就是意味着对于x来说,它缩放的方向仍然是(1,0,0),但这是世界坐标系下的(1,0,0)了,而不是模型坐标系下了,所以理所当然要出问题。

    平移后再旋转的问题也可以类似分析,顶点的旋转必须要知道的两个参数,旋转轴和旋转角度,而旋转轴又需要通过旋转方向和一个点的坐标来确定。分析旋转矩阵里的行列数字就可以知道,旋转的方向由不同旋转矩阵分别指定,但是旋转的轴心点就是原点(0,0,0),而且对于所有的旋转矩阵都是如此,所以如果平移之后再旋转,我们本是希望物体能按照自己本地坐标系下的原点进行旋转,但是它的旋转矩阵已经决定了它只能按照世界坐标系下的(0,0,0)进行旋转,所以就会出错。

    二、mvp矩阵与基础矩阵变换联系

    mvp矩阵即模型矩阵,观察矩阵和投影矩阵,前两个矩阵都是由上面三种基础矩阵变换生成的。

    其中,模型矩阵用来从模型坐标系变换到世界坐标系中,主要用到平移变换,旋转变换和放缩变换。

    观察变换就是从世界坐标系下变换到观察坐标系下,就是在世界坐标系下设置个观察点(相机位置以及相机方向),然后把世界坐标系下的坐标变换到相机空间,主要用到平移变换和旋转变换。对于摄像机来说,如果它在世界空间中的位置是(0,0,3),那么我们如果要转换到观察坐标系下,就要把物体所有的顶点向z轴负方向移动三个单位,因为摄像机向前移动就相当于物体向后移动。所以在计算高光的时候,我们通常要获取观察点的位置,这个观察点的位置正好和观察矩阵中的平移矩阵的平移向量相反。

    先进行模型矩阵的计算,后进行观察矩阵,那么问题来了,有可能你在模型矩阵里进行平移,之后在观察矩阵里进行了旋转,这不就出现了上面讲到的错误顺序了吗,其实在观察矩阵里,我们改变观察点就相当于反向改变顶点位置,我们就是要围绕观察坐标系的原点进行变换,而不是绕着物体的原点进行变换了,想想一下一个外围的相机绕着正方体转一圈,不就是相当于正方体绕着相机旋转一圈吗。

    投影矩阵是不同于上面两个的,OpenGL提供了专门的接口来创建。

    注意:在一幅画面当中,我们只有一个相机能作为当前相机,也就是所有物体的观察矩阵必须是相同的,不能在一个场景中同时为物体设置不同的观察矩阵,也就是设置不同的相机,那样渲染的画面肯定是错误的结果。

    三、矩阵的平移、旋转和缩放

    3D坐标为什么要用四维向量表示:因为三维矩阵不能做平移操作,所以我们需要将三维矢量转换为四维矢量;

    转换方式:前三个坐标代表了x,y,z,第四个w要么扩展为1,1说明(x,y,z)的意义是一个坐标点;要么扩展为0,0代表(x,y,z)的意义是一个向量。这个是有很多应用的,例如当你学习不同的光源类型的时候,第四个分量可以帮助我们来区分方向光和点光源;

    旋转矩阵的计算,参考:http://www.cnblogs.com/meteoric_cry/p/7987548.html,还可以直接使用和差角公式来计算。

    绕x轴进行旋转(在yz平面顺时针旋转)

    XAxis

    [1 0 0; 0 cosalpha sinalpha; 0 -sinalpha cosalpha]

     

    绕y轴进行旋转(在zx平面顺时针旋转)

    YAxis

    [cosbeta 0 -sinbeta; 0 1 0; sinbeta 0 cosbeta]

     

    绕z轴进行旋转(在xy平面顺时针旋转)

    ZAxis

    [cosgamma singamma 0; -singamma cosgamma 0; 0 0 1]

    这里绕x轴和z轴很类似,但是y轴却不同,区别就是绕y轴是在zx平面内,而不是xz平面内,所以如果是在xz内,它的角度就是负的,那么sin(-A)=-sin(A),这就理清了。

    展开全文
  • OpenGL 矩阵变换

    2014-09-13 11:55:14
    Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点...对象的本地坐标系——任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRo

    Overview

    几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据。

    OpenGL vertex transformation

    Object Coordinates

    对象的本地坐标系——任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRotate(),glTranslatef(),glScalef()这些方法。


    Eye Coordinates

    使用GL_MODELVIEW矩阵和Object 坐标相乘所得。在OpenGL中用GL_MODELVIEW将对象对象空间(Object Space)变换到视觉空间(eye space)。GL_MODELVIEW

    矩阵是模型矩阵(Model Matrix)和视觉矩阵(View Matrix)的组合 (Mview * Mmodel)。其中,Model 变换指的是将Object  Space转换到World Space

    (译注:World Space值得是OpenGL中的三维空间),而View 变换是将World space变换到eye space。

    OpenGL eye coordinates

    注意:在OpenGL中没有单独的camera(view) matrix。因此,为了模拟camera或者view的变换,其中的场景(3D物体和光照)必须通过和view相反的方向变换。也就是说,OpenGL总是将camera定义在(0,0,0)点,并且强制在eye space坐标系的-Z轴方向,而且不能变换。关于GL_MODELVIEW Matrix的详细资料可以查看此处:http://www.songho.ca/opengl/gl_transform.html#modelview


    标准向量(Normal vectors)——从对象坐标系(Object coordinates)变换到视觉坐标系(eye coordinates),它是用来计算光照(lighting calculation)的.注意标准向量(Normal vectors)的变换和顶点的不同。其中视觉矩阵(view matrix)是GL_MODELVIEW逆矩阵的转置矩阵和标准向量(Normal vector是)相乘所得,即:

    normal vector transformation

    更多关于标准向量变换(Normal Vector Transformation)的资料可连接到此处:http://www.songho.ca/opengl/gl_normaltransform.html


    剪切面坐标系(Clip Coordinates)

    视觉坐标系和GL_PROJECTION矩阵相乘,得到剪切面坐标系。GL_PROJECTION矩阵定义了可视的空间(截头锥体)(译注:关于什么是截头锥体,我还查了下资料,发现它是这个样子的:


    ,这个就是投影的效果啦)以及顶点数据如何投影到屏幕上(视角或者正交化(orthogonal)),它被称为剪切面坐标系的原因是(x,y,z)变换之后

    要和±w比较。更多关于GL_PROJECTION矩阵的资料可见:http://www.songho.ca/opengl/gl_transform.html#projection

    OpenGL clip coordinates


    标准化设备坐标系(NDC)

    将剪切面坐标系除以w所得(关于w的讨论可见此处:,http://www.songho.ca/math/homogeneous/homogeneous.html),它被称为视角除法(perspective division)

    .它更像是窗口坐标系,只是还没有转换或者缩小到屏幕像素。其中它取值范围在3个轴向从-1到1标准化了。

    OpenGL Normalized Device Coordinates



    窗口坐标系(Window Coordinates)/屏幕坐标系(Screen Coordinates)

    将标准化设备坐标系(NDC)应用于视口转换。NDC将缩小和平移以便适应屏幕的透视。窗口坐标系最终传递给OpenGL的管道处理变成了fragment。glViewPort()函数

    用来定义最终图片映射的投影区域。同样,glDepthRange()用来决定窗口坐标系的z坐标。窗口坐标系由下面两个方法给出的参数计算出来

    glViewPort(x,y,w,h);

    glDepthRange(n,f);


    OpenGL Window Coordinates


    视口转换公式很简单,通过NDC和窗口坐标系的线性关系得到:



    OpenGL 转换矩阵

    OpenGL Transform Matrix


    OpenGL使用4x4矩阵变换。注意,这16个元素存储在1D数组中,这些元素按列顺序排列。假如你想以行为顺序排列,你需要转置该矩阵。

    OpenGL有4中不用的矩阵:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE和GL_COLOR.你可以在

    代码中使用glMatrixMode()函数改变当前的类型。例如,为了选择GL_MODELVIEW矩阵,可以这样:

    glMatrixMode(GL_MODELVIEW);




    展开全文
  • 这篇文章转载自《IOS疯狂讲义》上 图形变换这一节 ,放在这里主要是方便自己,方便同行查找,参考。

    这篇文章转载自《IOS疯狂讲义》上 图形变换这一节 ,放在这里主要是方便自己,方便同行查找,参考。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • OpenGL_矩阵变换

    千次阅读 2014-11-28 10:48:18
    Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点...对象的本地坐标系——任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRo
  • 今天我更新一个一个比较简单的方法设置矩阵,就是使用教程里面封装好的矩阵库,就可以很简单的实现矩阵转换了。案例查看地址:点击这里<!doctype html> <html> <head> &...
  • matlab 矩阵变换

    千次阅读 2018-12-24 18:54:13
    matlab 矩阵变换 对角阵 –diag() 三角阵----triu(),tril() 矩阵的转置 —’ 矩阵的旋转 rot90() 矩阵的翻转 –fliplr() –flipud() 矩阵求逆 –inv() 对角阵 –diag() >> diag(1:5) ans = 1 0 0 ...
  • 坐标变换 及矩阵变换

    万次阅读 2013-10-31 11:32:02
    的的变换矩阵来表示,如最常见的是使用一个模型视图变换矩阵,来变换点、线、多边形以及其它几何体,也可以变换多边形表面的切向量。变换思路如下:设置一个4 × 4 的矩阵中元素的值,使其表示某一具体的变换。...
  • 矩阵变换:矩阵是怎样变换向量的

    万次阅读 2013-04-08 16:36:19
    可以将矩阵对向量的转换理解为对向量所在坐标系的转换。 1.向量的每个坐标都表明了平行于相应轴的偏移量,所以向量可以改写成如下形式: v = [x y z]  = [x 0 0] + [0 y 0] + [0 0 z]  = x [1 0 0] + y [0 1 0...
  • OpenGL矩阵变换

    千次阅读 2018-05-16 15:59:46
    0. 模型变换的基本流程图: 1. 模型变换 ...OpenGL中的顶点一般用齐次坐标表示,且以列向量的形式呈现,矩阵变换采用的方式即为“矩阵x列向量”的方式。 旋转矩阵的求解方法 下面以绕X轴旋转...
  • 点云矩阵变换

    2018-12-21 16:52:09
    https://blog.csdn.net/weixin_38275649/article/details/80968364
  • opengl 矩阵变换

    千次阅读 2008-02-01 23:48:00
    第四章 矩阵变换 通过前三章的学习,我们知道了如何使用OpenGL在3D空间中绘制基本图元,并把使用图元组成模型。然而,在我们绘制完一个物体或一个场景之后,我们总希望从多个角度观察这个物体,或者在场景中走动。...
  • Octave 矩阵变换

    2018-04-06 15:09:51
    这个属于补充,从原来的矩阵进行变换生成新的矩阵>> A=[1,2,3;4,5,6;7,8,9;] A = 1 2 3 4 5 6 7 8 9从A当中把第一列和第三列抽出形成新的矩阵B>> B=A(:,[1,3]) B = 1 3 4 6 7 9...
  • MatrixTransform矩阵变换

    2010-12-25 14:46:00
    虽然在WPF中可以使用TranslateTransform、RotateTransform、ScaleTransform等进行几何变换,但我们也可以使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换。  首先我们矩阵如何影响几何变换的: ...
  • 矩阵变换推导

    2016-07-29 21:10:05
    翻译如下: 背景知识: 本次教程主要介绍3D物体的多种变换,在...最普遍的方法是用矩阵来代表一个变换,一个一个矩阵的连乘点得坐标最终得到一个结果。每篇教程都会讲解一个变换。 下面我们来看下平移变换(tran
  • OPENGL矩阵变换

    2015-05-25 15:48:37
    Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据。...Object Coordinat
  • svg矩阵变换

    2012-01-01 16:16:56
    svg矩阵变换
  • 图形变换之基本矩阵变换

    千次阅读 2017-06-22 21:45:09
    图形变换之基本矩阵变换 1)平移变换 从一个位置到另一个位置的变换可以用平移矩阵T表示,该矩阵通过向量t=(tx,ty,tz)对实体进行平移操作。 其实还有另外一种形式(以左手坐标系为基准): 第一...
  • MIT线性代数1806(27) 复矩阵 傅里叶矩阵变换 欧拉公式数学是上帝描述自然的符号。——黑格尔
  • Unity内建矩阵类型:M:世界矩阵V:摄像机矩阵P:投影矩阵T :矩阵的转置IT : 转置的的逆_Object2World: 模型到世界矩阵_World2Object:世界到模型矩阵MVP 矩阵变换:Shader DemoMVP 转置变换:C# demoMatrix4x4 mvp ...
  • 矩阵变换总结(模型矩阵,视图矩阵,投影矩阵) 最近在开发项目的时候,常常用到Three.js,用起来很方便。可是,当引擎迭代升级的时候,以前的很多的技巧,并不一定使用最新的引擎。我认为应当对底层的原生API有很...

空空如也

1 2 3 4 5 ... 20
收藏数 14,607
精华内容 5,842
关键字:

矩阵变换