视图和模型变换

视图变换,是指变换照相机的位置,角度。
模型变换,是指变换被照物体的位置,角度。

这两个变换,都会影响最终图形中,物体的位置,角度。而这两个变换,可以达到相同的效果。比如,你想要一个倒着的水杯图形,可以把你自己倒立,这样看到的水杯就是倒立的了。或者把水杯倒立,自己直立,也能看到倒立的水杯。
这里写图片描述
如图所示,这两种变换,可以看做达到目的的不同途径。甚至可以同时使用视图变换和模型变换,只要最终拿到了我们想要的图像就可以了。至于使用的是视图变换,还是模型变换,看我们理解问题的角度。

3.2.1 对变换进行思考

变换顺序,对最终的结果影响很大。
看下面的例子:
这里写图片描述
图中有两个操作,旋转和移动。一个是沿原点绕z轴逆时针旋转45度,另一个是沿x轴向下平移。左图中,是先旋转,再移动,物体最终在x轴上。右图中,是先移动,再旋转,物体最终在x=y轴上。变换顺序不同,导致物体最终位置不同,这就是变换顺序的影响。

变换顺序,在OpenGL中的具体实现。
在OpenGL中,所有的变换,都是通过矩阵来实现的。一个矩阵,表示一个或多个变换。模型视图变换,是通过模型视图矩阵来实现的。由于这个矩阵经常变换,需要进行管理,OpenGL中是通过矩阵堆栈来对矩阵进行管理的。

当前模型视图矩阵如果用C来表示,在当前模型视图基础上,进行一个变换,这个变换使用的矩阵为M。那么一个顶点v的变换之后的坐标为CMv。也就是说,M变换先作用于顶点v,然后再是当前模型视图矩阵C。

看下面的例子:

glMatrixMode(GL_MODELVIEW);
glLoadIndentity();
glMultMatrixf(N);       //变换N
glMultMatrixf(M); //变换M glMultMatrixf(L); //变换L glBegin(GL_POINTS); glVertex3f(v); glEnd();
 

这段代码中,模型视图矩阵按顺序分别包含了I, N, NM,最后是NML,其中I表示单位矩阵。经过变换的顶点是NMLv。因此,顶点变换就是N(M(Lv)),也就是说,v首先与L相乘,Lv再与M相乘,MLv再与N相乘,而不是按它们指定的顺序出现的。

全局固定坐标系

图3-4中,左图中的先旋转,再平移,代码实现如下:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(T);   //平移
glMultMatrixf(R); //旋转 draw_the_object();

只要记住一点,物体的变换顺序,和矩阵的出现顺序,正好相反。

局部移动坐标系统

这个通常用于模型的关节控制。比如机器人手臂。比如画汽车轮子上的螺钉,这个螺钉的位置,相对于汽车轮子,这个轮子上建立的坐标系,叫局部移动坐标系。而轮子的位置,又是相对于汽车本身,最后,汽车本身,是在全局坐标系中指定。

3.2.2 模型变换

模型变换,主要涉及三个函数,移动、旋转、缩放。有了这三个函数的组合,我们可以进行任意变换。

void glTranslate{fd}(TYPE x, TYPE y, TYPE z);
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); void glScale{fd}(TYPE x, TYPE y, TYPE z);
这三个函数,之前接触过。glTranslate,进行平移,平移的偏移量,由(x, y, z)指定。 glRotate,旋转,以逆时针方向绕着从原点到点(x, y, z)的直线旋转角度angle。glScale,按照一定比列进行缩放,比例在x轴,y轴,z轴方向上的量是(x, y, z)。

3.2.3 视图变换

视图变换,相关的三个函数是glTranslate,glRotate和gluLookAt函数。

这个glTranslate和glRotate在模型变换中,我们已经见过了。怎么模型变换和视图变换,使用的是同样的函数呢?因为变换是相对的。 比如,让模型和照相机距离5个单位长度,假设模型和照相机放在一起。我们可以将物体向前移动5个单位长度,也可以将照相机向后移动5个单位长度。所以,视 图变换,也是使用glTranslate和glRotate。只是这个参数的含义相反罢了。
比如

glTranslatef(0.0, 0.0, -5.0);

这个函数在场景中把物体沿z轴移动-5个单位,相当于把照相机沿z轴移动+5个单位。

使用工具函数gluLookAt()

void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,GLdouble centerx, GLdouble centery, GLdouble centerz,GLdouble upx, GLdouble upy, GLdouble upz);
定义一个视图矩阵,并把它与当前矩阵进行右乘。目标观察点eyex, eyey, eyez。centerx, centery和centerz参数指定了视线上的任意一点。upx,upy和upz参数表示哪个方向是朝上的(也就是说,在视景体中自底向上的方向)。

默认情况下,照相机位于原点,指向z轴的负方向,以y轴的正方向为朝上方向。相当于调用:

gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);
参考点的z值是-100.0, 但它也可以是任意的负值,因为它不会影响视线的方向。

