zoukankan      html  css  js  c++  java
  • 浅谈OpenGL变换矩阵

    OpenGL中使用的矩阵全为列向量为主的矩阵。

    参考OpenGL变换网站为  http://www.songho.ca/opengl/gl_transform.html

    1.什么是GL_MODELVIEW矩阵?

    GL_MODELVIEW矩阵是Model矩阵和View矩阵的乘积,即M_modelview = M_view * M_model。

    model矩阵用于从物体坐标系到世界坐标系的转换,一般是通过旋转、平移或缩放得到。

    view矩阵用于从世界坐标系到摄像机坐标系的转换。

    顶点的矩阵变换如下所示:

    OpenGL中的modelview矩阵(列向量为主):

    2.法向量的坐标转化

    与图1中顶点变换不同,法向量从物体坐标系变换到摄像机坐标系是通过M_modelview逆矩阵的转置实现的。

    法向量的矩阵变换如下所示:

    到此为止,很多人会有疑问:法向量的变换公式是如何得到呢?

    其实法向量变换的公式是根据平面方程的得到,具体推导过程如下:

    已知法向量n(nx,ny,nz,nw),假设平面上的一点为v(x,y,z,w),则平面方程为nx * x + ny * y + nz * z + nw * w = 0;

    将法向量与点的关系转化为矩阵表达形式为:

    通过GL_MODELVIEW矩阵转换得到:

    右边的部分是将顶点从物体坐标系转换到摄像机坐标系,而左边的部分是将法向量转换到摄像机坐标系的表达式,因此

    即:

    参考网站为  http://www.songho.ca/opengl/gl_normaltransform.html

    3.标准设备空间,英文为Normalized Device Coordinates(Or NDC),它是在投影坐标系(剪裁空间)中经过透视除法得到的,其x,y,z的范围均为[-1,1]。

    透视除法英文为perspective division。

    4.glViewport(x,y,w,h) command is used to define the rectangle of the rendering area where the final image is mapped.

    glViewport方法用于定于渲染区域的矩形。

    5.glDepthRange(n,f) command is used to determine the z value of the window coordinates.

    glDepthRange方法用于定义屏幕坐标的z值。

    6.根据4,5可以得到屏幕坐标(screen coordinates):

    7.当多个矩阵共同起作用时,一定要注意矩阵乘法的先后顺序,不同的顺序得到的结果也不同,例如:

    顶点V先进行矩阵M1变换,再经过矩阵M2变换得到顶点V',则在OpenGL中的表达形式为:

    V' = M2 * M1 * V

    1 // 注意:物体实际的顺序为先进性平移再进行旋转
    2 glRotatef(angle, 1, 0, 0);   // 将物体绕X轴旋转anlge
    3 glTranslatef(x, y, z);       // 将物体平移到(x, y, z)
    4 drawObject();

    8.投影矩阵

     OpenGL中的投影方式分为两种:透视投影和平行投影(也叫正交投影),是通过left,right,bottom,top,near,far六个参数计算得到的。

    具体内容可参见下一篇博客,未完待续.....

  • 相关阅读:
    Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
    IOC的优点是什么?
    《精益软件开发管理之道》阅读笔记02
    每日日报18
    每日日报17
    ecplise中没有Java Application的解决办法
    HTML+CSS+div 制作简单的登录界面
    HTML+CSS:通过li标签制作导航条
    每日日报16
    用Python爬取最新疫情数据(使用PyCharm)
  • 原文地址:https://www.cnblogs.com/calence/p/5863060.html
Copyright © 2011-2022 走看看