模型使用和渲染

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24634505/article/details/88949197

基础知识

坐标系统
  • 局部坐标
    是指对象所在的坐标空间。
  • 世界坐标
    局部坐标到世界坐标的转换由模型矩阵完成。
  • 观察空间(camara space/eye space)
    观察空间就是将对象的世界空间坐标转换为观察者视野坐标,由viewMatrix进行变换,新坐标是相对于摄像机的位置和方向的。
  • 剪裁空间
    顶点着色器完成从对象坐标系到剪裁坐标系的转换。在顶点着色器的最后,所有在NDC外的坐标都会被裁掉。透视投影矩阵会修改每个顶点坐标的w值,使离观察者越远的顶点坐标w分量越大。x、y、z坐标都会跟w坐标进行比较,大于w或小于-w的坐标都会被剪裁掉。(先裁剪再投影)写的时候把所有坐标都放在-1到1中间会很不直观,所以投影矩阵会帮我们把指定范围内的三维坐标转换到二维标准化坐标系中。(但是如果只是片段的一部分在窗口外,opengl会重新构造一个三角形面片)
  • 屏幕空间
    经过转换的坐标将被映射到glViewPort定义的屏幕空间,并被转化为片元(视口转换)。
线性代数的几何意义
  • 线性空间
    空间是一个对象集合,可以容纳对象的运动。线性空间中的任何一个对象都可以通过选取基向量构成的多项式来表达为向量的形式

  • 一组基是一组线性无关的向量,n个基构成n维坐标系,每一个基对应一个坐标轴。正交基的模不为一说明局部坐标系存在缩放。
  • 矩阵
    空间中向量可以描述任意一个对象,矩阵可以描述该空间中的任何一个运动。用矩阵乘以向量使变换被施加到对象上。固定坐标系下对象的变换等价于固定对象所处坐标系的坐标系变换。
    齐次坐标的意义:在3D向量上进行位移(如果没有w分量我们是不能位移向量的),创建透视效果。
  • 向量
    点乘计算夹角,叉乘计算正交于两个输入向量的第三个向量。
obj格式
# obj对应的材质文件
# mtllib testvt.mtl
# 组名称
g default
# o 对象名称(Object name)
o testvt.obj
# 顶点
v -0.5 -0.5 0.1
v -0.5 -0.5 -0.1
v 0 0.5 0.1
v 0 0.5 -0.1
v 0.5 -0.5 0.1
v 0.5 -0.5 -0.1
# 纹理坐标
vt 0 1
vt 1 1
vt 0.5 0
# 顶点法线
vn 0 0 1
vn 0 0 -1
# 当前图元所用材质
usemtl Default
# s Smooth shading across polygons is enabled by smoothing groups.
# Smooth shading can be disabled as well.
s off
# v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3(索引起始于1)    
f 1/1/1 5/2/1 3/3/1
f 6/2/2 2/1/2 4/3/2
mtl格式
# 定义一个名为 'xxx'的材质
newmtl xxx
# 材质的环境光(ambient color)
Ka 0 0 0
# 散射光(diffuse color)用Kd
Kd 0.784314 0.784314 0.784314
# 镜面光(specular color)用Ks
Ks 0 0 0
# 折射值 可在0.001到10之间进行取值。若取值为1.0,光在通过物体的时候不发生弯曲。玻璃的折射率为1.5。
Ni 1
# 反射指数 定义了反射高光度。该值越高则高光越密集,一般取值范围在0~1000。
Ns 400
# 滤光透射率
Tf 1 1 1
# 渐隐指数描述 参数factor表示物体融入背景的数量,取值范围为0.0~1.0,取值为1.0表示完全不透明,取值为0.0时表示完全透明。
d 1
#指定光照模型
illum 2
# 为漫反射指定颜色纹理文件
map_Kd test_vt.bmp
#高光贴图
map_Ks lenna.tga
# alpha通道贴图
map_d lenna_alpha.tga
#凹凸贴图
map_bump a.tga

在opengl中使用三维模型

