精华内容
下载资源
问答
  • QMatrix4x4

    2021-04-15 21:33:10
  • 3、QMatrix4x4矩阵类本身就支持translate,rotate,projection等连续变换函数,那么问题来了, qs 这些变换的作用顺序是怎么样的,实际上和上面说的矩阵作用规则是一样的。 顺序是按照后变换,先作用的,具体如下, ...

    1、矩阵具有坐标变换的作用,例如:左乘一个旋转矩阵,实现点的坐标旋转,左乘一个平移矩阵实现,点的平移

    2、一个点可以同时串联相乘几个变换矩阵,实现坐标连续变换,根据左乘规则,右边矩阵先作用于点,作用顺序从右往左,例如:C*B*A*point(注:C,B,A分别为变换矩阵,point为一个vector3的位置向量,即点的x,y,z坐标)运算式子,矩阵A先作用于point,其次是B,C

    3、QMatrix4x4矩阵类本身就支持translate,rotate,projection等连续变换函数,那么问题来了,qs这些变换的作用顺序是怎么样的,实际上和上面说的矩阵作用规则是一样的。

    顺序是按照后变换,先作用的,具体如下,

    ? ? matrix.perspective(45,w/h,0.1,100);? ? ?// 透视矩阵变换

    ? ? matrix.translate(0.8,0,-5);? ? // 平移变换

    ? ? matrix.rotate(30,0,1,0)? ? // 绕着y轴旋转30度

    ? ? ? matrix*point;? ? ?// 注:此时这给点是先执行了旋转,再平移,最后透视处理。

    ? ? ?//?而不是从上往下顺序,先透视,再平移和旋转

     

    上面代码作用等同于如下代码:

    ? ? matrix1.perspective(45,w/h,0.1,100);? ? ?// 用一个单独矩阵,透视矩阵变换

     

    ? ? ? ? matrix2.translate(0.8,0,-5);? ? // 用另一个单独矩阵,平移变换

    ? ? matrix3.rotate(30,0,1,0)? ? ? ? ? ? ? ? ? ? ? ? ?// 再用一个单独矩阵,绕着y轴旋转30度

    ? ? matrix1*matrix2*matrix3*point;? ? ?//?先执行了旋转,再平移,最后透视处理

    转载于:https://www.cnblogs.com/zhangyanran/p/10019627.html

    展开全文
  • 本篇博客展示4个例子,都是关于旋转变换、平移变换和QMatrix的操作。在QT的帮助中,提到QMatrix是行主序。而opengl的矩阵是列主序的。乍一看,将QMatrix传入shader之前,qmatrix需要做转置处理。但是在实际的尝试中...

    本篇博客展示4个例子,都是关于旋转变换、平移变换和QMatrix的操作。

    在QT的帮助中,提到QMatrix是行主序。


    而opengl的矩阵是列主序的。乍一看,将QMatrix传入shader之前,qmatrix需要做转置处理。但是在实际的尝试中,我发现矩阵不应转置。

    我们从前面的博客 

    Qt结合GLSL贴出纹理(二、采用QOpenGLShaderProgram和QOpenGLTexture)

    出发,在那篇博客里,我们贴出来一个纹理,并没有做其他任何操作。现在我们在其基础上添加旋转操作。

    例子1.

    先看最简单的情形:让物体旋转45度

    h文件:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QOpenGLWidget>
    #include <QOpenGLFunctions>
    #include <QOpenGLTexture>
    #include <QOpenGLShader>
    #include <QOpenGLShaderProgram>
    
    class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        GLuint                          m_uiVertLoc;
        GLuint                          m_uiTexNum;
        QOpenGLTexture          *       m_pTextures;
        QOpenGLShaderProgram    *       m_pProgram;
        GLfloat                 *       m_pVertices;
    
    protected:
        void        initializeGL();
        void        paintGL();
        void        resizeGL(int w, int h);
    };
    
    #endif // MAINWINDOW_H
    

    cpp文件:

    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QOpenGLWidget(parent)
    {
    }
    
    MainWindow::~MainWindow()
    {
        m_pTextures->release();
        delete m_pTextures;
        delete m_pProgram;
        delete [] m_pVertices;
    
    }
    
    void MainWindow::initializeGL()
    {
        initializeOpenGLFunctions();
    
        m_uiTexNum = 0;
        m_pVertices = new GLfloat[18];
        //给顶点赋值
        GLfloat arrVertices[18] = {0.0, 1.0, 0.0,
                                   0.0, 0.0, 0.0,
                                   1.0, 0.0, 0.0,
                                   1.0, 0.0, 0.0,
                                   1.0, 1.0, 0.0,
                                   0.0, 1.0, 0.0};
        m_pVertices = new GLfloat[18];
        memcpy(m_pVertices, arrVertices, 18 * sizeof(GLfloat));
    
        QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
        const char *vsrc =
                            "#version 330\n"
                            "in vec3 pos;\n"
                            "out vec2 texCoord;\n"
                            "uniform mat4 mat4MVP;\n"
                            "void main()\n"
                            "{\n"
                            "    gl_Position = mat4MVP * vec4(pos, 1.0);\n"
                            "    texCoord = pos.xy;\n"
                            "}\n";
        vshader->compileSourceCode(vsrc);
    
        QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
        const char *fsrc =
                            "#version 330\n"
                            "out vec4 color;\n"
                            "in vec2 texCoord;\n"
                            "uniform sampler2D Tex\n;"
                            "void main()\n"
                            "{\n"
                            "    color = texture(Tex, texCoord);\n"
                            //"      color = vec4(1.0, 0.0, 0.0, 0.0);\n"
                            "}\n";
        fshader->compileSourceCode(fsrc);
    
        m_pProgram = new QOpenGLShaderProgram;
        m_pProgram->addShader(vshader);
        m_pProgram->addShader(fshader);
        m_pProgram->link();
        m_pProgram->bind();
    
        m_uiVertLoc = m_pProgram->attributeLocation("pos");
        m_pProgram->enableAttributeArray(m_uiVertLoc);
        m_pProgram->setAttributeArray(m_uiVertLoc, m_pVertices, 3, 0);
    
    
        m_pTextures = new QOpenGLTexture(QImage(QString("earth.bmp")).mirrored());
        m_pTextures->setMinificationFilter(QOpenGLTexture::Nearest);
        m_pTextures->setMagnificationFilter(QOpenGLTexture::Linear);
        m_pTextures->setWrapMode(QOpenGLTexture::Repeat);
        m_pProgram->setUniformValue("Tex", m_uiTexNum);
    
    
        glEnable(GL_DEPTH_TEST);
        glClearColor(0,0,0,1);
    }
    
    void MainWindow::paintGL()
    {
        //QMatrix4x4在声明时被默认为单位矩阵
        QMatrix4x4 m1, m2, m3, m;
    
        //m1.viewport(0,0,m_iWidth, m_iHeight,-15,15);//useless
        //m1.ortho(-1.0f, +1.0f, -1.0f, 1.0f, 0.0f, 25.0f);//right//generate projection matrix
        //m2.lookAt(QVector3D(20,0,10), QVector3D(0,0,0), QVector3D(0,1,0));//generate view matrix, right
        //qDebug()<<m2;
        //m3.translate(0,-0.707,0.0);//right, generate model matrices
        m3.rotate(45, 0.0f, 0.0f, 1.0f);//right, generate model matrices
        qDebug()<<m3;
        m = m1 * m2 * m3;
    
        m_pProgram->setUniformValue("mat4MVP", m);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        m_pTextures->bind(m_uiTexNum);
        glDrawArrays(GL_TRIANGLES, 0, 6);
        m_pTextures->release();
    }
    
    void MainWindow::resizeGL(int w, int h)
    {
        glViewport(0,0,w,h);
    }

    效果:


    可见,图片的确绕Z轴旋转了45度。同时注意qDebug()打印出的矩阵。

    按照https://en.wikibooks.org/wiki/GLSL_Programming/Vertex_Transformations的说法:


    将alpha = 45 ,x = 0, y = 0, z = 1代入公式,不难发现,qDebug打印的结果与公式相符。

    这说明我们在例子里对m3.rotate()函数的运用是正确的。


    例子2. 旋转与平移结合

    这个程序与例子1只变化了一处:增加了m3.translate(0,-0.5,0)


    这里有两处要注意:

    1)尽管先调用rotate函数,再调用了translate函数,但是纹理表现出来的效果是先平移,再旋转。因为纹理左下角不再位于窗口的中轴线x=0上了。

    2)假如先进行旋转,再平移,则qDebug打印的结果应该是

    0.707   -0.707   0    0

    0.707    0.707    0  -0.5

    0             0        1    0

    0             0         0   1

    与实际结果不符。


    例子3. 将translate和rotate函数交换


    此时显示效果与qDebug输出结果都正确了。

    分析:QMatrix声明时,m3被默认赋值为单位矩阵。调用translate函数后,translate矩阵右乘单位矩阵m3.随后调用rotate函数,旋转矩阵再一次右乘m3得到最终的结果。前一篇博客 

    GLSL矩阵变换详解(一、总述)

    中,我们提到,一串矩阵相乘,最先起作用的其实是最右面的矩阵。因此,尽管translate先调用,但是反而后起作用。


    例子4. 

    为了验证例子3的分析,我们用两个独立的矩阵各自代表旋转和平移操作,然后把两者相乘:


    可见,结果与例子3一样。这也就验证了例子三的猜测:translate函数与rotate函数的调用次序与实际的操作次序相反。

    展开全文
  • QML基础类型之matrix4x4

    2020-11-29 14:43:18
    matrix4x4类型是4行4列矩阵 matrix4x4类型具有16个值,每个值都可以通过QML中的属性m11至m44(按行/列顺序)访问。 可以使用Qt.matrix4x4()函数来组成此类型的值。 matrix4x4中的每个属性都存储为实数(在ARM上为...

    matrix4x4类型是4行4列矩阵
    matrix4x4类型具有16个值,每个值都可以通过QML中的属性m11至m44(按行/列顺序)访问。 可以使用Qt.matrix4x4()函数来组成此类型的值。 matrix4x4中的每个属性都存储为实数(在ARM上为单精度,在x86上为双精度)。
    matrix4x4类型具有以下幂函数,可以在QML中调用:

    /*
    **功能签名
    描述
    例***/
    matrix4x4 times(matrix4x4 other)
    //返回此matrix4x4与另一个matrix4x4相乘的matrix4x4结果。
    
      var a = Qt.matrix4x4(1,2,3,
    展开全文
  • unity中的利用Matrix4x4实现缩放

    千次阅读 2016-12-26 09:43:02
    1、缩放矩阵 2、示例代码using UnityEngine; using System.Collections;public class MyTransform : ... public Matrix4x4 matrix; //平移矩阵 public Vector4 v; //临时存储矩阵变换之后的点 public Vec
  • Matrix4x4 矩阵api介绍

    2019-08-30 17:22:39
    Namespace: UnityEngine ...A standard 4×4 transformation matrix. 一个标准的4×4变换矩阵。 A transformation matrix can perform arbitrary linear 3D transformations (i.e. translation, rotation, scale...
  • unity中的利用Matrix4x4实现平移

    千次阅读 2016-12-23 09:38:36
    matrix = Matrix4x4.identity; //单位矩阵 matrix.m03 = x; //x平移量可以在Inspector面板拖动 matrix.m13 = 4 ; //y轴平移量 matrix.m23 = 5 ; //z轴平移量 v = matrix * startPos; transform....
  • OpenGL - Matrix4X4 矩阵变换

    千次阅读 2016-07-29 15:49:01
    OpenGL 相关开发,对图像进行处理时,常用到Matrix4x4矩阵来变换场景中对象的位置、旋转和缩放。但是很多人都不太理解这儿Matrix4x4变换矩阵。通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么变换的。 在...
  • //函数说明:获取世界坐标系绕任意经过原点的轴的旋转任意角度的变换矩阵 //参数说明:QVector3D:Axis 经过世界原点的轴的方向 // float:theta 旋转角度 // 返回值: QMatrix4x4 wolrdRotate 世界坐标系旋转矩阵 ...
  • Unity3d-旋转Quaternion、Matrix4x4、 Euler

    千次阅读 2015-02-26 13:06:52
    矩阵:Matrix4x4 namespace UnityEngine { public struct Matrix4x4 { public float m00; public float m10; public float m20; public float m30; public float m01; public float m11; public ...
  • Matrix4x4

    千次阅读 2016-09-08 17:39:45
    MultiplyPoint3x4 矩阵变换 public Vector3 MultiplyPoint3x4(Vector3 v); 通过指定的矩阵来变换向量v 下面的代码是通过矩阵m来变换v ... Matrix4x4 m = Matrix4x4.identity; Vector3 v = Vector3.one;
  • Matrix4x4

    2015-04-03 18:19:12
    using UnityEngine; using System.Collections; public class juzhenTest : MonoBehaviour { #region MultiplyVector  //public Transform tr;... //Matrix4x4 m1 = Matrix4x4.identity;  //Matrix4x4
  • 标题 ##博主最近研究矩阵的成果,简单的封装了一下,可直接当成工具类调用: MatrixUtils工具类 ... public static void Matrix4x4(this Transform transfrom,Matrix4x4 matrix4X4) { transfrom.loca...
  • 理解Matrix4x4.MultiplyPoint()

    千次阅读 2019-02-20 17:12:48
    好奇这个函数底层是怎么实现的。所以就是浏览了一些参考文献,然后做了个小实验。现记录如下。其中也有一些问题没有解决。。先来看Unity Manual public Vector3 MultiplyPoint(Vector3 point);...
  • 此资源是演示程序,可以免积分...所以需要在头文件中包含QVector3D、QMatrix4x4等头文件。使用了这些头文件之后感觉Qt这一点做得很充分,我们想的它都给我们想好了。方便虽方便,在移植的过程中我还是遇到了诸多困难。
  • 1题(1,1,1)旋转到z轴,求出旋转矩阵 2题 求(1,1,1)可以绕着任意轴旋转的旋转矩阵 3题 (1,0,0)绕着(1,1,1)旋转30°
  • 我们在前一篇博客GLSL矩阵变换详解(二、旋转变换、平移变换以及QMatrix4x4)的基础上再增加对摄像机位置、姿态的设置功能,以及成像区域的定义功能。QMatrix4x4::lookAt(camera, center, upDirection)定义了摄像机...
  • QQuaternion四元数类

    千次阅读 2017-04-01 16:39:01
    利用四元数获得旋转矩阵QMatrix4x4 fromQuaternion(QQuaternion &q) { QMatrix4x4 mat ; mat.setToIdentity(); float x = q.x(); float y = q.y(); float z = q.z(); float w = q.scalar(); float x2
  • QMatrix4x4 projection; QVector2D mousePressPosition; QVector3D rotationAxis; qreal angularSpeed; QQuaternion rotation; }; MainWidget类实现 由于OpenGLES2.0不再支持固定的图形管道,所以它必须由我们自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 438
精华内容 175
关键字:

qmatrix4x4