计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结


在图形学中,有两大基本工具:向量分析,图形变换。本文将重点讲解向量和二维图形的变换。

5.1 向量基础知识

我们所使用的所有点和向量都是基于某一坐标系定义的,比如左手坐标系或者右手坐标系。

这里写图片描述

从几何的角度来看,向量是具有长度和方向的实体,但是没有位置,而点是只有位置,没有长度和方向。

在几何中,把向量看成是从一个点到另一个点的位移。向量算法提供了一种统一的方法来对几何思想进行代数的表示。

向量的表示

从点 P 到点 Q的位移用向量 V 表示。两个点的差是一个向量,V=Q-P,V=(3,-2)。

这里写图片描述

换个角度来说,可以说点 Q是由点 P 平移向量 V 得到的,Q=P+V。

向量基本运算

向量允许两个基本操作:向量相加,标量(实数)的数乘。

例子:

如果 a 和 b 是两个向量, s 是一个标量。a+b 和 sa都是有意义的。

a=(2,6),b=(3,1),a+b=(5,7),2a=(4,12)

除了直接的进行数值运算以外,向量的加(减)法可以采用“平行四边形法则”,在几何图形中表示结果。如下图所示:

这里写图片描述

这里写图片描述

向量线性组合

掌握了向量的加法和数乘后,就可以定义任意多个向量的线性组合了。

这里写图片描述

有两种特殊的线性组合在计算机图形学中很重要:仿射组合,凸组合

仿射组合

如果线性组合的系数的和等于1,那么它就是仿射组合。

这里写图片描述

向量的凸组合

凸组合在数学中具有重要的位置,在图形学中也有很多应用。凸组合是对仿射组合加以更多的限制得来的。

这里写图片描述

向量的点积和叉积

有两个功能强大的工具一直推动着向量的应用:点积,叉积。

点积得到一个标量,叉积产生一个新的向量。

点积

点积:只需将两个向量对应的分量相乘,然后将结果相加。

这里写图片描述

点积最重要的应用就是计算两个向量的夹角,或者两条直线的夹角。

这里写图片描述

由于两个向量的点积和它们之间夹角的余弦成正比,可以得出以下关于两个非零向量夹角与点积的关系:

这里写图片描述

叉积

两个向量的叉积是另一个三维向量。叉积只对三维向量有意义。它有许多有用的属性,但最常用的一个是它与原来的两个向量都相交。

这里写图片描述

两个向量的叉积 aXb 是另外一个向量,但是这个向量与原来的两个向量在几何上有什么关系?为什么我们说这种运算很重要呢?

这里写图片描述

利用叉积求平面的法向量

法向量是空间解析几何的一个概念,垂直于平面的直线所表示的向量就是该平面的法向量。

这里写图片描述

5.2 图形坐标系

坐标系的基本概念

坐标系是建立图形与数之间对应联系的参考系。

坐标系的分类

从维度上来看,可以分为一维、二维、三维坐标系。

从坐标轴之间的空间关系来看,可以分为直角坐标系,极坐标系,圆柱坐标系,球坐标系等。

在计算机图形学中,从物体(场景)的建模,到在不同显示设备上显示、处理图形时,我们经常使用一系列不同的坐标系。图形显示的过程就是几何(对象)模型在不同坐标系之间的映射变换。

计算机图形学中的坐标系

世界坐标系

程序员可以用最适合他们手中问题的坐标系来描述对象,并且可以自动的缩放和平移图形,使得其能正确地在屏幕窗口中显示。

这个描述对象的空间被称为世界坐标系,即场景中物体在实际世界中的坐标。

世界坐标系是一个公共坐标系,是现实中物体或场景的统一参考系,计算机图形系统中涉及到的其他坐标系都是参照它进行定义的。

这里写图片描述

建模坐标系(局部坐标系)

每个物体(对象)都有它自己的局部中心和坐标系。建模坐标系独立于世界坐标系,来定义物体的几何特性。

这里写图片描述

一旦定义了“局部”物体,就很容易地将“局部”物体放入世界坐标系内,使它由局部上升为全局的。

这里写图片描述

