pen透视变换与屏幕坐标

本人在做3D贴纸的时候,遇到这样的一个需求,在3D贴纸需要和图像进行混合。做远小近大的3D效果,需要将二维的贴纸经过透视变换绘制到屏幕上,如果要添加混合效果,则必须知道变换后的坐标,如果坐标对不上,则会导致混合后的贴纸绘制到屏幕上可能会出现错乱、重叠的情况,因此如何计算重叠部分的准确坐标是实现混合的关键。为此,重新拾起已经被遗忘了的数学知识,将透视变换过程重新推导一遍,以便更好地理解透视变换以及如何转换到屏幕的空间坐标的。

二、透视变换推导1、透视投影公式下图给出了一个空间点(x, y, z)到一般的投影参考点(xv, yv, zv)的投影路径。该投影线与观察平面交于坐标位置(xp, yp, zvp), 其中zvp是观察平面上选择的位于z轴上的点。

由此我们可以计算得到坐标位置的参数方程如下:

当投影参考点在Z轴上时,xv = yv = 0,此时有:

因此,我们可以建立一个变换矩阵将一个空间位置转为齐次坐标位置,使得矩阵仅包含透视参数而不包含坐标值。然后观察坐标系的透视投影变换分两步实现。先用透视变换矩阵计算齐次坐标:

Ph 是齐次点(xh, yh, zh, h) 的列矩阵表示, 而P是坐标(x, y, z, 1)的列矩阵表示,在实际当中,透视矩阵需要跟观察矩阵(ViewMatrix)合并,然后将组合矩阵应用于场景的世界坐标描述以生成齐次坐标。为了防止z轴除以齐次参数h后出现扭曲,我们需要通过为z变换设定矩阵元素从而对透视投影zp的坐标进行规范化。有多种方法选择矩阵元素。下面是一种可能形成透视投影矩阵的方法:

5、对称的视锥体从投影参考点到裁剪窗口中心平穿过观察体的线就会说透视投影棱台的中心线。棱台中心线与观察平面相交于坐标(xv, yv, zvp)位置,用窗口尺寸表示裁剪窗口的对角位置,可得:

整体如下图所示:

可以求得裁剪窗口高度:

6、斜透视投影棱台如果透视投影观察体中心线并不垂直于观察平面,则得到一个斜棱台(oblique frustum)。为了方便计算,将投影参考点(xv, yv, zv) = (0, 0, 0),可得到错切变换矩阵的元素:

如果将观察平面放在近裁剪平面处,则透视投影矩阵可以进一步简化。将裁剪窗口中心移到观察平面坐标位置(0, 0)处,需要选择的错切参数值满足:

当投影参考点位于观察坐标原点切近裁剪平面与观察平面重合时,透视投影矩阵可以简化为:

将透视矩阵和错切矩阵综合,就可以得到下面的将场景坐标位置转换成齐次正交坐标的斜透视投影矩阵。该变换的投影参考点是观察坐标原点,而近裁剪平面是观察平面。

7、规范化透视投影变换坐标矩阵将观察坐标系中的对角位置变换到透视投影齐次坐标。使用齐次参数h 除齐次坐标,可得实际的正交投影坐标。该透视投影将棱台观察体中所有点变换成矩形平行管道观察体中的位置,变换过程的最后一步是将该平行管道映射到规范化观察体(normalized view volume)中,其实也就是设备标准化坐标系(NDC)中的坐标。转换过程遵循评语投影的规范化过程。从棱台观察体变换而来的矩形平行管道映射到对称左手参考系的规范化立方体中。完成规范化的缩放矩阵是:

将透视矩阵与缩放矩阵综合得到规范化矩阵:

将该规范化透视矩阵进行一般化,可以得到以下形式:

如果透视投影观察体一开始就指定为对称棱台,则可用裁剪窗口的视场角和尺寸来表达规范化透视变换的元素。将投影参考点位于原点且观察平面在近裁剪平面位置时,可以得到:

在OpenGL中的方法跟Android中的OpenGLES 不一样。OpenGL建模观察模式用下列语句来设定的:

观察参数用GLU函数指定,该函数如下:

其中(x0, y0, z0) 跟Android中的方法setLookAtM的(eyeX, eyeY, eyeZ) 点均表示观察参考点在世界坐标系的位置。而(xref, yref,zref) 和 (centerX, centerY, centerZ) 表示参考点的坐标,(Vx, Vy, Vz) 和 (upX, upY, upZ) 表示向上向量。默认情况下 gluLookAt的参数是 P0 = (0, 0, 0), Pref = (0,0, -1), V = (0, 1, 0);

2、对称透视投影棱台OpenGL中对称透视投影棱台观察体用gluPerspective表示,原型如下:

在Android的OpenGLES 中也存在类似的方法:

其中 theta 和 fovy 表示视场角,0~180度可选。aspect表示长宽比。far 和near 表示观察参考点到远近裁剪平面的距离。

3、通用透视投影函数在OpenGL中,通用棱台一般使用glFrustum函数来实现:

