精华内容
下载资源
问答
  • 现在我们尝试将 2D 旋转的模式扩展到三维空间中,旋转矩阵的三维形式如下所示,包含 9 个元素: 因此,一开始 3D 旋转有着 9 个自由度,同样的,我们也要知道一个合法的 3D 旋转需要哪些限制条件。首先,每一...

    Steven M. LaValle 的 Virtual Reality 这本书中讲了关于几何模型变换以及显示的知识,跟网上的资料比这本书里讲的比较简洁,于是想做一个总结。本博客参考了《Virtual Reality》的中文译版,翻译与校验人员: 上海交通大学媒体技术实验室(http://medialab.sjtu.edu.cn) 


    Part I

    Part II


     

    平移

    考虑以下 3D 三角形
    ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3))
    顶点坐标表示为通用常量。

    设 xt,yt 和 zt 是分别沿 x,y 和 z 轴的我们想要改变的三角形位置量。 改变位置的操作称为变换,由下式给出
    (x1, y1, z1) → (x1 + xt, y1 + yt, z1 + zt)
    (x2, y2, z2) → (x2 + xt, y2 + yt, z2 + zt)
    (x3, y3, z3) → (x3 + xt, y3 + yt, z3 + zt)
    其中 a→b 表示在变换之后 a 被 b 替换。

    旋转——2D

    考虑一个 2D 虚拟世界,其中的点坐标(x,y)。 你可以把它想象成我们最初的 3D 虚拟世界中的一个垂直平面。 现在考虑一个通用的 2x2 矩阵。

    其中四项的每一个可以是任何实数。 我们看看当这个矩阵乘以点(x, y)后会发生什么,当它被写为列向量时。执行乘法,我们有
     

    其中(x',y')是变换点。使用简单的代数,矩阵乘法产生

    假设我们放置两个点(1,0)和(0,1)在平面上。它们分别位于 x 和 y 轴上,距离原点的距离(0,0)一个单位。使用向量空间,这两点就是标准单位矢量(有时写为 i 和 j)。如果我们将它带入矩阵乘法中可以得到:

    这些特殊点只选择 M 上的列向量。这意味着如果 M 应用于模型转换,则 M 的每一列确切地表示每个坐标轴是如何改变的,也就是说x轴变换成了(m11,m21)这个方向,y轴变换成了(m12,m22)这个方向。下图说明了将各种矩阵 M 的变换效果。

     

    对于上述M矩阵中只有一部分是有效的旋转,因为为了确保模型不会被扭曲,要求M满足下列条件:

    1.没有伸展的轴。
    2.没有剪切。
    3.没有镜像。

    为了满足第一条规则,M 的列必须有单位长度

    为了满足第二条规则,必须保证转换后的坐标轴垂直。否则,会发生剪切。由于 M 的列表示轴是如何变换的,那么此规则意味着它们的内部(点)积为零,也就是x轴的变换(m11,m21)与y轴的变换(m21,m22)垂直:

    满足第三条规则要求 M 的行列式是正数。当满足前两条规则后,唯一可能的行列式是 1(正常情况下)和-1(镜像情况)。 因此,该规则意味着:

    第一个约束条件表示每列必须都被选择以使它每个元素位于一个以原点为中心的单位圆上。在标准的平面坐标,我们通常将这个圆的方程写作 x^2 +y^2 = 1,在极坐标下可以得x = cosθ y = sinθ。我们用角度θ代替点的坐标(x, y),令 m11=cosθ m21= sinθ,M可写做:

    这样通过θ的变化(0~2π范围内),就可以表示所有的 2D 旋转。


    接下来我们讨论旋转的自由度(DOF)。一开始的时候,矩阵 M 的四个元素是可以任意取值的,也就是说有 4 个自由度。第一个约束条件减少两个自由度,第二个条件也减少一个自由度,第三个条件并没有减少自由度,它只去掉了一半可能的变换,因为这些变换是另一半的镜像翻转。 最后, 我们得出结论, 2D 旋转只有一个自由度, 由参数θ决定; 而且,这些旋转都可以用单位圆的点来表示

     

    旋转——3D

    现在我们尝试将 2D 旋转的模式扩展到三维空间中,旋转矩阵的三维形式如下所示,包含 9 个元素:

    因此,一开始 3D 旋转有着 9 个自由度,同样的,我们也要知道一个合法的 3D 旋转需要哪些限制条件。首先,每一列必须保证是单位长度。例如,这就是说每一列中的元素必须落在单位球面上。因此,单位长度的限制将 DOF 减少到 6 个。然后,根据正交轴定理,取矩阵的任意两列,它们的内积必须为 0。最后,为了避免镜像出现,矩阵 M 的行列式要为 1,但这不减少自由度。

    最后,我们得到了一系列满足代数约束的矩阵,然而,和 2D 旋转不同,它并不能用单位球面上的点来表示。我们只知道它有 3 个旋转自由度,意味着它应该可以由 3 个独立的参数来表示,旋转矩阵M中的 9 个元素均可由这 3 个参数计算出,因此我们通过构建几个 2D 旋转变换来描述 3D旋转。

    用翻滚角(roll) 来表示绕 z 轴逆时针方向的旋转γ,用俯仰角(pitch) 来表示绕 x 轴的逆时针旋转β,用偏航角(yaw) 来表示绕 y 轴的逆时针旋转α,旋转矩阵如下:

    偏航角、俯仰角、翻滚角经过组合可以表示所有可能的 3D 旋转:

    需要注意的是矩阵乘法是“后向的”,也就是说对一个向量p进行旋转的时候是将它左乘矩阵,因此旋转RQp是先用Q进行旋转,然后再用R进行旋转。还需要注意的是上式中的顺序不可颠倒,因为它不满足交换律。例如,先旋转π/2 的偏航角,再旋转π/2 的俯仰角与先旋转俯仰角再旋转偏航角的结果是不一样的。

     

    平移+旋转

    我们用一个旋转矩阵 R 进行旋转,紧接着平移(xt, yt, zt),代数形式如下所示:

    如果可以通过一次操作同时完成平移和旋转,那我们使用起来将会方便很多。尽管我们没有办法通过一个 3x3 的矩阵完成如上操作,但是我们可以增加矩阵的维度,用一个 4×4 的齐次变换矩阵来表示。

    符号Trb指代一个做刚体变换的矩阵,也就是说,不包含扭曲变形。一个齐次变换矩阵可能包含其他种类的变换。因此一个原始点经过平移加旋转可以表示为

    我们经常会想要进行反变换,对于平移变换(xt, yt, zt),只需简单地对其取相反数(‐xt, ‐yt, ‐zt)即可;对于一般的矩阵变换 M,我们取它的逆 M‐1(如果存在)。这计算起来通常很复杂,但幸运的是,对于我们所研究的情况,它们的逆计算起来要简单很多。对于旋转矩阵 R, 取逆的过程相当于取它的转置 R‐1=RT。 对于上述, 它的反变换写为:

    经过上述过程就可以将矩阵的平移与旋转用一个4×4的矩阵表示了

     

     

     

    展开全文
  • ArcBall二维控制三维旋转

    千次阅读 2012-11-15 15:56:34
    ArcBall二维控制三维旋转 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了。ArcBall是一种将二维鼠标位置的变化映射到三维物体旋转的方法,让用户通过很直观的方法控制物体旋转。 网上相关...

    ArcBall二维控制三维旋转

    由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了。ArcBall是一种将二维鼠标位置的变化映射到三维物体旋转的方法,让用户通过很直观的方法控制物体旋转。

    网上相关方法还是不少的,包括:

    http://rainwarrior.thenoos.net/dragon/arcball.html

    http://nehe.gamedev.net/tutorial/arcball_rotation/19003/

    当然,Nehe的例子还是一如既往地很难看懂,总觉得搞竞赛啊算法很好的人代码可读性太差了,可能是追求敲代码的效率吧,苦了读者了。

     

    我觉得说得最清楚的是这个http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball

    下面从头说一下ArcBall的思想。

    一言以蔽之,就是把屏幕看成一个球,拖动鼠标就是在转动这个球。

    对照http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball的四个步骤:

    1. 首先把按下鼠标和拖动鼠标的坐标记为Q1,Q2,x和y分别按屏幕大小缩放到[-1, 1]。如:Q1(100, 500), Q2(800, 600),屏幕大小1000x800。则缩放后得到的P1(-0.8, -0.25), P2(0.6, -0.5)。之所以做这个映射完全是为了方便以后的计算,就是Nehe说的Happy Coinsidence~

    C++语言: 高亮代码由发芽网提供 // map (x, y) to [-1.0, 1.0]
    vec . x = 2.0 * x / width - 1.0;
    // y is set to be opposite since the coordinates of screen and
    // opengl are different
    vec . y = 1.0 - 2.0 * y / height;

    2. 把二维坐标转成三维的,这部是最关键的。现在我们可以把屏幕看成一个xyz都是[-1, 1]的球体了,球心在(0, 0, 0)处。

    比如A和B是两个鼠标映射后的点,从前视图看,A在球“上”(这里正确的理解是球壳上,而不是球体内部);B在球体外部。之所以说A在球壳上,是我们人为假设的,就是为了要对应到球体的转动。既然A在球壳上,我们就根据x,y值求的对应的z值(x、y、z的平方和是1,因为在球壳上);对B而言,我们把它“就近迁移”到球壳上,那么球壳上离B最近的点是什么呢?从正视图看应该是这样的:

    所以我们认为C点的z坐标是0。

    所以三维坐标的计算方法:

    C++语言: 高亮代码由发芽网提供 double square = vec . x * vec . x + vec . y * vec . y;
    if ( square <= 1.0) {
        // if (x, y) is within the circle of radius 1
        // calculate z so that the modulus of vector is 1
        vec . z = qSqrt( 1.0 - square);
    } else {
        // if is out of the circle, do nomarlization
        // this vector is the nearest position on the circle
        // so that z is 0
        double length = qSqrt( square);
        vec . x /= length;
        vec . y /= length;
        vec . z = 0.0;
    }

    3. 接下来求旋转角。我们知道向量A点乘向量B=|A||B|cos(alpha)其中alpha是向量夹角。根据前两步,我们能得到鼠标按下的位置A和拖动时当前位置在球上的坐标B,现在我们想求出向量OA和OB的夹角。那么Happy Coinsidence就来了,因为球的半径是1,所以|OA|=|OB|=1。那么alpha=arccos(A和B的点积)。

    C++语言: 高亮代码由发芽网提供 double ArcBall :: getRotateAngle( Vector3d vec1 , Vector3d vec2)
    {
        return qAcos( vec1 . dotProduct( vec2));
    }

    4. 我们知道glRotatex需要三个参数:一个旋转角和一个旋转轴对应的三个坐标。所以接下去我们就要求旋转轴。既然刚刚点积发挥过作用了,这次我们就要让叉乘出出风头了。向量A和B叉乘的结果是它们所在平面的法向量,也就意味着就是我们要求的旋转轴了。

    有了旋转角和旋转轴,是不是glRotatex一下就解决了?

    但是由于我们只计算了鼠标按下的位置和当前鼠标位置的旋转效果,所以上一次旋转的效果在第二次按下鼠标时就消失了。记录下每次的旋转角和旋转轴显然不是一个好办法,因为旋转次数多了以后每帧都要调用非常多的glRotatex显然不合适。所以我们记录下每次旋转的旋转矩阵,然后利用矩阵乘法达到累积旋转的效果。

    已知旋转角和旋转轴求旋转矩阵的方法是:http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle

    网上也有很多别的地方有这个公式,但是实际的效果却是翻转的,我百思不得其解,今天试了一下把这个矩阵转置一下,竟然对了,但是不知道是什么原因,是不是右手系的关系。

    到这里,我们就解决用ArcBall二维控制三维旋转了。

     

    下面来说一说几个记录旋转量不同的方法:

    1.旋转角和旋转轴:绕某个轴旋转某个角度

    旋转矩阵:

     

    2.欧拉角:分别绕三轴旋转的角度,注意是绕轴三次旋转,而不是一次。就好像在说,先绕y轴转30度,再绕x轴旋转20度,再绕z轴旋转50度。用glRotatex的话,需要用三次。旋转的顺序也是有关的,而且万一选择不好,会造成万向锁现象。

    旋转矩阵:

     

    3. 至于四元数,我自己也没搞清楚,就不瞎掰了……



    展开全文
  • opencv二维坐标转三维坐标

    千次阅读 2018-08-17 14:36:35
    一个是cvPerspectiveTransform(序列点),还有一个函数 是cvReprojectImageTo3D(操作整幅图像)的 ,可以将图像上的二维坐标转换为三维坐标

    一个是cvPerspectiveTransform(序列点),还有一个函数 是cvReprojectImageTo3D(操作整幅图像)的 ,可以将图像上的二维坐标转换三维坐标

    展开全文
  • opengl的三维二维转换

    千次阅读 2015-09-28 20:32:37
    实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念):  第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。...
    实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念): 
    第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。 
    第二步,将三维物体放在适当的位置(模型变换,Modeling Transformation)。 
    第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation)。 
    第四步,决定二维像片的大小(视口变换,Viewport Transformation)。 

    这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。


    (一)视点变换

      视点变换确定了场景中物体的视点位置和方向,就向上边提到的,它象是在场景中放置了一架照相机,让相机对准要拍摄的物体。确省时,相机(即视点)定位在坐标系的原点(相机初始方向都指向Z负轴),它同物体模型的缺省位置是一致的,显然,如果不进行视点变换,相机和物体是重叠在一起的。

      执行视点变换的命令和执行模型转换的命令是相同的,想一想,在用相机拍摄物体时,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点变换;另外,我们也可以保持相机的固定位置,将物体移离相机,这就相当于模型转换。这样,在OpenGL中,以逆时针旋转物体就相当于以顺时针旋转相机。因此,我们必须把视点转换和模型转换结合在一起考虑,而对这两种转换单独进行考虑是毫无意义的。
    除了用模型转换命令执行视点转换之外,OpenGL实用库还提供了gluLookAt()函数,该函数有三个变量,分别定义了视点的位置、相机瞄准方向的参考点以及相机的向上方向。该函数的原型为:

    void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);


      该函数定义了视点矩阵,并用该矩阵乘以当前矩阵。eyex,eyey,eyez定义了视点的位置,eye表示我们眼睛在"世界坐标系"中的位置,;centerx、centery和centerz变量指定了参考点的位置,center表示眼睛"看"的那个点的坐标,可简单理解为视线的终点,该点通常为相机所瞄准的场景中心轴线上的点;upx、upy、upz变量指定了向上向量的方向,up坐标表示观察者本身的方向,如果将观察点比喻成我们的眼睛,那么这个up则表示我们是正立还是倒立异或某一个角度在看,所看的影像大不相同,。

    OpenGL与渲染管线有关的几个矩阵的形象解释 - 阿英 - Mr.Right

     

      通常,视点转换操作在模型转换操作之前发出,以便模型转换先对物体发生作用。场景中物体的顶点经过模型转换之后移动到所希望的位置,然后再对场景进行视点定位等操作。模型转换和视点转换共同构成模型视景矩阵。

    变换局部坐标系的函数——glLoadIdentity()与glTranslatef()和glRotatef()

    glLoadIdentity() --使用glLoadIdentity()使原点重新回到屏幕中心来

    将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
    1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
    2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
    3.中心左面的坐标值是负值,右面是正值。
       移向屏幕顶端是正值,移向屏幕底端是负值。
       移入屏幕深处是负值,移出屏幕则是正值。

    glTranslatef(x, y, z)

    其作用就是将你绘点坐标系的原点在当前原点的基础上平移一个(x,y,z)向量。物体是相对原点定义与绘制的,所以移动坐标原点就相当于物体的平移。将当前原点移动到(x,y,z)位置,既物体向左移动x,向上移动y,向前移动z。注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。

    glRotatef(angle, x, y, z)
    glRotatef(angle, x, y, z)也是对坐标系进行操作。旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。这里要注意物体如果不是在坐标原点,则不仅仅是简单的旋转。

      (二)模型变换

      模型变换是在模型坐标系中进行的。缺省时,物体模型的中心定位在世界坐标系的中心处。OpenGL在这个坐标系中,有三个命令,可以模型变换。

      1、模型平移

    glTranslate{fd}(TYPE x,TYPE y,TYPE z);


      该函数用指定的x,y,z值沿着x轴、y轴、z轴平移物体(或按照相同的量值移动局部坐标系)。

      2、模型旋转 

    glRotate{fd}(TYPE angle,TYPE x,TYPE,y,TYPE z);


      该函数中第一个变量angle制定模型旋转的角度,单位为度,后三个变量表示以原点(0,0,0)到点(x,y,z)的连线为轴线逆时针旋转物体。例如,glRotatef(45.0,0.0,0.0,1.0)的结果是绕z轴旋转45度。

      3、模型缩放

    glScale{fd}(TYPE x,TYPE y,TYPE z);


      该函数可以对物体沿着x,y,z轴分别进行放大缩小。函数中的三个参数分别是x、y、z轴方向的比例变换因子。缺省时都为1.0,即物体没变化。程序中物体Y轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。

      (三)投影变换 投影变换投影变换类似于选择相机的镜头

      经过模型视景的转换后,场景中的物体放在了所希望的位置上,但由于显示器只能用二维图象显示三维物体,因此就要靠投影来降低维数(投影变换类似于选择相机的镜头)。

      事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终进入图像的只是视景体内的有关部分。投影包括透视投影(Perspective Projection)和正视投影(Orthographic Projection)两种。

      透视投影,符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被进行切割过的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。

      OpenGL透视投影函数有两个,其中函数glFrustum()的原型为:

    void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

    打通OpenGL之任督二脉---勿在浮沙筑高台 - 阿英 - Mr.Right

     


      它创建一个透视视景体。其操作是创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵。这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。

    另一个透视函数是:

    void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);

    打通OpenGL之任督二脉---勿在浮沙筑高台 - 阿英 - Mr.Right

     


      它也创建一个对称透视视景体,但它的参数定义于前面的不同,参数fovy定义视野在X-Z平面的角度,范围是[0.0, 180.0]。fovy这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔;参数aspect是投影平面宽度与高度的比率,就是实际窗口的纵横比,即x/y如16:9,4:3等;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。以上两个函数缺省时,视点都在原点,视线沿Z轴指向负方向。
    再解释下那个"眼睛睁开的角度fovy"是什么意思,首先假设我们现在距离物体有50个单位距离远的位置,在眼睛睁开角度设置为45时,我们可以看到,在远处一个球,现在我们将眼睛再张开点看,将"眼睛睁开的角度"设置为178(180度表示平角,那时候我们将什么也看不到,眼睛睁太大了,眼大无神)我们只看到一个点,,,,,,,,,,,,,,,,,,,,,,,,,,,因为我们看的范围太大了,这个球本身大小没有改变,但是它在我们的"视界"内太小了,
    反之,我们将眼睛闭小些,改为1度看看会出现什么情况呢?在我们距离该物体3000距离远,"眼睛睁开的角度"为1时,我们似乎走进了这个球内,这个是不是类似于相机的焦距?当我们将"透视角"设置为0时,我们相当于闭上双眼,这个世界清静了,我们什么也看不到,,,,,,,,,

      正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图五所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。

    OpenGL正射投影函数也有两个,一个函数是:

    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far)

    打通OpenGL之任督二脉---勿在浮沙筑高台 - 阿英 - Mr.Right

     


      它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。

      另一个函数是:

    void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)


      它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。
    (四)视口变换。视口变换就是将视景体内投影的物体显示在二维的视口平面上。
              运用相机模拟方式,我们很容易理解视口变换就是类似于照片的放大与缩小。在计算机图形学中,它的定义是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的区域内,这个区域通常为矩形,称为视口。OpenGL中相关函数是:

    glViewport(GLint x,GLint y,GLsizei width, GLsizei height);


      这个函数定义一个视口。函数参数(x, y)是视口在屏幕窗口坐标系中的左下角点坐标,参数width和height分别是视口的宽度和高度。缺省时,参数值即(0, 0, winWidth, winHeight) 指的是屏幕窗口的实际尺寸大小。所有这些值都是以象素为单位,全为整型数。

      (五)裁剪变换

    注意:OpenGL中的物体坐标一律采用齐次坐标,即(x, y, z, w),故所有变换矩阵都采用4X4矩阵。一般说来,每个顶点先要经过视点变换和模型变换,然后进行指定的投影,如果它位于视景体外,则被裁剪掉。最后,余下的已经变换过的顶点x、y、z坐标值都用比例因子w除,即x/w、y/w、z/w,再映射到视口区域内,这样才能显示在屏幕上。

      在OpenGL中,除了视景体定义的六个裁剪平面(上、下、左、右、前、后)外,用户还可自己再定义一个或多个附加裁剪平面,以去掉场景中无关的目标。附加平面裁剪函数为:

      1、void glClipPlane(GLenum plane,Const GLdouble *equation);

      函数参数equation指向一个拥有四个系数值的数组,这四个系数分别是裁剪平面Ax+By+Cz+D=0的A、B、C、D值。因此,由这四个系数就能确定一个裁剪平面。参数plane是GL_CLIP_PLANEi(i=0,1,...),指定裁剪面号。

      在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi),使得当前所定义的裁剪平面有效;当不再调用某个附加裁剪平面时,可用glDisable(GL_CLIP_PLANEi)关闭相应的附加裁剪功能。


    展开全文
  • php三维数组转二维数组

    千次阅读 2017-12-05 21:40:15
    //循环遍历三维数组$arr3 foreach($result as $value){  foreach($value as $v){  $arr2[]=$v;  } } //销毁$arr3  unset($result,$value,$v); echo ...
  • 1、二维卷积 将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。 输出维度=(输入维度-滤波器维度)/步长+1 2、一维卷积 3、通道 3.1若输入数据的通道数为3则 3.2...
  • 空间坐标转化——三维转二维

    万次阅读 2018-11-19 20:22:00
    最近在做项目的时候,遇到一个问题,这个问题的其中一个解决思路中用到了三维坐标转化成二维坐标。经过一段时间的研究,终于想出了解决方法。 预备知识: 空间平面表达式: Ax+By+Cz+d =0 空间直线表达式:(x-x0)...
  • 3dMax第三章:二维转三维图形创建 1.学习了三维图形的创建以后,我们接下来将对二维图形进行三维创建。常见的命令包括挤出、倒角、车削、倒角抛面、放样。挤出类似于给你一个横截面,你指定一下物体的高量即可以。...
  • numpy矩阵的叠加(二维转三维

    千次阅读 2020-03-30 13:16:44
    np.vstack:按垂直方向(行...一般文章都没有说明np.dstack 函数,也就是第个轴的叠加 比如 one = np.ones((3, 3)) two = np.ones((3, 3)) thr = np.dstack((one, two)) print(thr.shape) >> (3,3,2) ...
  • Matlab将二维图像三维重构

    热门讨论 2010-06-06 10:49:19
    Matlab将二维图像三维重构源代码,把下面的代码写成m文件,运行就可以了。具体你要看到什么样的三维模型,你可以在此基础上修改。
  • ``图里面是几个箭头,使其绕y轴旋转...(但是旋转的体是躺着的 还得把它 90°) 代码如下: %角动量空间量子化的模型 clear %清除变量 l=input(‘请输入角量子数:’); %键盘输入角量子数 L=sqrt(l*(l+1)); ...
  • python 二维矩阵转三维矩阵

    万次阅读 2018-10-09 21:58:26
    &gt;&gt;&gt; import numpy as np &gt;&gt;&gt; a = np.arange(12).reshape(3,4) &gt;&gt;&gt; a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) ...clas...
  • Matlab二维三维作图

    千次阅读 多人点赞 2019-01-23 08:19:05
    二维作图命令 MATLAB 中最常用也是最基本二维作图命令为plot, plot函数针对向量或矩阵的列来绘制曲线的. 调用plot函数的常用格式有以下几种 • plot(x): 当x为一向量时, 以x元素的值为纵坐标, x的序号为横坐标值...
  • CAD三维多线段转二维

    千次阅读 2017-08-10 16:42:59
    三维矿业软件切剖面形成的轮廓线多为三维多段线,为便于在CAD进行进一步优化处理,需二维属性!尤其是将该线用于ANSYS建模时,对线的属性要求跟高,务必保证纤维二维的,方可准确建立ansys模型!
  • 序:上两节我们介绍了复数的基本概念与性质,以及复数与二维旋转的关系。 三维旋转四元数系列(0.复数基本介绍)https://blog.csdn.net/SKANK911/article/details/90033451 三维旋转四元数系列(1.复数与二维旋转...
  • 将shp三维二维

    千次阅读 2020-04-22 16:44:56
    将shp三维二维面,介绍一下两种方法,一种使用arcmap,另一种使用supermap。 一、arcmap 将已有的三维shapefile导入ArcMap。 打开ArcToolbox,Data Management Tools > Feature Class > Create Feature ...
  • 纬地6.8怎么把二维地形图转三维地形图,求大神!具体步骤是什么
  • 【基础建模】二维转三维学习笔记

    千次阅读 2016-01-01 15:58:02
    二维转三维命令 挤出(Extrude):使封闭的二维图形产生厚度。 倒角(Bevel):跟“挤出”非常相似,不过多一个倒角。挤出只有高度变化 ,倒角 会在挤出的基础上进行角度改变,产生倾斜的斜角。 车削(Lathe...
  • 1、matlab二维转换为三维矩阵 这里用到reshape函数 格式为AA1=reshape(A1,[行,列,页]) 如下所示 A1=[2 2 2 2 2.5 2.5 2.5 2.5 1.8 1.8 1.8 1.8 2.2 2.2 2.2 2.2 2 2 2 2 1.8 1.8 1.8 1.8 2.1 2.1 2.1 2.1 2 2 2 2 ...
  • 【Proe】三维模型转二维CAD图

    千次阅读 2021-02-04 18:32:22
    前言:好久没摸proe了,好多...2. 三维模型转二维cad   画好三维模型之后,先取消平面坐标系基准轴线等的视图显示,然后新建-绘图,取消默认缺省,标准大小即设置图纸的大小,随后在空白界面按住右键不松,插入普通视
  • 第四部分 c#中应用微软office的excel实现各种二维三维图形 第9章 应用程序中的excel图表 600 9.1 excel和c#间的互操作 600 9.2 c#应用程序中的excel图表示例 602 9.2.1 excel图表对象模型 602 9.2.2 创建独立...
  • 简介:建立三维人脸模型 -> 参数化人脸生成 -> 从单张人脸的二维照片,利用三维人脸模型,重建三维人脸 -> 三维人脸参数化识别 1. 根据三维人脸的点云数据库,建立三维人脸模型 (高维向量人脸空间...
  • 今天在做GAN实验的时候,需要将原本的三维图像中第三维去掉。方便后续可视化相关的处理。 举例来说,原本是image.shape=(255,255,1),灰度图第三维占位。转换成imageNew = (255, 255). 网上找了一些方法,贴出两种...
  • JAVA基础之二维数组三维数组及应用

    千次阅读 2018-01-05 19:17:19
    描述:该二维数组中有个一维数组 每一个一维数组中有4个元素 打印二维数组的长度 相当于打印数组中有多少个一维数组 System.out.println(array.length); 结果为:3 System.out.println(array[0].leng...
  • 实习第一个任务其中的一个小步骤是将三维点云转换成二维图像,今天刚好复习PCL的点云滤波部分,发现了一个具有类似功能的平面模型投影滤波——ModelCoefficients 平面参数模型的形式是:ax+by+cz+d=0 其中的a、b、...
  • 1.二维 矩形区域内布满了随机分布的点,这些点在此矩形区域内随机运动。最初某个点是红色的,区域点是蓝色的。当一个红色的点和蓝色的点的距离小于某个门限值时,蓝色的点以一定的概率变成红色。 要求动态可视化...
  • matlab二维图形绕轴旋转成三维图形

    千次阅读 2019-07-09 00:40:43
    前言 帮妹妹画图,网上搜了半天才找到一个好用的,记录一下备用。 ...食用方法 我的x-y图形想要绕y轴...再通过乘以角度找到三维情况的x,y,z坐标。 例子 代码 x = linspace(0, 5, 5000).'; z = linspace(0, 0, 5000)....
  • ARCGIS Pro如何实现已入库二维数据生成三维模型二维要素是否带高程Z判断如何判断要素是否带有高程Z信息 :二维要素进行三维的展示二维要素生成三维模型 常规状态下已入库的数据一般是二维的点面线数据,有时需要进行...
  • MATLAB对一个二维矩阵画三维

    万次阅读 2019-03-14 12:25:04
    1 准备好二维矩阵,比如我这有个3x16的矩阵叫SFW1 2 画三维图,一句代码就OK mesh(SFW1) 3 结果如下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 568,184
精华内容 227,273
关键字:

二维转三维是什么意思