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

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

 

模型视图变换矩阵:

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无法打开公式插件。

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

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

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

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

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

并且有

那么

再归一化s’

因此

最终矩阵:

投影矩阵:

void APIENTRY gluPerspective (

GLdouble fovy,

GLdouble aspect,

GLdouble zNear,

GLdouble zFar);

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

视口变换矩阵:

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

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

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

Y’=Height-Y

Opengl坐标转换的更多相关文章

  1. OpenGl 坐标转换 (转载)

    OpenGl 坐标转换 (转载) 1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Tr ...

  2. OpenGl 坐标转换

    1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观測变换(ModelView Transformation)和投影变换(Projection Transformation). 做个 ...

  3. OpenGl从零开始之坐标变换

    http://www.tuicool.com/articles/uiayYrI OpenGL学习脚印: 坐标变换过程(vertex transformation) http://blog.csdn.n ...

  4. Python 爬取CSDN博客频道

    初次接触python,写的很简单,开发工具PyCharm,python 3.4很方便 python 部分模块安装时需要其他的附属模块之类的,可以先 pip install wheel 然后可以直接下载 ...

  5. OpenGL【2 坐标转换】

    // OpenGL.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include & ...

  6. OpenGL之坐标转换(好文-清晰版)

    http://blog.csdn.net/zhongjling/article/details/8488844OpenGL之坐标转换(好文-清晰版)

  7. opengl 笔记(1)

    参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test ...

  8. 【转】OPENGL基本API概述

    本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核 ...

  9. OpenGL投影矩阵

    概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...

随机推荐

  1. addEventListener

    addEventListener addEventListener-开始 前面零散地写了些关于 addEventListener 的内容,觉得比较散,有些地方可能也说得不够清楚明白,所以决定以连载的形 ...

  2. [ASP.NET MVC]如何定制Numeric属性/字段验证消息

    原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字, ...

  3. 【麦子学院】OpenCV教程函数总结

    个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...

  4. 用持续集成工具Travis进行构建和部署

    用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...

  5. 如何用CSC.exe来编译Visual C#的代码文件

    原文:如何用CSC.exe来编译Visual C#的代码文件 C#的编译过程      如何用CSC.exe来编译Visual C#的代码文件   Csc.exe 编译器的位置路径:C:\Window ...

  6. C#中float的取值范围和精度

    原文:C#中float的取值范围和精度 float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: floa ...

  7. ASP.NET DataTable的操作大全

    DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在 ...

  8. Java凝视Override、Deprecated、SuppressWarnings详细解释

    一.什么是视线     说起目光,你必须先提什么是元数据(metadata). 所谓元数据是数据的数据.那.元数据是描述数据的叙述. 像在表中的数据字段,叙述了这个字段下的数据的含义.而J2SE5.0 ...

  9. BitMap画图

    package com.example.examples_05_07; import android.content.Context; import android.graphics.Bitmap; ...

  10. Node填坑教程——常用库

    作为函数式编程来说,流程控制和函数库是必不可少的(应该吧). 下面我们介绍两个常用的库. lodash:完整的api请参阅,https://lodash.com/docs.这里我们只演示几个简单的例子 ...