精华内容
下载资源
问答
  • 图形学基础 | 3D变换

    2019-03-30 16:46:41
    绕Y轴旋转 绕Z轴旋转 绕X轴旋转 绕Y轴旋转 绕Z轴旋转 绕任意轴旋转 方法1: 将旋转轴平移至原点 将旋转轴旋转至XOZ平面 将旋转轴旋转至于Z轴重合 绕Z轴旋转θ度 执行步骤3的逆过程 执行步骤2的逆过程 ...

    几何变换详解
    绕任意轴旋转

    复习一下3D矩阵变换的相关知识.

    平移变换

    在这里插入图片描述

    缩放变换

    • [sx,sy,sz]是缩放因子
      在这里插入图片描述

    旋转变换

    • 这是三种变换中最复杂的变换
    • 绕X轴旋转
    • 绕Y轴旋转
    • 绕Z轴旋转

    绕X轴旋转

    在这里插入图片描述

    绕Y轴旋转

    在这里插入图片描述

    绕Z轴旋转

    在这里插入图片描述

    绕任意轴旋转

    方法1:

    1. 将旋转轴平移至原点
    2. 将旋转轴旋转至XOZ平面
    3. 将旋转轴旋转至于Z轴重合
    4. 绕Z轴旋转θ度
    5. 执行步骤3的逆过程
    6. 执行步骤2的逆过程
    7. 执行步骤1的逆过程

    假设用v1(a1, b2, c2)和v2(a2, b2, c2)来表示旋转轴,θ表示旋转角度。为了方便推导,暂时使用右手系并使用列向量,待得出矩阵后转置一下即可.
    在这里插入图片描述
    步骤1是一个平移操作,将v1v2平移至原点,对应的矩阵为
    在这里插入图片描述
    步骤2是一个旋转操作,将p(p = v2 -v1)旋转至XOZ平面,步骤3也是一个旋转操作,将p旋转至与Z轴重合,这两个操作对应的图如下。
    在这里插入图片描述
    做点p在平面YOZ上的投影点q。再过q做Z轴垂线,则r是p绕X轴旋转所得,且旋转角度为α,且
    在这里插入图片描述
    在这里插入图片描述
    于是旋转矩阵为
    在这里插入图片描述
    步骤三. 现在将r绕Y轴旋转至与Z轴重合,旋转的角度为-beta(方向为顺时针),且
    在这里插入图片描述
    在这里插入图片描述
    于是得到旋转矩阵为
    在这里插入图片描述
    步骤4: 是绕Z轴旋转
    在这里插入图片描述
    如果旋转轴是过原点的,那么第一步和最后一步的平移操作可以省略,也就是把中间五个矩阵连乘起来,再转置一下,得到下面的绕任意轴旋转的矩阵
    在这里插入图片描述

    方法2: 罗德里格斯公式

    视觉SLAM十四讲(一)——罗德里格斯转换公式推导

    罗德里格斯公式(Rodriguez formula):
    在这里插入图片描述

    1.I是三阶单位向量;
    2.k是旋转轴 theta是旋转角;

    展开全文
  • 图形图形消隐

    2013-05-04 10:58:37
    在已给出程序Draw3D2中,在视图类中分别添加绕X轴旋转和绕Y轴旋转的函数void RotateX(int angle)和void RotateY(int angle);在视图类中添加计算外法向量的函数HOMOCOORD GetN(HOMOCOORD p1, HOMOCOORD p2, ...
  • OpenGL编程逐步深入(七)旋转变换

    千次阅读 2015-04-23 20:27:15
    这一节我们来看一下旋转...这意味着我们的图形只在三个平面旋转:XY平面着Z轴)、YZ平面着X轴)、XZ(Y轴)。还有更复杂的旋转方式这里我们暂时用不到。我们来概括性的定义这个问题。考虑下面这样的图形

    准备知识

    这一节我们来看一下旋转变换。旋转变换指的是给我们一个指点的点和角度,我们需要绕着过该点的轴线將对象旋转对应的角度。这里我们只改变X/Y/Z中的两个分量,第三个分量保持不变。这意味着我们的图形只在三个平面内旋转:XY平面(绕着Z轴)、YZ平面(绕着X轴)、XZ(绕着Y轴)。还有更复杂的旋转方式这里我们暂时用不到。

    我们来概括性的定义这个问题。考虑下面这样的图形:
    这里写图片描述

    我们需要沿着圆把点(x1,y2)移动到(x2,y2),换句话说就是把(x1,y1)旋转a2角度。我们假定圆的半径为1,则有:
    这里写图片描述

    使用正余弦展开公式:
    这里写图片描述

    可得:
    这里写图片描述

    在上面的图形中,Z轴垂直于屏幕,XY平面和屏幕重合。和平移变换一样,我们4x4阶矩阵和顶点分量矩阵乘积的形式表示该变换,可以写成:

    这里写图片描述

    绕Y轴选择可以用以下形式表示:
    这里写图片描述

    绕X轴旋转:

    这里写图片描述

    上面的4x4阶矩阵就是我们的旋转变换矩阵。

    程序代码

    /*
    
        Copyright 2010 Etay Meiri
    
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
        Tutorial 07 - Rotation transformation
    */
    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
    #include <GL/glew.h>
    #include <GL/freeglut.h>
    #include "ogldev_math_3d.h"
    GLuint VBO;
    GLuint gWorldLocation;
    
    const char* pVSFileName = "shader.vs";
    const char* pFSFileName = "shader.fs";
    
    
    static void RenderSceneCB()
    {
        glClear(GL_COLOR_BUFFER_BIT);
    
        static float Scale = 0.0f;
    
        Scale += 0.001f;
    
        Matrix4f World;
    
        World.m[0][0] = cosf(Scale); World.m[0][1] = -sinf(Scale); World.m[0][2] = 0.0f; World.m[0][3] = 0.0f;
        World.m[1][0] = sinf(Scale); World.m[1][1] = cosf(Scale);  World.m[1][2] = 0.0f; World.m[1][3] = 0.0f;
        World.m[2][0] = 0.0f;        World.m[2][1] = 0.0f;         World.m[2][2] = 1.0f; World.m[2][3] = 0.0f;
        World.m[3][0] = 0.0f;        World.m[3][1] = 0.0f;         World.m[3][2] = 0.0f; World.m[3][3] = 1.0f;
    
        glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);
    
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    
        glDrawArrays(GL_TRIANGLES, 0, 3);
    
        glDisableVertexAttribArray(0);
    
        glutSwapBuffers();
    }
    
    
    static void InitializeGlutCallbacks()
    {
        glutDisplayFunc(RenderSceneCB);
        glutIdleFunc(RenderSceneCB);
    }
    
    static void CreateVertexBuffer()
    {
        Vector3f Vertices[3];
        Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
        Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
        Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);
    
        glGenBuffers(1, &VBO);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
    }
    
    static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)
    {
        GLuint ShaderObj = glCreateShader(ShaderType);
    
        if (ShaderObj == 0) {
            fprintf(stderr, "Error creating shader type %d\n", ShaderType);
            exit(1);
        }
    
        const GLchar* p[1];
        p[0] = pShaderText;
        GLint Lengths[1];
        Lengths[0]= strlen(pShaderText);
        glShaderSource(ShaderObj, 1, p, Lengths);
        glCompileShader(ShaderObj);
        GLint success;
        glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
        if (!success) {
            GLchar InfoLog[1024];
            glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
            fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);
            exit(1);
        }
    
        glAttachShader(ShaderProgram, ShaderObj);
    }
    
    static void CompileShaders()
    {
        GLuint ShaderProgram = glCreateProgram();
    
        if (ShaderProgram == 0) {
            fprintf(stderr, "Error creating shader program\n");
            exit(1);
        }
        string vs, fs;
    
        if (!ReadFile(pVSFileName, vs)) {
            exit(1);
        };
    
        if (!ReadFile(pFSFileName, fs)) {
            exit(1);
        };
    
        AddShader(ShaderProgram, vs.c_str(), GL_VERTEX_SHADER);
        AddShader(ShaderProgram, fs.c_str(), GL_FRAGMENT_SHADER);
    
        GLint Success = 0;
        GLchar ErrorLog[1024] = { 0 };
    
        glLinkProgram(ShaderProgram);
        glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);
        if (Success == 0) {
            glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
            fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
            exit(1);
        }
    
        glValidateProgram(ShaderProgram);
        glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &Success);
        if (!Success) {
            glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
            fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
            exit(1);
        }
    
        glUseProgram(ShaderProgram);
    
        gWorldLocation = glGetUniformLocation(ShaderProgram, "gWorld");
        assert(gWorldLocation != 0xFFFFFFFF);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
        glutInitWindowSize(1024, 768);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Tutorial 07");
    
        InitializeGlutCallbacks();
    
        // Must be done after glut is initialized!
        GLenum res = glewInit();
        if (res != GLEW_OK) {
            fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
            return 1;
        }
    
        printf("GL version: %s\n", glGetString(GL_VERSION));
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
        CreateVertexBuffer();
    
        CompileShaders();
    
        glutMainLoop();
    
        return 0;
    }
    
    

    代码解读

    这里我们只把矩阵改成旋转变换矩阵,其余代码和上节相同。

    World.m[0][0]=cosf(Scale); World.m[0][1]=-sinf(Scale); World.m[0][2]=0.0f; World.m[0][3]=0.0f;
    World.m[1][0]=sinf(Scale); World.m[1][1]=cosf(Scale);  World.m[1][2]=0.0f; World.m[1][3]=0.0f;
    World.m[2][0]=0.0f;        World.m[2][1]=0.0f;         World.m[2][2]=1.0f; World.m[2][3]=0.0f;
    World.m[3][0]=0.0f;        World.m[3][1]=0.0f;         World.m[3][2]=0.0f; World.m[3][3]=1.0f;

    运行效果

    可以看到三角形在屏幕上不停旋转。

    这里写图片描述

    展开全文
  • 2.4 旋转曲面 (1)

    2020-05-29 23:37:02
    (1) 坐标平面上一条曲线坐标轴旋转一周得到的旋转曲面。 (a) yOz坐标面上的曲线 z=f(y) (a≤y≤b) z 轴旋转一周得到的旋转曲面的方程是: 其参数方程是 用这个参数方程绘图比较方便。 其作图基本格式为: plot3d...

    旋转曲面的定义
    空间一条曲线绕一直线旋转一周得到的曲面称为旋转曲面在这里插入图片描述

    (1) 坐标平面上一条曲线绕坐标轴旋转一周得到的旋转曲面。
    (i) yOz坐标面上的曲线 z=f(y) (a≤y≤b)绕 z 轴旋转一周得到的旋转曲面的方程是:在这里插入图片描述
    其参数方程是在这里插入图片描述
    用这个参数方程绘图比较方便。
    其作图基本格式为:

    plot3d([u* cos(t), u* sin(t), f(u)], u=a…b, t=0…2*Pi);在这里插入图片描述

    例 2.4.1 作出yOz坐标面上的以下抛物线绕 z 轴旋转一周得到的旋转曲面的图形。在这里插入图片描述
    旋转曲面的一般方程为在这里插入图片描述
    参数方程为:在这里插入图片描述
    输入以下命令:

    f:=u->u^2:
    plot3d([u * sin(theta),u * cos(theta),f(u)],u=0…2, theta=0…2 * Pi,scaling=constrained, style=patch, axes=normal, lightmodel=light2,
    orientation=[40,70]);在这里插入图片描述

    输出图形(旋转抛物面):在这里插入图片描述

    例 2.4.2 作出yOz坐标面上的以下直线绕 z 轴旋转一周得到的旋转曲面的图形。在这里插入图片描述
    旋转曲面的一般方程为在这里插入图片描述
    参数方程为:在这里插入图片描述
    输入以下命令:

    f:=u->u:
    plot3d([u* sin(theta),u* cos(theta),f(u)],u=-2…2, theta=0…2*Pi,
    scaling=constrained,style=patch,axes=normal,
    lightmodel=light2,orientation=[40,70]);
    在这里插入图片描述

    输出图形(圆锥面):在这里插入图片描述
    (ii) yOz坐标面上的曲线 z=f(y) (a≤y≤b)绕 y 轴旋转一周得到的旋转曲面的方程是:在这里插入图片描述
    其参数方程是:在这里插入图片描述
    其作图基本格式为:

    plot3d( [ f(u) * sin(t), u, f(u) * cos(t) ], u=a…b, t=0…2 *Pi);在这里插入图片描述

    例 2.4.3 作出yOz坐标面上的以下抛物线绕 y 轴旋转一周得到的旋转曲面的图形。
    在这里插入图片描述
    旋转曲面的一般方程为在这里插入图片描述
    参数方程为:在这里插入图片描述
    输入以下命令:

    f:=u->u^2:
    plot3d([f(u) * sin(theta),u,f(u) * cos(theta)],u=-2…2, theta=0…2 * Pi,
    scaling=unconstrained, style=patch,axes=normal, lightmodel=light3, orientation=[40,70]);在这里插入图片描述

    输出图形:在这里插入图片描述
    例 2.4.4 作出yOz坐标面上的以下曲线绕 y 轴旋转一周得到的旋转曲面的图形。在这里插入图片描述
    旋转曲面的一般方程为在这里插入图片描述
    参数方程为在这里插入图片描述
    输入以下命令:

    f:=u->sin(u):
    plot3d([f(u) * sin(theta),u,f(u) * cos(theta)],u=0…2 * Pi, theta=0…2 * Pi,
    scaling=constrained, style=patch, axes=normal, lightmodel=light3,orientation=[40,70]);在这里插入图片描述

    输出图形:在这里插入图片描述
    (iii) zOx坐标面上的曲线 x=f(y) (a≤y≤b)绕 x 轴旋转一周得到的旋转曲面的方程是:在这里插入图片描述
    参数方程为在这里插入图片描述
    其作图基本格式为:

    plot3d([f(u), u* cos(t), u* sin(t)], u=a…b, t=0…2*Pi);在这里插入图片描述

    例 2.4.5 作出zOx坐标面上的以下抛物线绕 x 轴旋转一周得到的旋转曲面的图形。在这里插入图片描述
    旋转曲面的一般方程为在这里插入图片描述
    参数方程为在这里插入图片描述
    输入以下命令:

    f:=u->u^2:
    plot3d([f(u),u * cos(theta),u * sin(theta)],u=-2…2,theta=0…2 * Pi,
    scaling=constrained, style=patch, axes=normal, lightmodel=light3,orientation=[50,60]);在这里插入图片描述

    输出图形(旋转抛物面):在这里插入图片描述

    返回《Maple图形与动画》目录

    展开全文
  • 第13

    2019-12-24 08:57:21
    第七十节:平面图形绕x轴,y轴旋转所成旋转体的体积 第七十一节:曲线的弧长 第七十二节:平面图形绕x轴旋转所成旋转体的侧面积,定积分在物中的应用 第七十三节:定积分在物理中的应用(续),第一类广义积分思想 第七...

    第七十节:平面图形绕x轴,y轴旋转所成旋转体的体积
    第七十一节:曲线的弧长
    第七十二节:平面图形绕x轴旋转所成旋转体的侧面积,定积分在物中的应用
    第七十三节:定积分在物理中的应用(续),第一类广义积分思想
    第七十四节:第一类广义积分,第二类广义积分思想
    第七十五节:第二类广义积分,伽马函数
    定积分及应用总结与拓展

    展开全文
  • 微积分(一)

    2019-12-25 15:45:38
    微积分(一) ...第七十节:平面图形绕x轴,y轴旋转所成旋转体的体积;第七十一节:曲线的弧长;第七十二节:平面图形绕x轴旋转所成旋转体的侧面积,定积分在物中的应用;第七十三节:定积分在物理中的...
  •   旋转变换,就是说给定一个角度和点,我们将点着一个坐标轴旋转。在旋转过程中发生变化的总是x,,z三个坐标里面的其中两个,而不让第三个坐标值变化。这意味着,旋转路径总在三个坐标轴平面中的一个之中:...
  • 本文将实现三维空间中的旋转和平移变换,即将三维空间中的一个向量(或者一个空间图形)移动到另一个位置。如下图所示: 如上图所示,由矢量一移动到矢量二。...第一步是绕Z轴旋转到XZ平面,第二步是绕Y
  • 正交矩阵 基本的旋转矩阵:转置矩阵=逆...二维平面定义旋转时,逆时针实际是在三维从正向看,因此三维绕y轴旋转,逆时针实际是z向x转,但是旋转矩阵的行列对应的是x向z旋转,取逆(转置)就得到了。 向量n过原点 ...
  • 三维变换及三维观察 三维图形变换包括三维几何变换和投影变换 通过它可由简单图形得到复杂图形 可以用二维图形...绕y轴旋转 对称变换 关于坐标平面对称 关于坐标轴对称 关于坐标原点对称 错切变换 沿x方向错切 沿y方
  • 三维图形的投影变换

    千次阅读 2018-04-12 13:35:25
    正视图:(yz)俯视图:(xy)侧视图:(xz)1.2 正轴测投影:如图:咱们希望按照这个平面对物体进行平行投影:首先,先把物体及投影面沿着y轴顺时针旋转,在x轴逆时针旋转θ角,使投影面与z轴重合,变换矩阵如下:最后做Z方向的正...
  • 一、求平面图形 ...绕y轴旋转 3. 积分变量为y * 易错点 用y则是和y围成的面积 三、求弧长 1. y=f(x) 2&3. x=f(y) && x,y=f(t) 4. 参数方程 Example –> 情况1 —> 情况4 ...
  • 然后再绕y轴旋转,就生成了一组车床类型的几何体模型。 简单实现 首先,我们需要在平面上设置一个曲线的点,每个点都有x,y坐标,如图 然后,我们使用这一组顶点的坐标去实例化一个THREE.LatheGeometry几何...
  • 体积 平行截面面积已知的立体的体积: 空间立体介于垂直于x 轴的两个平面x=a与x=b(a<b)之间,用垂直于x轴的平面去截立体,若所得截面面积是...成的平面图形绕x轴旋转一周所成旋转体的体积为: V=π∫abf2(x)dxV=\p
  • 定积分的应用(一)

    千次阅读 2019-05-05 22:57:18
    一.平面图形的面积 1.直角坐标方程的情形 设函数, 或者函数 , , x型区域:; y型区域:; 2.参数方程的情形 ...二....设是上的连续函数,是由平面图形x轴旋转一周所得的旋转体,则截面...
  • 求(x−2)2+y2=1(x-2)^2+y^2=1(x−2)2+y2=1绕y轴旋转一周所得到的旋转体的体积。 这道题可以用底面半径从1到3的圆柱面去切割,得到无数个内部是空心的圆筒,然后对x从1到3积分得出答案 也可以用普通的...
  • 球面的方程 旋转曲面f(x,y)x轴旋转,得 柱面在z轴方向上的柱面: 二次曲面及其图像首先说一下根据方程推测二次曲线图像的方法:1. 截痕法:通过平移一个坐标平面,观察平面与曲面的交平面的变化而推测出图像2. 伸缩...
  • 黄冈中学高2数学教案

    2010-09-04 23:23:52
     在平面直角坐标系中,对于一条与x相交的直线l,把x(正方向)按逆时针方向着交点旋转到和直线l重合所成的角,叫作直线l的倾斜角.  当直线与x平行或重合时,规定它的倾斜角为0°.  (2)倾斜角相同的直线...
  • 1、角的定义:平面内一条射线着端点从一个位置旋转到另一个位置所成的图形.  规定:按逆时针方向旋转形成的角叫正角,按顺时针方向旋转形成的角叫负角.  没有作任何旋转时称它形成了一个零角. 2、象限角:  ...
  • Nehe的OpenGL教程电子书

    2018-04-07 12:25:03
    左图中的三角形沿Y轴旋转,四边形沿着X 轴旋转。 这一章将引入两个变量, rtri 被用来存储三角形的角度, rquad存储四边形的角度。 和容易创建一个多边形组成的场景。让这些物体动起来是整个场景变得生动起来。在...
  • 左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。 这一章将引入两个变量, rtri 被用来存储三角形的角度, rquad存储四边形的角度。 和容易创建一个多边形组成的场景。让这些物体动起来是整个场景变得生动起来。在后面...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

平面图形绕y轴旋转