博客
关于我
【计算机图形学-8】层级建模方法
阅读量:408 次
发布时间:2019-03-05

本文共 1843 字,大约阅读时间需要 6 分钟。

图符与实例

我们建立的模型都是独立的,没有内在关联性。通过层级建模,我们可以实现模型之间的联动效果。之前我们建立了许多模型,包括几何对象模型、材质模型、光源模型以及虚拟照相机模型。

对于大多数图形API来说,最小完备的观点是:只包含少数的基本图元,让用户通过这些基本图元构建更复杂的对象。这些基本图元被称为图符。在OpenGL应用程序中,必须通过几何变换将图符从建模标架变换到世界标架,得到一个实例。实例变换将每个图符实例按照所需的大小、方向和位置放入场景中:𝑴= 𝑻𝑹𝑺

层级模型——以机械臂的实现为例

层级模型的核心是建立层次树,确定哪种信息放在节点上,哪种信息放在边上。以机械臂为例,我们有三个模型对象:支架、下臂和上臂。它们的运动自由度如下:

  • 支架可以独立旋转。
  • 下臂的位置与支架旋转有关,会随着支架运动而平移。
  • 上臂的位置与支架和下臂的位置有关,会随着下臂运动而平移。

实例变换矩阵

  • 支架的旋转:𝑅_b 将𝑀 = 𝑅_𝑏应用到支架上。
  • 下臂的平移和旋转:𝑇_𝑙𝑎 将下臂绕关节旋转:𝑅_𝑙𝑎 将𝑀 = 𝑅_𝑏 𝑇_𝑙𝑎 𝑅_𝑙𝑎应用到下臂上。
  • 上臂的平移和旋转:𝑇_𝑢𝑎 将上臂绕关节旋转:𝑅_𝑢𝑎 将𝑀 = 𝑅_𝑏 𝑇_𝑙𝑎 𝑅_𝑙𝑎 𝑇_𝑢𝑎 𝑅_𝑢𝑎应用到上臂上。

伪代码如下:

model_view = RotateY(Theta[Base]);  // 支架变换矩阵model_view = model_view * Translate(0.0, BASE_HEIGHT, 0.0)               * RotateZ(Theta[LowerArm]);  // 下臂变换矩阵model_view = model_view * Translate(0.0, LOWER_ARM_HEIGHT, 0.0)               * RotateZ(Theta[UpperArm]);  // 上臂变换矩阵

如果图元本身还有变换,需要乘上图元本身的模型矩阵。伪代码如下:

void upper_arm() {    mat4 instance = Translate(0.0, 0.5 * UPPER_ARM_HEIGHT, 0.0)                   * Scale(UA_WIDTH, UA_HEIGHT, UA_WIDTH);    glUniformMatrix4fv(ModelView, 1, GL_TRUE, model_view * instance);    colorCube();    glDrawArrays(GL_TRIANGLES, 0, NumVertices);    model_view = mvstack.pop();}

层级模型——以机器人的实现为例

我们采用树的先序遍历。以史蒂夫为例,其层次树为:

  • 变换矩阵初始化为单位阵。
  • paintRobot 函数用于绘制机器人。
  • 如果还有部位没画,可以递归调用 paintRobot 函数。

伪代码如下:

void paintRobot(mat4 modelview) {    /* modelview = modelview * 局部变换矩阵 */    /* 绘制 */    /* 如果还有部位没画,递归调用 */    if (还有部位没画) {        paintRobot(modelview)    }}

同样,如果图元本身还有变换,需要乘上图元本身的模型矩阵。伪代码如下:

void upper_arm() {    mvstack.push(model_view);    mat4 instance = Translate(0.0, 0.5 * UPPER_ARM_HEIGHT, 0.0)                   * Scale(UA_WIDTH, UA_HEIGHT, UA_WIDTH);    glUniformMatrix4fv(ModelView, 1, GL_TRUE, model_view * instance);    colorCube();    glDrawArrays(GL_TRIANGLES, 0, NumVertices);    model_view = mvstack.pop();}

转载地址:http://patg.baihongyu.com/

你可能感兴趣的文章
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
nginx配置全解
查看>>
Nginx配置参数中文说明
查看>>
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>