精华内容
下载资源
问答
  • 计算机图形学,矩形窗口编码裁剪,二维图形的平移旋转,三维图的平移旋转,三视图,以及一些其他图形设计,中间有部分是键盘交互,使用时请注意,若代码无法运行,请联系1811505951@qq.com
  • 本课件充分展示了关于平移旋转的相关知识点,帮助老师更好的完成本科的教学,是很好的教学辅助工具。欢迎来下载!该文档为平移和旋转平移、旋转和轴对称PPT课件,是一份很不错的参考资料,具有较高参考价值,感...
  • PCL 仿射变换,实现点云平移旋转

    万次阅读 2021-02-27 13:19:38
    使用仿射变换进行点云的旋转平移

    一、算法原理

    1、仿射变换

    在这里插入图片描述

    二、代码实现

    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_cloud.h>
    #include <pcl/common/transforms.h>  //  pcl::transformPointCloud 用到这个头文件
    #include <pcl/common/common_headers.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    
    using namespace std;
    
    int
    main(int argc, char** argv) {
    
    	// 加载点云数据文件
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
    	pcl::io::loadPCDFile("飞机.pcd", *cloud);
    
    	Eigen::Affine3f transform = Eigen::Affine3f::Identity();//初始化变换矩阵为单位矩阵
    	// 在 X 轴上定义一个 1米的平移.
    	transform.translation() << 1.0, 0.0, 0.0;
    
    	// 旋转; X轴旋转45°, Y轴上旋转0°,Z轴上旋转0°
    	float angle_x = 45;
    	float angle_y = 0;
    	float angle_z = 0;
    
    	// 国际单位制中,弧度是角的度量单位,Eigen中也是以弧度作为角度量单位,
    	// 因此需要将角度值转换为弧度制
    	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_x), Eigen::Vector3f::UnitX()));
    	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_y), Eigen::Vector3f::UnitY()));
    	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_z), Eigen::Vector3f::UnitZ()));
    	// 打印变换矩阵
    	cout << "变换矩阵为:\n" << transform.matrix() << endl;
    
    	// 执行变换,并将结果保存在新创建的 transformed_cloud 中
    	pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>());
    	pcl::transformPointCloud(*cloud, *transformed_cloud, transform);
    	//pcl::io::savePCDFileASCII("tg.pcd", *transformed_cloud);
    
    	cout << "原始点云显示为白色,变换后的点云为红色" << endl;
    	pcl::visualization::PCLVisualizer viewer("Affine3f transformation example");
    
    	// 为点云定义 R,G,B 颜色
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler(cloud, 255, 255, 255);
    	// 输出点云到查看器,使用颜色管理
    	viewer.addPointCloud(cloud, source_cloud_color_handler, "original_cloud");
    
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler(transformed_cloud, 255, 0, 0); // 红
    	viewer.addPointCloud(transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");
    	viewer.setBackgroundColor(0.05, 0.05, 0.05, 0); // 设置背景为深灰
    	viewer.addText("The original point cloud is white,the transformed point cloud is red", 20, 20, "text");
    	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "original_cloud");
    	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "transformed_cloud");
    	//viewer.setPosition(800, 400); // 设置窗口位置
    	// 启动可视化
        viewer.addCoordinateSystem(0.2);  //显示XYZ指示轴
        //viewer.initCameraParameters();   //初始化摄像头参数
    
    
    	while (!viewer.wasStopped()) { // 在按下 "q" 键之前一直会显示窗口
    		viewer.spinOnce(100);
    		boost::this_thread::sleep(boost::posix_time::microseconds(1000));
    	}
    
    	return 0;
    }
    

    三、结果展示

    在这里插入图片描述

    展开全文
  • 今天我们来聊一聊Shader基础知识,图片旋转平移:首先我们了解明白:平移矩阵和旋转矩阵 这俩个矩阵推导过程可以自行百度,公式如下:平移矩阵:旋转矩阵:这次我们在顶点着色器(Vertex Shader)里编写(因为...

    今天我们来聊一聊Shader的基础知识,图片旋转和平移:

    首先我们的了解明白:平移矩阵和旋转矩阵 这俩个矩阵的推导过程可以自行百度,公式如下:

    平移矩阵:

    旋转矩阵:

    这次我们在顶点着色器(Vertex Shader)里编写(因为顶点着色器(Fragment Shader)是在光栅化前面对顶点进行进行处理,这样数据量的会比较少,节省性能)

    Shader "Ly/Rotate"

    {

    Properties{ _MainTex("Texture", 2D) = "white" {}

    _RotateCenterX("RotateCenterX",Float) = 0.5

    _RotateCenterY("RotateCenterY",Float) = 0.5

    _TranslationX("TranslationX",float) = 0

    _TranslationY("TranslationY",float) = 0

    _RotateAngle("RotateAngle",Range(-360,360)) = 0

    }

    SubShader{

    Tags{ "RenderType" = "Opaque" }

    LOD 100

    Pass{

    CGPROGRAM

    #pragma vertex vert

    #pragma fragment frag

    #include "UnityCG.cginc"

    sampler2D _MainTex;

    float4 _MainTex_ST;

    float _RotateCenterX;

    float _RotateCenterY;

    float _RotateAngle;

    float _TranslationX;

    float _TranslationY;

    struct v2f

    {

    float2 uv : TEXCOORD0;

    float4 pos : SV_POSITION;

    };

    v2f vert(appdata_full v)

    {

    v2f o;

    o.pos = UnityObjectToClipPos(v.vertex);

    float rotate = (_RotateAngle * 3.1415926) / 180; // 把角度 转化为 弧度

    float2 di = float2(_RotateCenterX, _RotateCenterY); // 旋转的中心位置

    // 减去di 表示旋转的中心位置就是 di了 然后利用平移矩阵进行平移

    float2 uv = mul(float3(v.texcoord.xy - di, 1), float3x3(1, 0, 0,

    0, 1, 0,

    _TranslationX, _TranslationY, 1)).xy;

    //利用旋转矩阵以 di 为中心进行旋转, 最后加di 表示图片变回以(0,0)为 原点

    uv = mul(uv, float3x3(cos(rotate), -sin(rotate), 0,

    sin(rotate), cos(rotate), 0,

    0, 0, 1)) + di;

    o.uv = uv;

    return o;

    }

    fixed4 frag(v2f i) : SV_Target

    {

    return tex2D(_MainTex, i.uv);

    }

    ENDCG

    }

    }

    }

    感兴趣的小伙伴可以试着在片元着色器里写出平移和旋转。

    至此文章讲解完毕,如有不足请大家指出。都看到这里了,点赞收藏吧!

    附上git上工程地址:https://github.com/lu-yu01/Unity_Shader_Demo​github.com

    展开全文
  • 四边形的平移旋转

    2020-06-22 15:51:57
    #include <GL/glut.h> #include <.../* 设置世界坐标系显示范围 */ GLfloat xwcMin = 0.0, xwcMax = 225.0; GLfloat ywcMin = 0.0, ywcMax = 225.0; /* 定义二维点数据结构 */ class .
    #include <GL/glut.h>
    #include <stdlib.h>
    #include <math.h>
     /* 初始化显示窗口大小 */ 
    GLsizei winWidth = 600, winHeight = 600;
    /* 设置世界坐标系的显示范围 */ 
    GLfloat xwcMin = 0.0, xwcMax = 225.0;
    GLfloat ywcMin = 0.0, ywcMax = 225.0;
    /* 定义二维点数据结构 */ 
    class wcPt2D
      { public:
         GLfloat x, y;
       };
    typedef GLfloat Matrix4x3[4][3];
      //定义复合矩阵
    typedef GLfloat Matrix3x3[3][3];
    Matrix3x3 matComposite; 
    
    const GLdouble pi = 3.14159;
    
    void init(void)
      { /* 设置显示窗口的背景颜色为白色 */ 
          glClearColor(1.0, 1.0, 1.0, 0.0);
       }
    
    /* 构建3*3的单位矩阵,对角线为(1,1,1) */ 
    
    void matrix3x3SetIdentity(Matrix3x3 matIdent3x3)
      {
          GLint row, col;
          for (row = 0; row<3; row++)
             for (col = 0; col<3; col++)
                 matIdent3x3[row][col] = (row == col);
       }
    /* 变换矩阵m1 乘矩阵m2,储存结果到m2中,即矩阵乘法 */
    void matrix3x3PreMultiply(Matrix3x3 m1, Matrix3x3 m2)
      {
          GLint row, col;
          Matrix3x3 matTemp;
          for (row = 0; row<3; row++)
               for (col = 0; col<3; col++)
                   matTemp[row][col] = m1[row][0] * m2[0][col] 
                  + m1[row][1] * m2[1][col] + m1[row][2] * m2[2][col];//行×行,列×列
          for (row = 0; row<3; row++)
                for (col = 0; col<3; col++)
                     m2[row][col] = matTemp[row][col];
    }
    /* 平移变换函数,平移量tx,ty */ 
    void translate2D(GLfloat tx, GLfloat ty)
      {   Matrix3x3 matTransl;
         /* 初始化平移矩阵为单位矩阵 */ 
          matrix3x3SetIdentity(matTransl);
          matTransl[0][2] = tx;//tx为平移的横坐标
          matTransl[1][2] = ty;//ty为平移的纵坐标
          /* 将平移矩阵前乘到复合矩阵matComposite中 */ 
          matrix3x3PreMultiply(matTransl, matComposite);
       } 
    /* 旋转变换函数,参数为中心点pivotPt和旋转角度theta */ 
    void rotate2D(wcPt2D pivotPt, GLfloat theta)
      {
      Matrix3x3 matRot;
            /* 初始化旋转矩阵为单位矩阵 */ 
      matrix3x3SetIdentity(matRot);
      matRot[0][0] = cos(theta);
      matRot[0][1] = -sin(theta);
      matRot[0][2] = pivotPt.x*(1 - cos(theta)) + pivotPt.y*sin(theta);//先把旋转点平移到原点,再旋转,再平移回去
      matRot[1][0] = sin(theta);
      matRot[1][1] = cos(theta);
      matRot[1][2] = pivotPt.y*(1 - cos(theta)) - pivotPt.x*sin(theta);//先把旋转点平移到原点,再旋转,再平移回去
             /* 将旋转矩阵前乘到复合矩阵matComposite中 */ 
      matrix3x3PreMultiply(matRot, matComposite);
    } 
    void transformVerts2D(GLint nVerts, wcPt2D * verts)
    {
    	 GLint k;
    	 GLfloat temp;
    	 for (k = 0; k<nVerts; k++)
    	 {
    		//变换矩阵和原来的齐次坐标矩阵相乘
    		temp = matComposite[0][0] * verts[k].x + matComposite[0][1] * verts[k].y + matComposite[0][2];
    		verts[k].y = matComposite[1][0] * verts[k].x + matComposite[1][1] * verts[k].y + matComposite[1][2];
    		 verts[k].x = temp;
    	 }
    }
    void square(wcPt2D * verts)
    {
      GLint k;
      glBegin(GL_POLYGON);//绘制四边形的每一个点
          for (k = 0; k<4; k++)  glVertex2f(verts[k].x, verts[k].y);
      glEnd();
    } 
    void displayFcn(void)
    {
    	GLint nVerts = 4;
    	wcPt2D verts[4] = {  { 50.0,25.0 },{ 150.0,25.0 },{ 150.0,70.0 },{50.0,70.0} };
    	wcPt2D centroidPt;
    	GLint k, xSum = 0, ySum = 0;
        for (k = 0; k<nVerts; k++)
    	 {  xSum += verts[k].x;
    		   ySum += verts[k].y; }
    	centroidPt.x = GLfloat(xSum) / GLfloat(nVerts);//横坐标平均值为旋转点的x
    	centroidPt.y = GLfloat(ySum) / GLfloat(nVerts);//纵坐标平均值为旋转点的y
    	/* 设置几何变换参数*/ 
    	wcPt2D pivPt, fixedPt;
        pivPt = centroidPt;
    	fixedPt = centroidPt;
    	GLdouble theta = pi / 2.0; 
    
    	glClear(GL_COLOR_BUFFER_BIT); // 清空显示窗口
        glColor3f(0.0, 0.6, 0.6); // 设置前景色为蓝色
        square(verts); //显示蓝色三角形(变换前)
    	  /* 初始化复合矩阵为单位矩阵 */ 
    	matrix3x3SetIdentity(matComposite);
    	/* 根据变换序列重建复合矩阵 */ 
    	rotate2D(pivPt, theta); //变换序列2:旋转变换
    	translate2D(0.0, 100.0); //变换序列3:平移变换
    	/* 应用复合矩阵到四边形 */ 
    	transformVerts2D(nVerts, verts);
    	glColor3f(1.0, 0.5, 0.0); //重新设置前景色为红色
    	square(verts); //显示红色三角形(变换后)
    
    	glFlush();
    }
    void winReshapeFcn(GLint newWidth, GLint newHeight)
       {glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影矩阵 
       glLoadIdentity(); //将当前矩阵设置为单位矩阵 
       gluOrtho2D(xwcMin, xwcMax, ywcMin, ywcMax); 
    //定义二维正投影窗口 
       glClear(GL_COLOR_BUFFER_BIT); //清除当前可写的颜色缓冲 
        } 
    void main(int argc, char ** argv)
       {
       glutInit(&argc, argv);  // 初始化GLUT库 
       glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
     //单缓冲,建立RGB模式窗口 
       glutInitWindowPosition(50, 50);//窗口位置
       glutInitWindowSize(winWidth, winHeight);//窗口大小
       glutCreateWindow("二维几何变换实例-复合变换");
       init();
       glutDisplayFunc(displayFcn);//显示图形
       glutReshapeFunc(winReshapeFcn);
       glutMainLoop();
      } 

    通过矩阵的乘法来确定变换矩阵——平移和旋转(缩放也简单,但没时间写了)在本例中尽管变换的是四边形,但是变换矩阵依然是3X3的。

    展开全文
  • 坐标的平移旋转

    2015-10-11 15:22:56
    平移: 假设M是原点为(0,0,0)坐标系,N是原点为(2,2,2)坐标系,点P(px,py,pz)是M中一点,那么点P在N中坐标P‘是多少呢? p'x = px - 2;p'y = py - 2;p'z = pz - 2;换成矩阵看看: [java] view ...

    平移:
    假设M是原点为(0,0,0)的坐标系,N是原点为(2,2,2)的坐标系,点P(px,py,pz)是M中的一点,那么点P在N中的坐标P‘是多少呢?
    p'x = px - 2;p'y = py - 2;p'z = pz - 2;换成矩阵看看:

    [java] view plaincopy
    1. p'x = |px| + |-2|  
    2. p'y = |py| + |-2|  
    3. p'z = |pz| + |-2|  

    换成齐次坐标就为:

    [java] view plaincopy
    1. |p'x|   | 1 0 0 tx|   |px|  
    2. |p'y| = | 0 1 0 ty| * |py|  
    3. |p'z|   | 0 0 1 tz|   |pz|  
    4. 1 |   | 0 0 0  1|   |1 |  

    对上面来讲:tx=-2,ty=-2;tz=-2;

    旋转:
    假设M是原点为(0,0,0)的坐标系,点p(px,py,pz)绕z轴逆时针旋转a度到点p',那么点p'是多少呢?
    p'x = px*cosa - py*sina
    p'y = px*sina + py*cosa
    p'z = z
    换成齐次坐标就为:

    [java] view plaincopy
    1. |x'|   |cosa -sina 0 0|   |x|  
    2. |y'| = |sina  cosa 0 0| * |y|  
    3. |z'|   |0      0   1 0|   |z|  
    4. |1 |   |0      0   0 1|   |1|  

    那么绕x轴呢?
    p'y = py*cosa - pz*sina
    p'z = py*sina + pz*cosa
    p'x = x
    换成齐次坐标就为:

    [java] view plaincopy
    1. |x'|   |1  0     0   0|   |x|  
    2. |y'| = |0 cosa -sina 0| * |y|  
    3. |z'|   |0 sina  cosa 0|   |z|  
    4. |1 |   |0  0     0   1|   |1|  

    那么绕y轴呢?
    p'z = pz*cosa - px*sina
    p'zx =pz*sina + px*cosa
    p'y = y
    换成齐次坐标就为:

    [java] view plaincopy
    1. |x'|   | cosa 0 sina 0|   |x|  
    2. |y'| = | 0    1  0   0| * |y|  
    3. |z'|   |-sina 0 cosa 0|   |z|  
    4. |1 |   | 0    0  0   1|   |1|  

    缩放:
    假设M是原点为(0,0,0)的坐标系,点P(px,py,pz)沿x轴缩放sx,沿y轴缩放sy,沿z轴缩放sz后的坐标p'是多少呢?
    p'x = px * sx
    p'y = py * sy
    p'z = pz * sz
    换成齐次坐标就为:

    [java] view plaincopy
    1. |x'|   |sx 0  0  0|   |x|  
    2. |y'| = |0  sy 0  0| * |y|  
    3. |z'|   |0  0  sz 0|   |z|  
    4. |1 |   |0  0  0  1|   |1|
    展开全文
  • 平移旋转的矩阵生成

    2018-05-25 09:23:35
  • 我做了一个简单的实验,来探讨平移,缩放,旋转的性质。 由于我浅薄的知识,如有不对的地方,请各位大佬指正。 平移:FFT具有平移不变性,在空域平移图像,频域的信号不发生变换。 旋转:旋转同一性,空域图像的...
  • 如图,这次就先讲一下平移旋转、缩放 如果只是view做平移,有很多种实现方式比如通过layout、动画等。 基于我们使用场景:知道一个图片位置信息和旋转角度(中心旋转),就可以将它画出来。...
  • 计算机图形学MFC 基于C++实现图形的平移旋转和缩放,含工程文件可直接运行,可以手动输入平移距离、旋转角度、缩放比例等。
  • 今天小编就为大家分享一篇python 图像平移旋转的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 平移齐次坐标变换: 空间某点由矢量描述。其中,为轴上单位矢量。此点可用平移齐次变换表示为: ...如果先让物体绕z轴旋转90°,接着绕y轴旋转90°,再沿x轴方向平移1个单位(右手坐标系,...
  • 矩阵平移旋转缩放公式 (4)平移矩阵: 注:以上矩阵采用行矩阵,向量采用是行向量。 posted on 2016-04-19 12:48 bky2016 阅读(...) 评论(...) 编辑...
  • 使用Transform对其子组件先进行平移然后再旋转和先旋转平移,两者最终效果一样吗?为什么? 动手实践了下,揣摩了下,在此记录下。若是有不对地方,敬请指出! 1 平移旋转 首先得弄明白平移旋转是如何...
  • 本资源是博主博文《关于在Opengl中先平移旋转和先旋转平移的效果不一样原因》附件资源,里面包含博文演示用代码和vs工程。博文地址为https://blog.csdn.net/u014552102/article/details/88136574
  • 当你看见这个题目时候,就应该之后平移缩放旋转手势和view对应的平移缩放旋转是两码事儿。也就是说如果我们想利用手势,对某个view进行某些操作,就必须明白两个问题,一是如何分辨和接收手势操作,而是如何根据...
  • 我们知道,在opengl中,如果先平移旋转,如果模型中点不在原点,会导致模型位移发生变化。但在项目中遇到一个问题,如果不知道模型中点,或者知道模型中点一定不在原点,但我们也只需要模型方向,那么我们直接将...
  • 图形的旋转缩放平移

    2017-04-30 12:07:55
    MFC实现图形缩放、平移旋转等功能
  • 空间矢量平移旋转的矩阵描述空间矢量的平移 空间矢量的平移 图中矢量AP1沿着矢量AQ进行平移,得到新的矢量AP2,
  • 已知旋转平移4*4矩阵为T,求旋转平移变换后该平面方程。 将平面方程写成矩阵形式为: 则平面内点经过T变换后为: 将点逆变换后带入原平面矩阵方程,则经过T矩阵的旋转平移变换后平面矩阵方程为: 变换后...
  • 2D坐标系中矩阵变换,坐标位置根据某一点做旋转平移,得到新坐标位置。附件中实例下载运行后可以直接看到效果
  • 【VTK】平面的平移旋转

    千次阅读 2018-11-04 11:23:07
    本文探讨平面操作主要是平移和绕轴旋转。 在vtkPlane中保存有数据成员 double Normal[3]; double Origin[3]; 同时,vtkPlane也提供了原点读写函数,法向量读写函数 /** * Set/get point through which ...
  • 主要介绍了通过HTML5 Canvas实现图片的平移旋转变化方法,其中旋转讲解是配合平移坐标系确定圆心位置而进行顺时针旋转,需要朋友可以参考下
  • Graphics的平移旋转

    千次阅读 2017-12-24 14:21:40
    平移函数translate(double x,double y); 旋转函数rotate(double arc,double x,double y)//第一个参数是旋转角度,后二个参数是旋转中心点横纵坐标参数package DrawTest;import java.awt.BasicStroke; import ...
  • 可手势缩放平移旋转的ImageView。可以直接拿来用。参看博客http://blog.csdn.net/BigBoySunshine/article/details/78256008
  • C#实现图像的平移旋转缩放

    热门讨论 2011-10-23 00:10:00
    自己编写小程序,希望能给初学计算机图形学带来启发!有问题可以留言!
  • Unity中的平移 缩放 旋转 1.最近想实现Unity中的平移 缩放 旋转功能, 类似于Unity编辑器状态下效果.尝试了好几个方式,效果都有瑕疵,网友们谁有好实现方式,请教我. 下面是我一种实现方式: using System....
  • SVG 的平移旋转和缩放

    万次阅读 2018-10-26 10:52:59
    SVG中的平移旋转和缩放在不同参数条件下,体现出不同效果: 1、如果直接用x、y指定了图形坐标(在我理解该坐标实际是图形相对坐标,如果没有通过transform属性设置坐标平移,该坐标是相对画布起始位置坐标...
  • Canvas的平移旋转等;

    2016-03-21 22:21:24
    源码中方法: /** * Preconcat the current matrix with the specified translation * * @param dx The distance to translate in X * @param dy The distance to translate in Y */ pub
  • 给出一张发生了旋转平移的图像,和源图像进行比对,计算旋转了多少度,平移了多少,且两张图片并不是完全一样,,略有差别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,590
精华内容 4,236
关键字:

平移旋转的平