当选择 xwmin = - xwmax 且 ywmin = - ywmax 时,表示的是一个对称棱台。在Android的OpenGLES中,可以使用类似的方法:

四、空间坐标投影到观察平面上的UV坐标计算。好了,至此,我们讨论了透视投影矩阵变换的整个过程,以及OpenGL 和OpenGLES 设置投影矩阵的方法。那么,如何求得空间坐标经过透视投影矩阵的变换后,得到屏幕的UV坐标呢?假设在棱台(frustum)中的一点的坐标为(x, y, z),经过投影变换后的坐标为(x', y', z')。则我们可以得到以下计算公式:

新得到的坐标(x', y', z', w) 是经过透视投影变换后的坐标,该坐标就是前面第7小节规范化透视投影变换坐标中讨论的透视投影齐次坐标。由于OpenGL的观察平面就是近裁剪平面,因此该坐标就是坐标(x,y,z)经过透视变换后在近裁剪平面上的三维坐标。其中w记录了深度信息。当设置为对称棱台投影后,矩阵的实际值就是前面计算得到的对称棱台规范化的透视投影矩阵:

那么换算得到的新坐标是投影齐次坐标,那么接下来如何转换成屏幕UV坐标呢?我们只需要将得到的新坐标进行归一化为NDC坐标系,然后将其转成UV坐标的表达形式即可。1、转成NDC坐标系这里将所有坐标均除以w值,即可得到NDC坐标,此时的w将被规整为-1 ~ 1 之间。

2、换算成屏幕UV坐标根据前面计算得到的NDC坐标,可以换算成屏幕的UV坐标。由于NDC坐标的范围时-1 ~ 1 的立方体,而屏幕UV坐标则是0~1的平面。如何计算? 其实很简单,只需要从NDC坐标中缩小到原来的一般然后平移到UV屏幕中间(0.5, 0.5),即可求得UV坐标。

五、OpenGLES 中计算透视变换到裁剪平面上的uv坐标看到前面的一大堆计算,估计很多人都会头晕眼花的。其实你完全可以不了解前面的推导过程,在OpenGL 和OpenGLES 中经过透视投影矩阵变换后的屏幕uv坐标甚至是一件非常简单的事情,变换过程如下:

通过将棱台(frustum)中的坐标,与总变换mvpMatrix的乘积,得到一个vec4的变量,该变量就是gl_Position的值。gl_Position代表着总变换后的空间位置。也就是我们所说的齐次坐标。然后将其转成NDC坐标,重新构建一个新的屏幕UV坐标即可。

六、最后说一下3D贴纸需求实现思路实现3D贴纸并将贴纸与图像按照自定义的方式进行混合的整体过程实现如下:1、根据人脸关键点坐标反推算出正脸的坐标(考虑歪头、转脸的情况,如果人脸关键点检测得到的是三维空间点另外计算)2、根据正脸的坐标计算出贴纸处于屏幕空间四个顶点的UV坐标3、根据计算出的贴纸处于屏幕空间的UV坐标,反推算出贴纸实际所处平面的空间坐标(假设未做歪头等动作时的坐标)4、根据得到的贴纸实际空间的坐标,经过平移、旋转后,计算出投影变换后的综合矩阵。5、在glsl中计算总最终的位置:

6、将得到的最终的空间坐标vPosition传递给Fagment Shader,将坐标转换成屏幕的uv坐标

THE END
0.PPT怎么利用矩形给图片做分开隔离效果?powerpoint办公软件ppt中导入的图片想要给图片中的人物添加隔离效果,该怎么制作呢?我们可以使用矩形制作隔离效果,下面我们就来看看详细的教程,需要的朋友可以参考下 ppt中导入的图片,想要从中间撕开,将一张照片分成两张照片的效果,可以使用矩形来实现,下面我们就来看看ppt矩形分开隔离图形的教程。jvzquC41yy}/lk:30pku1xkhkek0rx|gtrujp}486;8567mvon
1.AdobeIllustrator怎么使用切片工具切割图片?在图片中通过拖动鼠标左键,来确定切图的大小尺寸 如果想要改变切片的大小,通过选择工具栏中的-切片选择工具,来调整切片大小 将图片切好后,就需要导出文件,选择-文件-存储为web所用格式 将需要导出的切片全部选中,导出为jpg图片,然后选择-存储 将文件导出后,可以去存储位置查看效果,如图,已经将整张图片切为了3部分jvzquC41yy}/{~yw0et0s~juvkuo1}nygpe949;80jznn
2.绘画术语辞海录书画广角作《牡丹图》 ,光色艳发,妙穷毫厘。仔细观赏并可确信所画的是中午的牡丹,原来画面中的猫眼有“竖线”可见。又如五代画家黄筌写花卉翎毛因工细逼真,呼之欲出,而被苍鹰视为真物而袭之,此见于《圣朝名画评》 :“广政中昶命筌与其子居农 于八卦殿画四时山水及诸禽鸟花卉等,至为精备。其年冬昶将出猎,因按jvzquC41yy}/3Aftv0ipo8xjwj{b{rxjw1nvk6mwc/yiw6~w/eo.jjn/nw4tj}rn
3.ps如何给图形添加透视效果打开ps软件,这里我为了给大家做示范,新建了一个文件,在新建文件的基础上,我还新建了一个图层,选择矩形工具下的形状图层,颜色选择为蓝色, 选中形状图层后,移动鼠标画出一个矩形,点击快捷键ctrl+T,对所画的矩形进行框选, 在图形变成后,点击鼠标右键,弹出栏目,选择透视命令 jvzquC41i0vdqwqkpg4dqv3ep1~0;?61;2<56?;0jvsm
4.AI软件的要点总结4.矩形网格,可以改变格子的多少和大小,可以按上下左右键改变,属性:宽度 - 高度 - 倾斜等,取- 消分组都是一个个直线组成的网格。 5.极坐标,圆形的网格,蜘蛛网的感觉,可以按上下左右键进行改变数值,变圆的分割线的变化。 10、画笔工具B image.png jvzquC41yy}/lrfpuj{/exr1r1k9h952h:9c5B
5.知识库|聚观点IDE设计师Jessie-Jisun Lee将著名导演大卫林奇的照片不加修饰地放到了封面中。而使用方块隔开的字体则给人上图封面的设计者从心理测验所用的洛夏墨迹(Rorschach Inkblot test)中获得了灵感,这张封面表现了这本利用黄金分割比例连续製作愈来愈大的正方形,以弧形连接每一个正方形的对角,可以形成一个螺旋状的曲线jvzquC41eq{sun3lwi{bpmncp0ipo8rqf1mmq|xct{5wkn|0rjv@kmB565,nqmj?ngzug{+jqqq>UYJEKCR
6.ai怎么分割图形?ai剪切分割图形的两种教程Illustrator教程对于很多初学ai软件的朋友,它们觉得ai中不能分割图形,事实上ai完全可以分割图形。下面会给大家介绍两个方法来分割图片,希望对于初学AI的朋友有所帮助。 一、剪刀工具 1、打开ai的软件,执行菜单栏中的文件—新建,或者直接按快捷键Ctrl+N新建一个画布。在这里展示的是A4大小的画布,如下图所示。 jvzquC41yy}/lk:30pku1Rqnwuzsc}tt16673A80jvsm
7.流行的平面设计风格范文平面结构的基本元素也是点、线、面,并且彩陶的装饰形象在平面中也是适用的。彩陶纹饰一般均是采用对称、对比、韵律、分割、节奏等设计手法,利用点的大小、形状,线的疏密、长短、黑白、虚实,进行点、线、面合理组合的设计创作,这些多样化的设计方法是平面设计需要借鉴的。jvzquC41yy}/i€~qq0ipo8mcqyko1:=:257/j}rn
8.场景透视怎么画?适合0基础学习,教你如何画好透视的技巧!|远近|图图中,视高为2倍人高,A台子为一人高,B台子为1/2人高。 透视中矩形的分割和延伸 建筑庭有用的 a.平行变线分割法 其基本原理就是利用辅助线来分割变线A0。其中左上图中的AC即为辅助线,将其均分,然后向辅助灭点作虚线,虚线与变线的交点在变线上分割出的线段,即为变线上等距线段在透视上的变化规律。 jvzq<84m0uooc7hqo0io1jwvkerfa;8;;4?17:5a:h636==g22713Aqwv0nuou
9.电大网络计算机绘图,计算机绘图与AUTOCAD设计[031005217]本课程详细介绍了AUTOCAD的基础知识和操作技巧,包括先修课程要求、绘图内容、软件使用、图形管理、二维与三维绘图、文字处理、尺寸标注、图案填充、图块与外部参照、信息查询、格式转换与打印出图等内容。通过学习,学生能够掌握计算机绘图的基本技能,并能进行复杂的工程制图操作。 jvzquC41dnuh0lxfp0tfv8|gkzooa=75858438ftvkimg8igvcomu863:3>33;<
10.影视后期制作工程师模拟题这两个片段之间施加一个矩形划像切换,切换的对齐方式为End at cut,切像切换的入点为8秒。那么,划D.不能进行任何操作 12.在Color Correct特效中Curves调整方式的曲线图中,水平坐标和垂直坐标分别代表:位置且选择了“剃刀工具”之后,按下(B )键,同时单击鼠标左键,当前编辑线上所有轨道的素材被分割开来jvzq<84yyy4ykwjk{k/exr0ep5tjx|pgyy`3;990jznn
11.如何用3dmax拆分矩形?在3ds Max中拆分矩形(或其他几何体)是一个常用的操作,尤其是在建模和细化过程中。通过拆分,可以将对象分割成多个部分,方便后续的编辑和调整。以下是如何在3ds Max中拆分矩形的详细步骤。 1. 启动项目 首先,打开3ds Max并创建一个新项目,或者打开一个包含要拆分的矩形的现有项目文件。 jvzquC41yy}/5m;80eun1tz1pg}t1?5;20nuou