观察坐标系

观察坐标系主要用于从观察者的角度对整个世界坐标系内的对象进行重新定位和描述。

依据观察窗口的方向和形状在世界坐标系中定义的坐标系称为观察坐标系。观察坐标系用于指定图形的输出范围。

二维观察变换的一般方法是:在世界坐标系中指定一个观察坐标系,以该坐标系为参考通过选定方向和位置来制定矩形剪裁窗口。

这里写图片描述

要想建立观察坐标系,需要已知三个要素

  1. 观察点的位置
  2. 观察的方向
  3. 世界坐标系上的向量

观察坐标系通常以视点的位置为原点,由视点的位置和观察的方向即可确定 Z 轴。确定与 X 轴垂直的平面,世界坐标系上的向量在该平面上的投影即为 Y 轴。由 Z 轴和 Y 轴,通过左手定则即可确定 X 轴。

设备坐标系

适合特定输出设备输出对象的坐标系,比如屏幕坐标系。

在多数情况下,对于每一个具体的显示设备,都会有一个单独的坐标系统。注意:设备坐标是整数。

规范化坐标系

规范化坐标系独立于设备外,能很容易地转变为设备坐标系,是一个中键坐标系。

为使图形软件能在不同的设备之间移植,采用规范化坐标,坐标轴取值范围是 0~1。

这里写图片描述

5.3 二维图形变换原理及齐次坐标

图形变换

图形变换的用途

图形变换和观察是计算机图形学的基础内容之一,也是图形显示过程中不可缺少的一个环节。一个简单的图形,通过各种变化(如:比例、旋转、镜像、错切、平移等)可以形成一个丰富多彩的图形或图案。

(1)由一个基本的图案,经过变换组合成另外一个复杂图形。

这里写图片描述

(2)用很少的物体组成一个场景

这里写图片描述

(3)可以通过图形变化组合得到动画效果

在计算机动画中,经常有几个物体之间的相对运动,可以通过平移和旋转这些物体的局部坐标系得到这种动画效果。

图形变化的基本原理

可以看下面两个例子。

这里写图片描述

可以发现:

  1. 图形变化了,但原图形的连边规则没有改变
  2. 图形的变化,是因为顶点位置的改变决定的

变换图形就是要变换图形的集合关系,即改变顶点的坐标,同时保持图形的原拓扑关系不变。

仿射变换是一种二维坐标到二维坐标之间的线性变换。

  1. 平直性:直线经过变换之后依然是直线
  2. 平行性:平行线依然是平行线且直线上点的位置顺序不变

下面介绍一个方程组,称为二维仿射变换

这里写图片描述

齐次坐标

在二维平面内,我们用一对坐标值(x,y)来表示一个点在平面内的确切位置,或者说是用一个向量(x,y)来标定一个点的位置。

假如变换前的点的坐标为(x,y),变换后的点坐标为(x*,y *),这个变换过程可以写成如下矩阵形式:

这里写图片描述

这种用三维向量表示二维向量,或者一般而言,用一个 n+1维的向量表示一个 n 维向量的方法称为齐次坐标表示法

n 维向量的变换是在 n+1 维的空间进行的,变换后的 n 维结果是被反投回到特定维空间内而得到的。

这里写图片描述

为什么要采用齐次坐标

在笛卡尔坐标系内,向量(x,y)是高于 z=0 平面上的点,而向量(x,y,1)是位于 z=1 的等高平面上的点。

对于图形来说,没有实质性的差别,但是却给后面的矩阵运算提供了可行性和方便性。

采用了齐次坐标表示法,就可以统一的把二维线性变换表示为如下所示的规格化形式:

这里写图片描述

对于一个图形,可以用顶点表来描述图形的几何关系,用连边表来描述图形的拓扑关系。所以对图形的变化,最后转变成,只是要变化图形的顶点表。

5.4 二维图形几何变化

图形的集合变化是指对图形的几何信息经过平移、比例、旋转等变换后产生新的图形。

这里写图片描述

平移变换

平移是指将 P 点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。

这里写图片描述

齐次坐标计算形式如下:

这里写图片描述