模型在三维世界中的表达有几个重要的属性:位置、大小、朝向,分别对应平移、缩放、旋转。矩阵乘法有结合律,不满足交换律,应用变换的顺序是缩放->旋转->平移。

  • 注意:
    1、处理模型时最好保证所有模型的正方向朝向同一个轴。
    2、为了保证模型在opengl中显示正确最好在模型编辑软件中对模型的修改历史进行塌陷。骨骼蒙皮后不能再对模型修改历史进行塌陷,应当在骨骼蒙皮前塌陷历史。
    3、导出模型前应当对编辑器栅格单位进行设置,导出模型时设置模型单位。
    4、导出fbx格式时应注意导出位置和纹理所在路径的关系,使用模型时要保持相对路径正确。

  • 常见的错误:

  • 模型消失:

    • 模型环节:
      1、模型单位错误或父子节点变换矩阵设置错误,导致模型比例不对或部分网格看起来像消失了一样,可以通过在maya中将模型导出为ASCII码格式查看模型详细信息。
      2、所有涉及资源读取的问题首先确保资源数据正确、读入正确!如资源文件中是否存在多余空行等。或文件在C盘可能导致读取权限受限。有时看起来大部分material和纹理读入都是正确的,但渲染时使用的偏偏只有错误的那一个material,可能需要跟踪到渲染时到底使用了哪个material。
      3、对于含有骨骼动画的模型,渲染时会将骨骼变换矩阵传到shader中,如果骨骼数据错误或者为空、或以错误的骨骼名获取骨骼也会导致模型消失。
      4、modelMatrix设置错误。同理模型运动过程中也需考虑是否插值的delta_time或错误的插值端点等导致动画效果异常,模型看起来消失了。
      5、渲染流程中是否有其他的条件判定影响渲染结果,如viwo中的模型按照物体距相机的位置进行排序渲染。
    • 渲染环节:
      6、用glGetError检查,渲染过程是否有错误。1282是invalid operation或invalid value,可能是shader链接错误或者使用glUniform传值前没有调用glUseProgram。(有时缺一个shader都能愉快的返回programId,并getUniformLocation)
  • 模型效果错误:
    1、如果用不一致缩放矩阵对模型进行了缩放,则要注意对法线归一化。
    2、模型纹理贴图看起来不对,或用了别的模型的纹理可能是纹理文件路径错误textureId为0。注意fbx导出时必须注意模型和纹理的相对位置关系

模型单位和比例

  • 比例
    viwo通过计算米/像素这个值来决定视点所在层次,保持比例。有时可以认为opengl中的一个单位为1米,屏幕分辨率和视景体参数共同决定一个单位对应多少像素。
  • 单位
    maya本来的单位是cm,还是应该设为cm并且导出的时候也导出cm。opengl只关心物体在坐标系中的坐标,并不关心这个坐标的单位是什么。也即(系统是cm,导出是cm)和(系统是m,导出是m)对opengl来说没有差别,只是maya在导出的时候会给模型标记一个缩放因子,在assimp读取模型的过程中这个因子会被乘到节点的变换矩阵里。
    ZupToYup
    注意不同系统中坐标系的不同。Z轴朝上到Y轴朝上的变换矩阵为{1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1};

骨骼动画

骨骼动画的本质是以矩阵变换描述模型的运动。
读取模型时可以读取到每个骨骼的关键帧,即若干个变换矩阵。网格上的每个顶点对于每个骨骼有一个权重数据,表示该骨骼对该顶点的影响因子。也即每个顶点的数据如下图

播放动画时,根据每个关键帧的时间戳在矩阵之间进行插值。一个骨骼的变换等于其父节点(node)的变换乘以子节点的变换再乘以其骨骼变换(bone)。

注意:
在maya中检查网格、父节点、定位器的变换,//慎重对变换进行冻结,删除历史。assimp导入的时候会自己把所有变换都拆开,(比如一个位置不在原点的车轮,虽然其在maya中被冻结变换,所有平移旋转都为0,但其相对原点还是有个偏移,这在导入assimp时被赋上多个虚拟父节点,名字加上后缀,如assimp_rotaionOffset,scaling等等)需要对最顶层的节点进行变换。

工具库

  • assimp
    支持多种格式的模型和纹理文件读取,可以在读取时对模型进行三角化、清除无用材质等设置。模型数据以节点为单位进行组织,每个节点包含一个模型变换矩阵和n个网格,以及若干个子节点。网格中包含的是模型的顶点、纹理、法线数据,存储数据个数和下标偏移量。
  • lib3ds
  • glm
    弧度角度相互转化
    注意很多数学库的旋转API使用的是弧度。

角度转弧度:(角度/180)*PI
孤独转角度:(弧度/PI)*180

glm::rotate函数使用
注意第二个参数必须是float!

ref

[1]王定桥的博客:https://blog.csdn.net/wangdingqiaoit/article/details/51879737
[2].obj 和 .mtl文件格式:https://www.jianshu.com/p/b52e152d44a9

猜你喜欢

转载自blog.csdn.net/qq_24634505/article/details/88949197