下面是使用gluLookAt的一个例子。

gluLookAt(4.0, 2.0, 1.0, 2.0, 4.0, -3.0, 2.0, 2.0, -1.0);

这里写图片描述
这个函数,将摄像机移动到了(4.0, 2.0, 1.0)这个点,摄像机朝向(2.0, 4.0, -3.0)方向,摄像机向上的方向为(2.0, 2.0, -1.0)。

强烈推荐,理解这几个函数(glTranslate, glRotate, gluLookAt),使用Nate Robin的教程。网上有下的。

创建自定义的工具函数

创建自定义的函数,其实就是在自己的函数中,调用glTranslate和glRotate这两个函数。
要创建自定义的工具函数,主要是弄清楚两个东西:一个是参数是相对于哪个坐标系的,第二个就是照相机的变换顺序,与glTranslate,glRotate出现的顺序相同。

比如编写一个飞机模拟器,并且以飞机的驾驶员座位观察点显示飞机外面的景象。我们可以用一个圆点位于跑道上的坐标系统来描述整个场景,飞机相对于坐 标(x, y, z)。然后,假设飞机还有倾侧角、螺旋角和航向改变角(这些都是飞机相对于它的重心的旋转角度)。下面这个函数可以作用视图变换函数使用。

void pilotView(GLdouble planex, GLdouble planey, GLdouble planez, GLdouble roll, GLdouble pitch, GLdouble heading)
{glRotated(roll, 0.0, 0.0, 1.0); glRotated(pitch, 0.0, 1.0, 0.0); glRotated(heading, 1.0, 0.0, 0.0); glTranslated(-planex, -planey, -planez); }
这个其实很好理解,因为这个roll, pitch, heading,都是相对于飞机的。而飞机,就是我们的相机。所以,先将飞机旋转到一定角度,然后移动到点(planex, planey, planez)上面。因为这个planex, planey, planez是相对于机场跑道的坐标系,而我们移动的飞机相当于相机,所以都要取负号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙os全面升级,华为突然宣布,鸿蒙OS正式版6月底全面升级,幸福来得太突然...

原标题:华为突然宣布,鸿蒙OS正式版6月底全面升级,幸福来得太突然摘要:早在今年2月华为Mate X2折叠屏新品发布会上,余承东曾表示,鸿蒙OS正式版将于今年4月份全面上线。或许是因为华为宣布卖车分散了很多的精…

eclipse启动失败:An internal error occurred during: reload maven project

2019独角兽企业重金招聘Python工程师标准>>> 1.找到workspace文件夹下的/.metadata文件夹,将其删除掉,然后在讲项目重新导入进去eclipse中。但是这个有一点不好的地方,之前对eclipse所做的配置也会恢复为默认配置 2.在.metadata下…

skt7850鸿蒙策略,lol 英雄联盟 SKT状态回暖轻取外卡,SUP难挡Faker

MSI 第四日 SUP vs SKT双方bpBAN LISTBAN:SUP:流浪 牛头 豹女SKT:巴德 妖姬 鱼人PICKSUP:大树 男枪 冰女 卢锡安 锤石SKT:艾克 千珏 沙皇 EZ 布隆比赛开始,双方正常对线开局。前期下路锤石多次勾中ez,男枪也来逼出EZ布…

spring集成struts2

Struts2前身是WebWork,核心并没有改变,其实就是把WebWork改名为struts2,与Struts1一点关系没有。 Struts2中通过ObjectFactory接口实现创建及获取Action实例,类似于Spring的IoC容器,所以Action实例可以由ObjectFactory…

Android学习之查看网络图片

在这里小编学习了查看网络图片的小案例,: 初始界面: 点击浏览后,效果如下: 需要注意的是 该案例需要获取联网权限,即: <uses-permission android:name"android.permission.INTERNET"/>具体步骤如下: 1.定义并初始化控件: private EditText etImageUrl;private …

vue 转为静态html,Vue CLI 3使用:HTML和静态资源(五)

HTMLpublic/index.html 文件是一个会被 html-webpack-plugin 处理的模板。构建中&#xff0c;各种资源路径会被注入解析。可以使用 lodash template 语法插入内容。用来做不转义插值&#xff1b;用来做 HTML 转义插值&#xff1b;用来描述 JavaScript 流程控制。除了被 html-we…

从html导出带样式的excel,Jquery导出带样式的Excel

工作中做导出的时候&#xff0c;需要导出自定义的表格或嫌弃导出的Excel格式太难看了。需要设置颜色、字号大小、加粗、合并单元格等等。特性&#xff1a;支持过滤 某个位置支持过滤 img 标签支持过滤 a 标签支持过滤 input 标签支持包含 行内样式。HTML页面&#xff1a;HTML页…

云计算机创意名,有创意的道路名字推荐,分享一些好听有内涵的路名

