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

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

到目前为止,我们建立的模型,其实都是独立的,并没有内在的关联性。通过层级建模,我们可以实现更多精彩的模型联动效果。

图符和实例

我们之前建立了很多模型,包括:

  • 几何对象:物体的几何表示
  • 材质模型:反射系数等
  • 光源模型:光源颜色等
  • 虚拟照相机

对于大多数图形API来说,采取最小完备的观点,即:

  • 只包含少数的基本图元
  • 让用户通过这些基本的图元来构建更复杂的对象,这些基本的图元就被称作图符

在OpenGL应用程序中,必须通过几何变换把图符从建模标架变换到世界标架,得到一个实例

实例变化把每个图符实例按照所需的大小,方向和位置放入到场景中:𝑴= 𝑻𝑹𝑺

在这里插入图片描述

这样就有了模型实例,但对象之间的关系还没建立起,还需要下面的层次建模。

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

层级模型其实核心就是要建立起层次树,需要确定把哪种信息放在节点上,哪种信息放在边上。一般而言,以节点代表要绘制的实例,边上存储变换矩阵。例如:

在这里插入图片描述
对于机器人手臂,部件之间通过关节连接在一起,通过关节角指定模型的状态,最开始有三个模型对象:
在这里插入图片描述
其运动自由度定义为:

  • 支架可以独立旋转
  • 下臂与支架相连,位置与支架旋转有关,会随着支架运动,而它的位置也必须相对于支架平移
  • 上臂与下臂相连,位置与支架和下臂的位置有关,会随着下臂运动,且还应相对下臂平移
实例变换矩阵
  • 支架的旋转:𝑅_b
    M = 𝑅_𝑏应用到支架上
    在这里插入图片描述
  • 下臂相对于支架部分部分平移:𝑇_𝑙𝑎
    下臂绕关节旋转:𝑅_𝑙𝑎
    M=𝑅_𝑏 𝑇_𝑙𝑎 𝑅_𝑙𝑎 应用到下臂上
    在这里插入图片描述
  • 上臂相对于下臂平移:𝑇_𝑢𝑎
    上臂绕关节旋转:𝑅_𝑢𝑎
    M=𝑅_𝑏 𝑇_𝑙𝑎 𝑅_𝑙𝑎 𝑇_𝑢𝑎 𝑅_𝑢𝑎 应用到上臂上
    在这里插入图片描述
    伪代码:
model_view = RotateY(Theta[Base] );  //支架变换矩阵base();   //绘制支架 model_view = model_view * Translate(0.0, BASE_HEIGHT, 0.0) 		              * RotateZ(Theta[LowerArm]);  //下臂变换矩阵lower_arm();  //绘制下臂 model_view = model_view * Translate(0.0, LOWER_ARM_HEIGHT, 0.0) 		              * RotateZ(Theta[UpperArm]);  //上臂变换矩阵upper_arm();  //绘制上臂

这就够了吗?看情况。如果你图元是默认的,这样就好了,但如果图元本身还有变换,则应该乘上图元本身的模型矩阵,伪代码如下:

void upper_arm(){   	mat4 instance =  Translate( 0.0, 0.5 * UPPER_ARM_HEIGHT, 0.0 )                             * Scale(UA_WIDTH, UA_HEIGHT, UA_WIDTH ) ;	//按长宽高缩放正方体,并且平移使得底面在y=0上	glUniformMatrix4fv(ModelView, 1, GL_TRUE, model_view * instance ); 	//将完整的模-视矩阵传给shader	glDrawArrays( GL_TRIANGLES, 0, NumVertices );  //绘制相应的三角面片}

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

我们直接采用树的先序遍历即可:

在这里插入图片描述
以史蒂夫为例,其层次树为:
在这里插入图片描述
其绘制的伪码是:

// modelview初始化是单位阵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 ) ; 	//按长宽高缩放正方体,并且平移使得底面在y=0上 	glUniformMatrix4fv(ModelView, 1, GL_TRUE, model_view * instance );  	//将完整的模-视矩阵传给shader 	colorCube();  // 给部件赋色 	glDrawArrays( GL_TRIANGLES, 0, NumVertices );  //绘制相应的三角面片	model_view = mvstack.pop();  //恢复当前模-视变换矩阵}

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

你可能感兴趣的文章
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos基础版 从入门到精通
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
查看>>
Nacos心跳机制实现快速上下线
查看>>
nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
查看>>
nacos服务提供和发现及客户端负载均衡配置
查看>>
Nacos服务注册与发现demo
查看>>
Nacos服务注册与发现的2种实现方法!
查看>>
nacos服务注册和发现原理简单实现案例
查看>>
Nacos服务注册总流程(源码分析)
查看>>
nacos服务注册流程
查看>>
Nacos服务部署安装
查看>>
nacos本地可以,上服务器报错
查看>>
Nacos注册Dubbo(2.7.x)以及namespace配置
查看>>
Nacos注册中心有几种调用方式?
查看>>
nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
查看>>
nacos源码 nacos注册中心1.4.x 源码 nacos源码如何下载 nacos 客户端源码下载地址 nacos discovery下载地址(一)
查看>>