• Opengl坐标转换


    有时候我们需要手动计算三维点对应的二维坐标,下面的矩阵公式就是模拟了一遍三维图形的流程。这里已假设读者具备了图形学的基础知识,比如矩阵乘法代表的三维变换,放射变换;还有齐次坐标等。

    这里不考虑模型自身的旋转平移缩放等,即假设模型三维坐标已知。有坐标:

    image

    模型视图变换矩阵:

    void APIENTRY gluLookAt (

    GLdouble eyex,

    GLdouble eyey,

    GLdouble eyez,

    GLdouble centerx,

    GLdouble centery,

    GLdouble centerz,

    GLdouble upx,

    GLdouble upy,

    GLdouble upz);

    这个矩阵可以参考OpenGL的官网:http://www.opengl.org/sdk/docs/man2/

    最好用IE或者firefox打开,chrome无法打开公式插件。

    这里列出几点需要注意的,官网上没有注意。

    clip_image002

    这是官网上的截图,其中image表示2-范数。另外向量su均需要像fUP一样用2-范数作为商归一化。最终计算一个矩阵,这里热身一下,给出所有推导过程:

    image

    image

    一点理解:f表示视线向量,UP’’表示摄影机朝向的向量,但是可以知道,如果视线向量定了,其实摄影机的角度也就定了,但是摄影机可以绕着以视线方向作为轴进行旋转,所以UP’’向量就是为了固定摄像机用的。其中叉积有这样的一个性质:

    image

    所以如果fUP’’如果是垂直的,那么就不需要进行归一化了,因为fUP’’的长度均为1,他们如果垂直,叉积的长度也为1。但是我们编程中经常使用沿着笛卡尔坐标轴的向量表示摄影机的朝向,所以这里还是需要进行归一化的。s归一化后,sf是垂直的,所以u并不需要再归一化。

    image

    在实际情况中,我们总是往简单的方向设定:

    image

    image

    并且有

    image

    那么

    image

    再归一化s’

    image

    因此

    image

    最终矩阵:

    image

    投影矩阵:

    void APIENTRY gluPerspective (

    GLdouble fovy,

    GLdouble aspect,

    GLdouble zNear,

    GLdouble zFar);

    同样,可以参考官网上API:http://www.opengl.org/sdk/docs/man2/

    clip_image001

    视口变换矩阵:

    WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);

    image

    可以把上式写成矩阵的形式。

    三维坐标经过上诉三个变换,即可变换成为最终二位坐标点。最后仍需注意的是,变换后的坐标原点为窗口左下角,一般图像处理时均是左上角为原点,对Y坐标进行一次变换即可。

    Y’=Height-Y

  • 相关阅读:
    不吐不快之EJB演练——开篇概述
    URL重写:RewriteCond指令与RewriteRule 指令格式
    刚到公司有点压力山大,在此希望有大神给点正能量
    053第449题
    选择排序---简单选择排序 堆排序
    bzoj-1492 货币兑换Cash (2)——CDQ分治
    MySQL 提高Insert性能
    Codeforces Round #313 (Div. 2) 560C Gerald's Hexagon(脑洞)
    Matlab矩阵基础
    Android 带清除功能的输入框控件EditTextWithDel
  • 原文地址:https://www.cnblogs.com/lvfq/p/3453105.html
Copyright © 2020-2023  润新知