提到龙岗板块&#xff0c;“风向”一直飘忽不定。原本地铁4号线今年通车&#xff0c;但是因为五象火车站的规划建设&#xff0c;暂时未开通;机场线已经敲定&#xff0c;然而没有龙岗的份…… [本文来自&#xff1a;www.777y.com]虽然机场线暂时无缘(可以期待下)&#xff0c;但是…

250W电源带i7+GTX1080?

电源的科学: Q1&#xff1a;电源的额定功率是什么&#xff1f;峰值功率又是什么&#xff1f;A1&#xff1a;电源的额定功率就是电源正常工作时的功率&#xff0c;它的值为用电器的额定电压乘以额定电流。而峰值功率指的是电源短时间内能达到的最大功率&#xff0c; 一般情况下电…

2018清华计算机类专业录取分数线,清华大学2018年各省录取分数线及各专业录取分数线 - 高教网...

【一批录取分数线】港澳台联招&#xff1a;630分安徽&#xff1a;理科689分&#xff1b;文科675分&#xff1b;理科定向683分北京&#xff1a;理科694分&#xff1b;文科677分福建&#xff1a;理科681分&#xff1b;文科650分甘肃&#xff1a;理科652分&#xff1b;文科637分广…

怎么用计算机连接电视,电脑怎么连接电视 详细步骤【图文】

现在一般的LED电视机都有连接电脑的功能&#xff0c;如何让电脑连接电视&#xff0c;让电视的大屏幕成为电脑的显示器呢?下面给大家说明电脑连接电视详细步骤!电脑连接电视步骤&#xff1a;1 电脑连接电视所需的接口及连接线我们先来介绍一下&#xff0c;电视上需要的接口&…

4r照片尺寸是多大_数码照片4D、4R、6RW是什么意思,怎样调整4D照片尺寸?

数码照片4D、4R、6RW是什么意思,怎样调整4D照片尺寸?数码相机和DV进入寻常百姓家&#xff0c;有些朋友希望把外出旅游或者居家时拍的照片冲印出来&#xff0c;但是一些朋友对里面的专业说法不太熟悉&#xff0c;比如3R,4R,4D,5D,5R,6R等照片的规格和尺寸不清楚&#xff0c;其实…

html自定义列表 嵌套,HTML 列表

HTML 支持有序、无序和定义列表:HTML 列表有序列表The first list itemThe second list itemThe third list item无序列表List itemList itemList item在线实例无序列表本例演示无序列表。有序列表本例演示有序列表。(可以在本页底端找到更多实例。)HTML无序列表无序列表是一个…

shiro会话监听_SpringBoot集成Shiro会话管理

在Shiro中我们可以通过org.apache.shiro.session.mgt.eis.SessionDAO对象的getActiveSessions()方法方便的获取到当前所有有效的Session对象。通过这些Session对象&#xff0c;我们可以实现一些比较有趣的功能&#xff0c;比如查看当前系统的在线人数&#xff0c;查看这些在线用…

【原创】吟端午

《吟端午》人间六月艳阳天&#xff0c;粽子飘香不等闲。自古离骚东流水&#xff0c;九州沧海变桑田。创作时间&#xff1a;2016年06月08日创作背景&#xff1a;受人之约&#xff0c;赋诗为题&#xff01;转载于:https://blog.51cto.com/yanhuasanyue/1842346

dom对象常用的属性和方法有哪些?

dom对象常用的属性和方法有哪些&#xff1f; 一、总结 一句话总结&#xff1a; 1、document属性和方法&#xff1a;document的属性有head&#xff0c;body之类&#xff0c;方法有各种获取element的方法 2、element的属性和方法&#xff1a;属性比如style&#xff0c;innerHTML和…

html左中右自适应布局,CSS左中右自适应布局六种方案与原理

css虽简单,但细节多,技巧性高,易学难精。如何实现左右固定300px , 中间宽度自适应&#xff1f;有如下结构左右中公有样式, 设置高,设置左右宽度固定300px,左右为红色&#xff0c;中间为黄色。.item {height: 400px;}.left,.right {width: 300px;background: #f00;}.center {bac…

cronschedulebuilder 到时还没运行完_为什么我的软件编译时没问题,运行时却出错?...

首先有件事要和大家说一下&#xff1a;我的公众号现在可以留言了&#xff01;出于种种不可抗力的原因&#xff08;你们懂的&#xff09;&#xff0c;2018 年 3 月 12 号之后注册的公众号将不带有留言功能&#xff0c;并且前三个月内注册但并未使用的公众号的留言功能也会被一并…

使用Javascript正则表达式来格式化XML内容

2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><meta http-equivcontent-type content"text/html; charsetUTF-8"><title>Xml格式化…

Nginx 笔记与总结(3)配置虚拟主机

Nginx 重启的另外一种方式&#xff0c;相当于 kill -HUP cat /usr/local/nginx/logs/nginx.pid&#xff1a; /usr/local/nginx/sbin/nginx -s reload停止 Nginx 的另外一种方式&#xff1a; /usr/local/nginx/sbin/nginx -s stop重读日志文件的另一种方式&#xff0c;相当于 …