平移是一种不产生变形而移动物体的刚体变换,即物体上的每个点移动相同数量的坐标。

比例变换

这里写图片描述

齐次坐标计算形式如下:

这里写图片描述

缩放系数Sx,Sy可赋予任何正整数。值小于1,则会缩小物体的尺寸。值大于1,则会放大物体。都指定为1,物体尺寸就不会改变。

(1)Sx = Sy 比例
这里写图片描述

(2)Sx <> Sy 比例
这里写图片描述

当 Sx = Sy 时,比例变换成为整体比例变换,用以下矩阵进行计算:

这里写图片描述

整体比例变换时,若S>1,图形整体缩小,若0

对称变换

对称变换也称为反射变化或镜像变换,变换后的图形是原图形关于某一轴线或原点的镜像。

这里写图片描述
这里写图片描述

关于x轴对称

这里写图片描述

关于y轴对称

这里写图片描述

旋转变换

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

错切变换

在图形学的应用中,有时需要产生弹性物体的变形处理,这就要用到错切变换。

这里写图片描述

变换矩阵中的非对角线元素大都为0,若变换矩阵中的非对角元素不为0,则意味着 x,y 同时对图形的变换起作用。也就是说,变换矩阵中非对角线元素起着把图形沿 x 方向或 y 方向错切的作用。

这里写图片描述

x 值或 y 值越小,错切量越小。x 值或 y 值越大,错切量越大。其变换矩阵为:

这里写图片描述

沿x方向错切

这里写图片描述

复合变换

复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。

从另一方面看,任何一个复杂的几何变换都可以看做是基本几何变换的组合形式。

二维复合平移变换

P 点经过两次连续平移后,其变换矩阵可以写成:

这里写图片描述

二维复合比例变换

P 点经过两个连续比例变换后,其变换矩阵可写成:

这里写图片描述

二维复合旋转变换

P 点经过两个连续旋转变换后,其变换矩阵可写成:

这里写图片描述

坐标系之间的变换

图形变换经常需要从一个坐标系变换到另外一个坐标系。

这里写图片描述

相对任意参考点的二维几何变换

这里写图片描述

二维变换矩阵

这里写图片描述
这里写图片描述

二维图形几何变换的计算

这里写图片描述

点的变换

这里写图片描述

直线的变换

直线的变换可以通过对直线两个端点进行变换,从而改变直线的位置和方向。

这里写图片描述

多边形的变化

多边形变化是将变换矩阵作用到每个顶点的坐标位置并按新的顶点坐标值和当前属性设置来生成新的多边形。

这里写图片描述

5.5 窗口、视区及变化

窗口和视区

世界坐标系中药显示的区域称为窗口。

窗口映射到显示器上的区域称为视区。

这里写图片描述

世界坐标系中的一个窗口可以对应于多个视区。

这里写图片描述

如何将窗口内的图形在视区中显示出来呢?必须经过将窗口到视区的变化处理,这种变换就是观察变换。

观察变换

将窗口到视区的变化处理,这种变换就是观察变换。

变焦距效果

这里写图片描述

当窗口变小时,由于视区大小不变,就可以放大图形对象的某一部分,从而观察到在较大的窗口时未显示出的细节。

整体缩放效果

当窗口大小不变而视区大小发生变化时,得到整体缩放效果。这种缩放不改变观察对象的内容。

这里写图片描述

窗口到视区的变换

为了全部且如实的在视区中显示出窗口内的图形对象,就必须求出图形在窗口和视区间的映射关系。

需要根据用户所定义的参数,找到窗口和视区之间的坐标对应关系。

这里写图片描述

窗口到视区的映射是基于一个等式,即对每一个在世界坐标下的点(x,y),产生屏幕坐标系中的一个点(sx,sy)。

这种映射是“保持比例”的映射。

保持比例的性质使得这个映射有线性形式:

这里写图片描述

接下来通过证明,得到A、B、C、D的值。

这里写图片描述
这里写图片描述
这里写图片描述

5.6 二维图形变换小结

主要讲解了向量的基本知识、坐标系的分类、齐次坐标、二维变换等、窗口与视区

