精华内容
下载资源
问答
  • 三维变换

    2017-08-09 10:22:38
    三维变换 齐次坐标 齐次坐标,就是在传统坐标后面加入一维变量:C -> (C, W)。在三维空间中,它把三维坐标(X, Y, Z)提升到了四维的射影空间中(X, Y, Z, W),对应的线性变换就是射影变换。齐次坐标转回三维空间...

    三维变换

    齐次坐标

    齐次坐标,就是在传统坐标后面加入一维变量:C -> (C, W)。在三维空间中,它把三维坐标(X, Y, Z)提升到了四维的射影空间中(X, Y, Z, W),对应的线性变换就是射影变换。齐次坐标转回三维空间坐标分两种情况,如果W为0,则(X, Y, Z)表示三维空间中的一个方向,如果W不为0,则对应的三维点坐标为(X/W, Y/W, Z/W)。齐次坐标表示有两个好处:一个是可以区分向量和点,另一个是齐次坐标下的矩阵可以表示平移变换。

    透视变换:一般的射影变换是一个4X4的矩阵变换,如下图1所示,它可以表示射影空间中任意的线性变换,如透视变换。 仿射变换:如果把矩阵元素做一些限制到下图2,则为一个仿射变换。它可以表示三维空间中任意的线性变换。 刚体变换:如果把图2的a元素的矩阵块限制为正交矩阵块r,如下图3所示,它就变成了一个刚体变换。它可以表示旋转变换和平移变换。transform matrix

    四元数

    四元数是二维空间的复数x + y * i在四维空间的推广x * i + y * j + z * k + w。复数可以很方便的表示二维空间的旋转变换,很自然的,人们想把它推广到三维空间,比如x * i + y * j + z。但是人们尝试过各种三维推广后,都失败了,主要原因是三维的复数不能满足代数上的一些性质。后来,爱尔兰数学家Hanmilton把复数成功推广到四维空间,也就是四元数:x * i + y * j + z * k + w,其中i * i = -1,j * j = -1,k * k = -1。四元数可以方便的表示三维空间中绕任意轴旋转的变换。所以,我们常用它来计算三维空间的旋转变换,只是一种计算方法而已。


    欧拉角

    欧拉角可以用于描述三维旋转变换。它将旋转分解成分别绕三个坐标轴旋转一定角度的组合。如下面的旋转可以分解为:R = Rz(a) * Rx(b) * Ry(r)

    eular angle

    在一些应用领域,也常用yaw, pitch, roll来表示绕坐标轴的旋转,如图所示:

    eular angle
    展开全文
  • 三维变换矩阵第六章 三维变换和投影 本章内容 6.1 三维几何变换 6.2 三维基本几何变换矩阵 6.3 三维复合变换 6.4 平行投影 6.5 透视投影 6.6 本章小结 6.7 习题 6.1 三维几何变换 6.1.1 三维变换矩阵 6.1.2 三维几何...

    三维变换矩阵

    第六章 三维变换和投影 本章内容 6.1 三维几何变换 6.2 三维基本几何变换矩阵 6.3 三维复合变换 6.4 平行投影 6.5 透视投影 6.6 本章小结 6.7 习题 6.1 三维几何变换 6.1.1 三维变换矩阵 6.1.2 三维几何变换 6.1.1 三维变换矩阵 同二维变换一样,三维变换同样引入了齐次坐标技术。 在定义了规范化齐次坐标以后,图形变换就可以表示为图形顶点集合的规范化齐次坐标矩阵与某一变换矩阵相乘的形式。 用规范化齐次坐标表示的三维图形基本几何变换矩阵是一个4×4方阵,简称为三维变换矩阵。 三维变换矩阵 6.1.2 三维几何变换 对于线框模型的变换,通常是以点变换为基础。 三维几何变换的基本方法是把变换矩阵作为一个算子,作用到变换前的图形顶点集合的规范化齐次坐标矩阵上,得到变换后新的图形顶点集合的规范化齐次坐标矩阵。连接变换后的新的图形顶点,可以绘制出变换后的三维图形。 6.2 三维基本几何变换矩阵 三维基本几何变换是指将点从一个坐标位置变换到另一个坐标位置 的过程。 三维基本几何变换和二维基本几何变换一样是相对于坐标原点和坐标轴进行的几何变换,包括平移、比例、旋转、反射和错切5种变换。 因为三维变换矩阵的推导过程和二维变换矩阵的推导过程类似,这里只给出结论。 6.2 三维基本几何变换矩阵 6.2.1 平移变换 6.2.2 比例变换 6.2.3 旋转变换 6.2.4 反射变换 6.2.5 错切变换 6.2.1 平移变换 void CTestView::OnMENU3D()//绘制立方体 { // TODO: Add your command handler code here RedrawWindow(); ReadCube(); DrawCube(); } void CTestView::ReadCube()//读入立方体顶点 { //后面的三维坐标 int a=100;//a为立方体边长 P3D[0][0]=0;P3D[0][1]=0;P3D[0][2]=0;P3D[0][3]=1;//A点(0,0,0) P3D[1][0]=0;P3D[1][1]=a;P3D[1][2]=0;P3D[1][3]=1;//B点(0,a,0) P3D[2][0]=0;P3D[2][1]=a;P3D[2][2]=a;P3D[2][3]=1;//C点(0,a,a) P3D[3][0]=0;P3D[3][1]=0;P3D[3][2]=a;P3D[3][3]=1;//D点(0,0,a) //前面的三维坐标 P3D[4][0]=a;P3D[4][1]=0;P3D[4][2]=0;P3D[4][3]=1;//E点(a,0,0) P3D[5][0]=a;P3D[5][1]=a;P3D[5][2]=0;P3D[5][3]=1;//F点(a,a,0) P3D[6][0]=a;P3D[6][1]=a;P3D[6][2]=a;P3D[6][3]=1;//G点(a,a,a) P3D[7][0]=a;P3D[7][1]=0;P3D[7][2]=a;P3D[7][3]=1;//H点(a,0,a) } void CTestView::DrawCube()//绘制立方体 { CPoint p[4];//定义多边形顶点数组 Transform3DTo2D(P3D,P2D,8); //绘制立方体左面 p[0]=CPoint(ROUND(MaxX/2+P2D[0][0]),ROUND(MaxY/2+P2D[0][1])); p[1]=CPoint(ROUND(MaxX/2+P2D[3][0]),ROUND(MaxY/2+P2D[3][1])); p[2]=CPoint(ROUND(MaxX/2+P2D[7][0]),ROUND(MaxY/2+P2D[7][1])); p[3]=CPoint(ROUND(MaxX/2+P2D[4][0]),ROUND(MaxY/2+P2D[4][1])); Line(p); //绘制立方体后面 p[0]=CPoint(ROUND(MaxX/2+P2D[0][0]),ROUND(MaxY/2+P2D[0][1])); p[1]=CPoint(ROUND(MaxX/2+P2D[1][0]),ROUND(MaxY/2+P2D[1][1])); p[2]=CPoint(ROUND(MaxX/2+P2D[2][0]),ROUND(MaxY/2+P2D[2][1])); p[3]=CPoint(ROUND(MaxX/2+P2D[3][0]),ROUND(MaxY/2+P2D[3][1])); Line(p); //绘制立方体底面

    展开全文
  • 计算机图形学三维变换
  • 在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法。 一、  二维变换: UIElement.RenderTransform  a、TranslateTransform,平移:  属性...

    在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法。

    一、

      二维变换:

     UIElement.RenderTransform

      a、TranslateTransform,平移:

        属性:X,Y我相信大家都知道怎么用,这里就不讲废话了

      b、RotateTransform,旋转:

        属性:Angle

      c、ScaleTransform,缩放:

        属性:ScaleX,ScaleY

      d、SkewTransform,扭曲:

        属性:AngleX,AngleY

      e、MatrixTransform,矩阵变换

        Xmal用法:

    <MatrixTransform Matrix="M11 M12 M21 M22 X Y">

        这个就稍微复杂一点,理论上可以做任何变换。说起来复杂,其实也就是一个变换矩阵而已

    矩阵M:

    M11 M12 0
    M21 M22 0
      X   Y 1

    我想,学过线性代数的应该都知道了吧,就是矩阵的乘法;假设点p0(x0,y0),则变换后的点为p1=[x0,y0,1]*M:

        x1 =  x0 * M11 + x0 * M21 + X ;

        y1 = y0 * M12 + y0 * M22 + Y;

      p1(x1,y1).

    ps:矩阵的点乘简单的说就是行*列相加,也就是说假如矩阵X点乘Y,则X的列数必须等于Y的行数。

    额外的,如果需要同时做多种变换,UWP提供了两种方法:

      1.TransformGroup,变换群组:

        

               <TransformGroup>
                        <RotateTransform />
                        <ScaleTransform />
                    </TransformGroup>

    因为在RenderTransform下只能有一个子元素,所以当需要同时用多种变换时需要一个TransfromGroup。

      2.CompositeTransform,复合变换:

        属性:TranslateX,TranslateY,Rotate等

    需要注意的是,变换是需要一个中心点的,这里UWP提供了两种设置中心点的方法:

      1.RenderTransformOrigin:

        这个属性为需要变换的控件的属性而非RenderTransform的属性,其值为Point(x,y).在控件内的值为0-1,大于1时,变换中心将处于控件外甚至布局之外。

      2.CenterX,CenterY:

        设置绝对X轴和Y轴的值,这里为绝对值而非相对值。

      建议使用前者。在大多数情况下,我们并不知道控件的具体大小,而前者使用的是相对值所以无论是代码量还是计算量都要优于后者。

    二、

      三维变换:

     UIElement.Projection

      a、PlaneProjection

        属性:CenterOfRotationX,CenterOfRotationY,CenterOfRotationZ; 旋转的中心点 P(x,y,z)

             GlobalOffsetX,GlobalOffsetY,GlobalOffsetZ; 世界坐标系的平移

             LocalOffsetX,LocalOffsetY,LocalOffsetZ; 局部坐标系

             RotationX,RotationY,RotationZ; 分别绕X,Y,Z轴的旋转角度

    如果不明白为什么有两个坐标系,参照 《三维图形系统中两种坐标系之间的坐标变换

      b、Matrix3DProjection

        Xaml用法:

    <Matrix3DProjection  ProjectionMatrix=    "M11,M12,M13, 0,
                                                  M21,M22,M23, 0,
                                                  M31,M32,M33, 0,
                                                   X , Y , Z , 1"/>

     

        和上面二维矩阵变换类似,只是增加了一个维度而已:

    矩阵M:

    M11 M12 M13 0
    M21 M22 M23 0
    M31 M32 M33 0
    X  Y Z 1


      设点 p0(x0,y0,z0),则变换后的点为:p1=[x0,y0,z0,1]*M

        x1=x0*M11+x0*M21+x0*M31+1*X;

        y1=y0*M12+y0*M22+Y0*M32+1*Y;

        z1=z0*M13+z0*M23+z0+M33+1*Z;

      p1(x1,y1,z1).

    好了,基本讲完了,如果你说矩阵部分还是没看懂,我只能说你真的需要学习了。

    转载于:https://www.cnblogs.com/Yixin-ran/p/6088654.html

    展开全文
  • 三维变换概述

    2015-04-22 20:59:00
    三维变换概述 原文三维变换概述 本主题描述如何向 Windows Presentation Foundation (WPF) 图形系统中的三维模型应用变换。开发人员可以借助于变换功能来对模型进行重定位、调整大小和重定向,而...

    原文 三维变换概述

    本主题描述如何向 Windows Presentation Foundation (WPF) 图形系统中的三维模型应用变换。 开发人员可以借助于变换功能来对模型进行重定位、调整大小和重定向,而无需更改用来定义模型的基值。

     

    本主题包括下列各节。

    • 三维坐标空间
    • 变换模型
    • 平移变换
    • 缩放变换
    • 旋转变换
    • 使用变换集合
    • 对变换进行动画处理
    • 相关主题

    Windows Presentation Foundation (WPF) 中的三维图形内容封装在 Viewport3D 元素中,该元素可以参与二维元素结构。 该图形系统将 Viewport3D 视为一个像 Windows Presentation Foundation (WPF) 中的许多其他元素一样的二维可视化元素。 Viewport3D 充当三维场景中的一个窗口(视区)。 更准确地说,它是三维场景所投影到的图面。 尽管可以将 Viewport3D 与其他二维绘图对象用在同一个场景关系图中,但是不能在 Viewport3D 中渗透二维和三维对象。 以下讨论中所描述的坐标空间包含在 Viewport3D 元素中。

    二维图形的 Windows Presentation Foundation (WPF) 坐标系将原点定位在呈现图面(通常是屏幕)的左上角。 在二维系统中,x 轴上的正值朝右增加,y 轴上的正值朝下增加。 但是,在三维坐标系中,原点位于屏幕的中心,x 轴上的正值朝右增加,但是 y 轴上的正值朝上增加,z 轴上的正值从原点向外朝向观察者增加。

    坐标系比较

    坐标系

    由这些轴定义的空间是三维对象在 Windows Presentation Foundation (WPF) 中的固定参考框架。 当您在该空间中生成模型并创建光源和照相机以查看这些模型时,一定要在向每个模型应用变换时,将固定参考框架或“全局空间”与您为该模型创建的局部参考框架区分开。 另请记住,根据光源和照相机设置,全局空间中的对象可能会看上去完全不同或者根本不可见,但是照相机的位置不会改变对象在全局空间中的位置。

    当您创建模型时,它们在场景中具有特定的位置。 为了在场景中移动、旋转这些模型或者更改这些模型的大小而更改用来定义模型本身的顶点是不切实际的。 相反,正如在二维对象中一样,您可以向模型应用变换。

    每个模型对象都有一个可用来对模型进行移动、重定向或调整大小的 Transform 属性。 当您应用变换时,实际上是按照由变换功能指定的向量或值(以适用者为准)来偏移模型的所有点。 换言之,您已经变换了在其中定义模型的坐标空间(“模型空间”),但是,您尚未更改在整个场景的坐标系(“全局空间”)中构成模型几何形状的值。

    三维变换继承自抽象基类 Transform3D;这些变换包括仿射变换类 TranslateTransform3DScaleTransform3D 和 RotateTransform3D Windows Presentation Foundation (WPF) 三维系统还提供一个 MatrixTransform3D 类,使用该类,可以用更简明的矩阵操作来指定同样的变换。

    TranslateTransform3D 沿着您用 OffsetXOffsetY 和 OffsetZ 属性指定的偏移向量所指示的方向来移动 Model3D 中的所有点。 例如,假设立方体的一个顶点位于 (2,2,2),则偏移向量 (0,1.6,1) 会将该顶点 (2,2,2) 移到 (2,3.6,3)。 该立方体的顶点在模型空间中仍位于 (2,2,2),但是现在,该模型空间与世界空间的关系已经发生改变,因此,模型空间中的 (2,2,2) 是世界空间中的 (2,3.6,3)。

    带有偏移的平移

    平移图

    下面的代码示例演示如何应用平移。

     
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
      <DockPanel>
        <Viewbox>
          <Canvas Width="600" Height="201">
    
            <!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
            <Viewport3D Name="MyAnimatedObject"
              ClipToBounds="True" Width="600" Height="150"
              Canvas.Left="0" Canvas.Top="10">
    
              <!-- Defines the camera used to view the 3D object. -->
              <Viewport3D.Camera>
                <PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1" 
                 FieldOfView="60" />
              </Viewport3D.Camera>
    
              <!-- The ModelVisual3D children contain the 3D models -->
              <Viewport3D.Children>
    
                <!-- This ModelVisual3D defines the light cast in the scene. Without light, the
                     3D object cannot be seen. -->
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
                  </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <GeometryModel3D>
    
                      <!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
                      <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                         TriangleIndices="0,1,2 3,4,5 "
                         Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
                         TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
                         Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
                      </GeometryModel3D.Geometry>
    
                      <!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
                      <GeometryModel3D.Material>
                        <MaterialGroup>
                          <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                              <SolidColorBrush Color="Cyan" Opacity="0.3"/>
                            </DiffuseMaterial.Brush>
                          </DiffuseMaterial>
                        </MaterialGroup>
                      </GeometryModel3D.Material>
                      <!-- The Transform specifies how to transform the 3D object. The OffsetX property is animated
                           in the Storyboard below. -->
                      <GeometryModel3D.Transform>
                        <TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" />
                      </GeometryModel3D.Transform>
                    </GeometryModel3D>
                  </ModelVisual3D.Content>
                </ModelVisual3D>
              </Viewport3D.Children>
              <!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
              <Viewport3D.Triggers>
                <EventTrigger RoutedEvent="Viewport3D.Loaded">
                  <BeginStoryboard>
                    <Storyboard>
    
                      <!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
                      <DoubleAnimation
                       Storyboard.TargetName="myTranslateTransform3D" 
                       Storyboard.TargetProperty="OffsetX" 
                       To="-0.8" 
                       AutoReverse="True" RepeatBehavior="Forever" />
    
                      <!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
                           respectively. -->
    
                    </Storyboard>
                  </BeginStoryboard>
                </EventTrigger>
              </Viewport3D.Triggers>
            </Viewport3D>
          </Canvas>
        </Viewbox>
      </DockPanel>
    </Page>
    
    
    

    ScaleTransform3D 沿着指定的缩放向量,相对于中心点来更改模型的比例。 可以指定等比缩放,即在 X、Y 和 Z 轴上将模型缩放同样的值来按比例更改模型的大小。 例如,将该变换的 ScaleXScaleY 和 ScaleZ 属性设置为 0.5 会将此模型二等分;将这些属性设置为 2 会将此模型在所有这三个轴上的值放大一倍。

    ScaleVector 示例

    统一 ScaleTransform3D

    通过指定非等比变换(X、Y 和 Z 值不相等的缩放变换),可以使模型在一个或两个维度上拉伸或收缩,而不会影响其他维度。 例如,如果将 ScaleXScaleY 和 ScaleZ 分别设置为 1、2 和 1,则将导致变换模型的高度增加一倍,但是 X 和 Z 轴上的值仍保持不变。

    默认情况下,ScaleTransform3D 会导致顶点围绕原点 (0,0,0) 拉伸或收缩 但是,如果要变换的模型不是从原点绘制的,那么,在从原点缩放模型时,模型将不会“就地”缩放。相反,当模型的顶点与缩放向量相乘时,缩放操作对模型的平移和缩放都会产生影响。

    缩放中心示例

    在指定中心点的情况下缩放的三个立方体

    若要“就地”缩放模型,请通过设置 ScaleTransform3D 的 CenterXCenterY 和 CenterZ 属性来指定模型的中心。 这可确保图形系统缩放模型空间,然后平移该空间,使其在指定的 Point3D 上居中。 相反,如果模型是围绕原点生成的,而且您指定了一个不同的中心点,则将看到模型会背离原点平移。

    可以通过几种不同的方法来旋转三维模型。 典型的旋转变换指定一个轴以及围绕该轴的旋转角度。 使用 RotateTransform3D 类,可以用 Rotation 属性来定义 Rotation3D。 然后可以在 Rotation3D(在本例中为AxisAngleRotation3D)上指定 Axis 和 Angle 属性来定义变换。 下面的几个示例围绕 Y 轴将模型旋转 60 度。

     
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
      <DockPanel>
        <Viewbox>
          <Canvas Width="321" Height="201">
    
            <!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
            <Viewport3D Name="MyAnimatedObject"
              ClipToBounds="True" Width="150" Height="150"
              Canvas.Left="0" Canvas.Top="10">
    
              <!-- Defines the camera used to view the 3D object. -->
              <Viewport3D.Camera>
                <PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1" 
                 FieldOfView="60" />
              </Viewport3D.Camera>
    
              <!-- The ModelVisual3D children contain the 3D models -->
              <Viewport3D.Children>
    
                <!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
                     3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
                  </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
                  </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <GeometryModel3D>
    
                      <!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
                      <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                         TriangleIndices="0,1,2 3,4,5 "
                         Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
                         TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
                         Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
                      </GeometryModel3D.Geometry>
    
                      <!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
                      <GeometryModel3D.Material>
                        <MaterialGroup>
                          <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                              <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                                <LinearGradientBrush.GradientStops>
                                  <GradientStop Color="Yellow" Offset="0" />
                                  <GradientStop Color="Red" Offset="0.25" />
                                  <GradientStop Color="Blue" Offset="0.75" />
                                  <GradientStop Color="LimeGreen" Offset="1" />
                                </LinearGradientBrush.GradientStops>
                              </LinearGradientBrush>
                            </DiffuseMaterial.Brush>
                          </DiffuseMaterial>
                        </MaterialGroup>
                      </GeometryModel3D.Material>
    
                      <!-- The Transform specifies how to transform the 3D object. The properties of the
                            Rotation object are animated causing the 3D object to rotate and "wobble" (see Storyboard below).-->
                      <GeometryModel3D.Transform>
                        <RotateTransform3D>
                          <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
                          </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                      </GeometryModel3D.Transform>
                    </GeometryModel3D>
                  </ModelVisual3D.Content>
                </ModelVisual3D>
              </Viewport3D.Children>
    
              <!-- Trigger the rotation animation when the 3D object loads. -->
              <Viewport3D.Triggers>
                <EventTrigger RoutedEvent="Viewport3D.Loaded">
                  <BeginStoryboard>
                    <Storyboard>
    
                      <!-- This animation animates the Angle property of the AxisAngleRotation3D
                           making the 3D object rotate from -60 degrees to 60 degrees. -->
                      <DoubleAnimation 
                       Storyboard.TargetName="myAngleRotation" 
                       Storyboard.TargetProperty="Angle" 
                       From="-60" To="60" Duration="0:0:4" AutoReverse="True"  RepeatBehavior="Forever"/>
    
                      <!-- This animation animates the Axis property of the AxisAngleRotation3D
                           making the 3D wobble as it rotates. -->
                      <Vector3DAnimation 
                       Storyboard.TargetName="myAngleRotation" 
                       Storyboard.TargetProperty="Axis" 
                       From="0,3,0" To="1,0,1" Duration="0:0:4" AutoReverse="True"  RepeatBehavior="Forever"/>
    
                    </Storyboard>
                  </BeginStoryboard>
                </EventTrigger>
              </Viewport3D.Triggers>
            </Viewport3D>
          </Canvas>
    
        </Viewbox>
      </DockPanel>
    </Page>
    
    
    

    注意:Windows Presentation Foundation (WPF) 三维是一个右手系统,这意味着,如果旋转角度为正数,则将围绕该轴逆时针旋转。

    对于指定了轴和角度的旋转来说,如果没有为 RotateTransform3D 上的 CenterXCenterY 和 CenterZ 属性指定值,则假设围绕原点旋转。 与缩放时一样,一定要记住旋转时会变换模型的整个坐标空间。 如果模型不是围绕原点创建的,或者它以前经过平移,则旋转可能会围绕原点“转动”,而不是就地旋转。

    在指定了新中心的情况下旋转

    采用新中心点的旋转

    若要“就地”旋转模型,请将模型的实际中心指定为旋转中心。 由于几何形状通常是围绕原点建模的,因此,在依次执行下列操作时通常将获取一组预期的变换结果:调整模型大小(缩放该模型),然后设置模型方向(旋转该模型),最后将模型移到所需的位置(平移该模型)。

    旋转示例

    沿 x 轴和 y 轴旋转 60 度

    指定了轴和角度的旋转非常适于静态变换和某些动画。 但是,请考虑围绕 X 轴将立方体模型旋转 60 度,然后围绕 Z 轴将其旋转 45 度。 您可以将这种变换描述为两个离散的仿射变换,也可以将其描述为一个矩阵。 但是,对于按照这种方式定义的旋转,可能很难平滑地进行动画处理。 尽管按照这两种方法计算的模型起始位置和结束位置相同,但是,从计算的角度来看,该模型经过的中间位置是不确定的。 四元数提供了一种用来在旋转的起始位置和结束位置之间计算内插值的替代方法。

    四元数表示三维空间中的一个轴以及围绕该轴的旋转。 例如,四元数可以表示 (1,1,2) 轴以及 50 度的旋转角度。 四元数在定义旋转方面的价值在于可以针对它们执行的两个运算:合成和内插。 应用于一个几何形状的两个四元数的合成是指“围绕 axis2 将几何形状旋转 rotation2 度,然后围绕 axis1 将其旋转 rotation1 度”。通过使用合成运算,可以将应用于几何形状的两个旋转合成在一起,以便获得一个代表合成结果的四元数。 由于四元数内插可以计算出从一个轴和方向到另一个轴和方向的平滑而又合理的路径,因此您可以从原始位置到合成的四元数之间进行内插,以便实现从一个位置到另一个位置的平滑过渡,从而可以对该变换进行动画处理。 对于要进行动画处理的模型,可以通过针对 Rotation属性使用 QuaternionRotation3D 来为旋转指定目标 Quaternion

    在生成场景时,通常会向模型应用多个变换。 向 Transform3DGroup 类的 Children 集合中添加变换,从而方便地将多个变换组合在一起以应用于场景中的各种模型。 通常,可以很方便地在几个不同的组中重用某个变换,这与通过向每个实例应用一组不同的变换来重用模型大体相同。 请注意,将变换添加到该集合中的顺序至关重要:集合中的变换是按照从第一个到最后一个的顺序应用的。

    Windows Presentation Foundation (WPF) 三维实现与二维图形参与同一个计时和动画系统。 换言之,若要对三维场景进行动画处理,需要对其模型的属性进行动画处理。 可以直接对基元的属性进行动画处理,但是通常很容易对用来更改模型位置或外观的变换进行动画处理。 由于可以向 Model3DGroup 对象及其各个模型应用变换,因此可以向 Model3DGroup 的子级应用一组动画,向一组对象应用另一组动画。 有关 Windows Presentation Foundation (WPF) 计时和动画系统的背景信息,请参见动画概述演示图板概述

    若要对 Windows Presentation Foundation (WPF) 中的对象进行动画处理,可以创建时间线、定义动画(实际上是随着时间的推移而更改某个属性值)并指定要向其应用动画的属性。 此属性必须是 FrameworkElement 的属性。 由于三维场景中的所有对象都是 Viewport3D 的子级,因此要应用于场景的任何动画所面向的属性都是 Viewport3D 属性的属性。 一定要仔细设计动画的属性路径,因为语法可能会极为冗长。

    假设您希望就地旋转某个对象,而且还希望应用摆动动作以公开要查看的对象的更多内容。 您可以选择向模型应用 RotateTransform3D,并对模型从一个向量旋转到另一个向量时所围绕的轴进行动画处理。 下面的代码示例演示如何将Vector3DAnimation 应用于该变换的 Rotation3D 的 Axis 属性,并假设 RotateTransform3D 是应用于具有 TransformGroup 的模型的几个变换之一。

     
    			'Define a rotation
    			Dim myRotateTransform As New RotateTransform3D(New AxisAngleRotation3D(New Vector3D(0, 1, 0), 1))
    
    
    
     
    //Define a rotation
    RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 1));
    
    
    
     
    			Dim myVectorAnimation As New Vector3DAnimation(New Vector3D(-1, -1, -1), New Duration(TimeSpan.FromMilliseconds(5000)))
    			myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever
    
    
    
     
    Vector3DAnimation myVectorAnimation = new Vector3DAnimation(new Vector3D(-1, -1, -1), new Duration(TimeSpan.FromMilliseconds(5000)));
    myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever;
    
    
    

    使用类似的语法可以将其他变换属性作为目标来移动或缩放该对象。 例如,可以在进行缩放变换时将 Point3DAnimation 应用于 ScaleCenter 属性,以便使模型的形状平滑地扭曲。

    尽管上面的几个示例对 GeometryModel3D 的属性进行变换,但是还可以对场景中其他模型的属性进行变换。 例如,可以通过对应用于 Light 对象的平移进行动画处理来创建移动灯光和阴影效果,这些效果可以显著改变模型的外观。

    由于照相机也是模型,因此也可以对照相机的属性进行变换。 尽管您确实可以通过改变照相机的位置或平面距离来改变场景的外观(实际上是变换整个场景的投影),但应注意,对于观察者来说,以这种方法实现的许多效果不如将变换应用于场景中模型的地点或位置更有“视觉意义”。

    posted on 2015-04-22 20:59 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/4448655.html

    展开全文
  • ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,....二维变换 1.二维变换 2.齐次坐标系 3.二维平移 4.二维旋转 5.二维缩放 6.二维剪切变换 7.二维对称变...
  • 计算机图形学三维变换课程设计
  • 计算机图形学基础-三维变换

    千次阅读 2016-07-29 12:05:30
    变换是计算机图形学中重要概念,包括最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换。 1.从三维空间到二维平面   1.1 相机模拟  在真实世界里,所有的物体都是三维的。但是,这些三维...
  •  这么基础的知识还是要完全搞清楚,于是我决定找个时间专门把常用的三维变换矩阵的推导总结一番  1.二维的旋转  假设平面上存在一点(用极坐标表示)(ρ,θ),那么他在直角坐标中可以表示为x =ρ * cosθ, y =...
  • 前言Metal入门教程(一)图片绘制上一篇的教程介绍了如何绘制一张图片,这次的目标是把图片显示到3D物体上,并进行三维变换。Metal系列教程的代码地址;OpenGL ES系列教程在这里;你的star和fork是我的源动力,你的...
  • OpenGL三维变换

    2019-09-24 13:21:59
    我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1、从不同的位置去观察它。(视图变换) 2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换) 3、如果把...
  • 图形学实验,用球体实现三维变换 ,包括平移,旋转,自动平移,自动旋转,物体运动,视野运动...
  • 计算机图形学基础知识-三维变换

    千次阅读 2016-01-04 22:06:31
    变换是计算机图形学中重要概念,包括最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换。 1.从三维空间到二维平面   1.1 相机模拟  在真实世界里,所有的物体都是三维的。但是,这些三维...
  • 表示三维变换的公共基类是Transform3D,并派生出两个子类——PerspectiveTransform3D和CompositeTransform3D。 通常PerspectiveTransform3D与CompositeTransform3D会搭配使用。PerspectiveTransform3D主要负责视角...
  • 为什么80%的码农都做不了架构师?>>>   三维反射 三维错切   转载于:https://my.oschina.net/liyangke/blog/2872414
  • [OpenGL]OpenGL中的三维变换

    千次阅读 2015-12-08 16:49:34
    一个简单的实例开始OpenGL中的三维变换一般是通过矩阵变换来实现的。无论是移动,缩放,或者是旋转都是在一个矩阵的基础上乘上另一个矩阵来实现的。我们先来看一个例子。#include "stdafx.h" #include <gl/
  • 所谓三维变换,其实是在二维平面上产生三维的视觉效果。前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换。 UIElement类有一个属性叫Transform3D,它定义的类型为Transform3D,但,这...
  • 三维变换(转)

    2012-08-10 08:59:41
    三维变换(转) openGL 2009-12-06 09:59:06 阅读98 评论1 字号:大中小 今天要讲的是三维变换的内容,课程比较枯燥。主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后举一个比较综合的例子。...
  • 扩充三维世界为了给诸多变换的实现扫清障碍,首先扩充三维世界的第四个分量,通常合并表示为xyzwPointVector点和向量的w分量我们知道点可以被平移而向量的平移并不改变其数学含义,w分量为0、1时正体现了这样的区别...
  • 本篇我们来学习一下自定义 View 中使用 Camera 来做三维变换,先看一下自定义 View 1-4 Canvas 对绘制的辅助 clipXXX() 和 Matrix 二、Camera 介绍 先来看看适用 Camera 时的三维坐标系结构: camera 相当于...
  • 变换是计算机图形学中重要概念,包括最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换。 1.从三维空间到二维平面 1.1 相机模拟 在真实世界里,所有的物体都是三维的。但是,这些三维物体在计算机...
  • 4.1 三维变换

    2015-05-26 10:48:14
    我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换) 2、从不同的位置去观察它。(视图变换) 3、如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,990
精华内容 1,996
关键字:

三维变换