一、向量基本知识

为了处理二维、三维图形,向量是很重要的一个分析计算工具。讲述了向量的定义、基本运算、线性组合、叉积、点积等。

二、坐标系的分类

坐标系是建立图形与数之间对应联系的参考系。在计算机图形学中,从物体(场景)的建模到在不同显示设备上显示,需要使用一系列不同的坐标系。

  1. 世界坐标系:是一个公共坐标系,是显示中物体或场景的统一参考系
  2. 局部坐标系:每个物体(对象)都有它自己的局部中心和坐标系
  3. 观察坐标系、设备坐标系、规格化坐标系

三、二维图形几何变换
图形变换和观察是计算机图形学的基础内容之一,也是图形显示过程中不可缺少的一个环节。

  1. 齐次坐标:用一个 n+1 维的向量来表示一个 n 维向量的方法
  2. 二维几何变换
    这里写图片描述
  3. 物体变换和坐标变换
    物体变换使用同一个规则改变物体上所有的点,但是保证底层坐标系不变。
    坐标变换按照原坐标系定义了一个全新的坐标系,然后在新坐标系下表示物体上所有的点。
  4. 复合坐标
    也称为组合变化。组合变换的变换矩阵是几个单独变换矩阵的乘积。由于矩阵乘法不满足交换律,因此在进行复合变换时,需要注意矩阵相乘的顺序

四、窗口视区及变换

  1. 窗口:世界坐标系中要显示的区域
  2. 视区:窗口映射到显示器上的区域
  3. 窗口到视区的变换:为了全部且如实的在视区中显示出窗口内的图形对象,就必须求出图形在窗口和视区间的映射关系。
  • 41
    点赞
  • 223
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Android 中,我们可以使用 `TranslateAnimation` 类来实现 View 的平移动画效果。以下是从左向右平移的示例代码: ```java TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 0); animation.setDuration(1000); // 动画持续时间,单位为毫秒 animation.setFillAfter(true); // 动画结束后保持状态 view.startAnimation(animation); // 开始动画 ``` 上述代码中,`TranslateAnimation` 的两个参数分别表示 View 在 X 轴和 Y 轴上的起点和终点位置。这里我们将 X 轴的起点设置为 0,终点设置为 200,表示 View 从左向右平移 200 个像素。 如果想要实现循环播放的效果,可以使用 `AnimationSet` 类来组合多个动画,示例代码如下: ```java TranslateAnimation animation1 = new TranslateAnimation(0, 200, 0, 0); animation1.setDuration(1000); animation1.setInterpolator(new LinearInterpolator()); // 线性插值器,使动画匀速播放 TranslateAnimation animation2 = new TranslateAnimation(200, 0, 0, 0); animation2.setDuration(1000); animation2.setStartOffset(1000); // 设置动画延迟开始的时间,单位为毫秒 animation2.setInterpolator(new LinearInterpolator()); AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(animation1); animationSet.addAnimation(animation2); animationSet.setRepeatCount(Animation.INFINITE); // 设置动画重复播放的次数 view.startAnimation(animationSet); ``` 上述代码中,我们创建了两个 `TranslateAnimation`,分别表示 View 从左向右平移和从右向左平移。然后使用 `AnimationSet` 将两个动画组合在一起,并设置为循环播放,效果如下: ![translate_animation.gif](https://img-blog.csdn.net/20180420202704371?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZ3VhZ2VfYmFpZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75|watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZ3VhZ2VfYmFpZHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75) 如果想要实现手势控制平移的效果,可以使用 `ViewPropertyAnimator` 类来实现,示例代码如下: ```java view.animate().translationX(200); // 平移 View 到 X 轴 200 像素的位置 ``` 上述代码中,我们使用 `animate()` 方法获取 `ViewPropertyAnimator` 对象,然后调用 `translationX()` 方法实现 View 的平移动画。注意,这种方式只能实现单次平移动画,不能循环播放。 除了平移动画,Android 中还有旋转和缩放动画,可以使用 `RotateAnimation` 和 `ScaleAnimation` 类来实现。具体用法与 `TranslateAnimation` 类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值