透视投影

计算机图形学:基本变换

放肆的年华 提交于 2020-02-23 17:39:03
基本变换 1 基向量的变换 1.1 基向量的变换 初始基向量为 i ^ ( 1 , 0 ) , j ^ ( 0 , 1 ) \hat{i}(1,0),\hat{j}(0,1) i ^ ( 1 , 0 ) , j ^ ​ ( 0 , 1 ) ,经过变换后变为 i ^ ( 3 , − 2 ) , j ^ ( 2 , 1 ) \hat{i}(3,-2), \hat{j}(2,1) i ^ ( 3 , − 2 ) , j ^ ​ ( 2 , 1 ) 1.2 线性变换对向量的作用 仅需取出向量的坐标,将它们分别于矩阵的特定列相乘,然后将结果相加即可 逆时针旋转90°的例子 当两个向量变为线性相关时,两个向量共线,二维空间会被挤压到一维 2 Transformation Classification(分类) 2.1 Rigid-body Transformation (刚体变换) 物体本身的长度、角度、大小不会变化包括: Identity(不变) Translation(平移) Rotation(旋转) 以及他们的组合 2.2 Similarity Transformation(相似变换) 保持角度 Identity(不变) Translation(平移) Rotation(旋转) Isotropic Scaling(均衡缩放) 以及他们的组合 2.3 Linear

OpenGL视点变换,模型变换,投影变换,视口变换详解

荒凉一梦 提交于 2020-02-23 03:40:31
OpenGL视点变换,模型变换,投影变换,视口变换详解 http://blog.csdn.net/yhb5566/article/details/7714319 作者:luck_net | 出处:博客园 | 2012/2/22 14:46:49 | 阅读112次 OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。理解掌握了有关坐标变换的opengl图片内容,就算真正走进了精彩地三维世界。 一、OpenGL中的三维物体的显示 (一)坐标系统 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。 为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。世界坐标系是始终固定不变的。 OpenGL还定义了局部坐标系的概念,所谓局部坐标系,也就是坐标系以物体的中心为坐标原点,物体的旋转或平移等操作都是围绕局部坐标系进行的,这时,当物体模型进行旋转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。需要注意的是,如果对物体模型进行缩放操作,则局部坐标系也要进行相应的缩放,如果缩放比例在案各坐标轴上不同

旁观OpenGL里的透视投影矩阵

一笑奈何 提交于 2020-02-06 11:58:04
OpenGL里的代码已经形成和使用了好多年,从程序员的角度,对OpenGL底层代码做升级或修改的实际意义并不大,而且风险高。所以,修改底层算法的想法是有些太狂了。但是,从教学的角度、提供一种新的视角去理解、或者重新再解读前人代码字里行间潜在的、独立于代码作者的理解而存在的深意,应该是值得探讨探讨的。这就是旁观了,观棋不语真君子,实在手痒拿起棋子、自己从头用代码把等价的功能重新实现一遍,或者是可能的。 我记得当年刚学Turbo Pascal /Turbo C 2.0编写几何变换程序的时候,我感觉 “平行投影”、尤其三维空间里向 x O y xOy x O y 坐标平面的正平行投影是毫无意义、根本不需要存在的,而且我自己也完全没有意识到它存在就已经开始画图了。因为获得三维的点坐标 ( x , y , z ) (x,y,z) ( x , y , z ) 之后,直接从代码里面拿 ( x , y ) (x,y) ( x , y ) 的数据来用就是了,谁还管它投影不投影?头晕不头晕、麻烦不麻烦? 从很多国内搞图形学的研究者们发表的文章里来看,即使认识到齐次坐标和齐次矩阵表示几何变换的重要性和有用性,大家也一直并不严格区分降秩的投影和非降秩的几何变换。所以,概念的理解上至少在不少实用派的人的认识中实际是一直处于混乱状态,但这不意味着所有的人都糊涂。但糊涂的人多了,带着这种糊涂认识的文章

openGL两种投影方式

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-31 05:20:14
from http://hi.baidu.com/fcqian/blog/item/cc5794ec76807a3f27979131.html 投影变换是一种很关键的图形变换, OpenGL中只提供了两种投影方式,一种是正射投影, 另一种是透视投影。不管是调用哪种投影函数,为了避免不必要的变换,其前面必须加上以下两句: glMAtrixMode(GL_PROJECTION); glLoadIdentity(); 事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。本节将详细讲述投影变换的概念以及用法。 1 正射投影(Orthographic Projection) 正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图 所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大 小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。 此种模式下,不需要设定照相机位置、方向以及视点的位置,也就是说不需要gluLookAt函数。 OpenGL正射投影函数共有两个。 一个函数是: void glOrtho(GLdouble left,GLdouble right,GLdouble bottom

transformjs玩转星球

放肆的年华 提交于 2020-01-15 05:48:06
如你所见。这篇就是要讲下使用 transformjs 制作星球的过程。你也可以无视文章,直接去看源码和在线演示: 源码 | 在线演示 代码100行多一点,直接看也没有什么压力。下面分几步讲解下。 生成球上点坐标 设球心为 (a,b,c),半径为r, 则球的标准方程为 (x-a)²+(y-b)²+(z-c)²=r² 这里假设球心的(0,0,0),则: 标准方程为 x²+y²+z²=r² 因为可以渲染的时候再把球的本地坐标转为世界坐标进行位移,所以球心(0,0,0)便可以。 function randomPoints() { var x, y, z, j = -1, i = 0; for (; i < size; i++) { x = getRandomNumber(-250, 250); y = getRandomNumber(-250, 250); j *= -1; if (x * x + y * y <= r * r) { z = j * Math.sqrt(Math.abs(r * r - x * x - y * y)); positions.push({x: x, y: y, z: z}); rd_positions.push({x: x, y: y, z: z}); } } } 上面的生成过程很取巧: 1.随机生成2D内的圆内的坐标x和y。(x * x + y * y <=

unity中的透视投影矩阵

て烟熏妆下的殇ゞ 提交于 2020-01-06 04:35:36
一,unity中的Matrix4x4 例如一个矩阵的数据是: 0.9758,0,0,0,0,1.73205,0,0,0,0,-2.25,-16.25,0,0,-1,0 则实际矩阵是: M= m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33 = 0.9758 0 0 0 0 1.73205 0 0 0 0 -2.25 -16.25 0 0 -1 0 即将数据一行一行、每行四个写出来形成的矩阵。 Matrix4x4是列主序,即跟opengl一样,使用时是列向量左乘矩阵M*v这种形式。 二,unity中的透视投影矩阵 经过试验,unity中的透视投影矩阵公式与opengl中完全一样,为: 例如前面的矩阵M,便是 near=5 far=13 fov=60 aspect=1.775 时的投影矩阵。 来源: https://www.cnblogs.com/wantnon/p/7248999.html

3/4、事例三、四:透视投影(Perspective)、正射投影(Ortho)

谁都会走 提交于 2020-01-06 04:35:03
namespace sharpGLTest03 { // 主表单类 public partial class SharpGLForm : Form { /// <summary> /// Initializes a new instance of the <see cref="SharpGLForm"/> class. /// </summary> public SharpGLForm() { InitializeComponent(); } // 处理OpenGL控件的OpenGLDraw事件 // "sender":事件的来源 // "e":包含事件数据的实例 private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e) { // 获取OpenGL对象 OpenGL gl = openGLControl.OpenGL; // 清除颜色和深度缓冲区 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // 加载单位矩阵 gl.LoadIdentity(); // 围绕Y轴旋转 //gl.Rotate(rotation, 0.0f, 1.0f, 0.0f); // 画一个彩色的金字塔 gl.Begin(OpenGL.GL

OpenGL投影矩阵

落爺英雄遲暮 提交于 2020-01-06 04:33:14
概述 透视投影 正交投影 概述 计算机显示器是一个2D平面。OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上。GL_PROJECTION矩阵用于该投影变换。首先,它将所有定点数据从观察坐标转换到裁减坐标。接着,这些裁减坐标通过除以w分量的方式转换到归一化设备坐标(NDC)。 因此,我们需要记住一点:裁减变换(视锥剔除)与NDC变换都保存在GL_PROJECTION矩阵中。下述章节描述如何从6个限定参数(左、右、下、上、近平面、远平面)构建投影矩阵。 注意,视锥剔除(裁减)在裁减坐标上执行,并且在除以w c 之前。裁减坐标x c 、y c 、z c 会与w c 做比较检测。如果任一坐标小于-w c 或大于w c ,则该顶点将会抛弃。 接着,OpenGL重新构建那些裁减掉的多边形的边。 被视锥裁减的三角形 透视投影 OpenGL透视视锥体与NDC 在透视投影中,截棱锥体(观察坐标)中的3D点会被映射到立方体(NDC)中。x坐标的范围从[l,f]到[-1,1],y坐标的范围从[b,t]到[-1,1],z坐标的范围从[n,f]到[-1,1]。 注意,观察坐标为右手坐标系,NDC使用左右坐标系。也就是说,位于原点的照相机在观察坐标中看向-Z轴,而在NDC中看向+Z轴。因为glFrustum()只接收正的近平面与远平面距离值,我们需要在构建GL

透视投影(Perspective Projection)变换推导

﹥>﹥吖頭↗ 提交于 2020-01-06 04:32:41
透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(„) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游 戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地 方全部找到,但是你现在找到了)。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考 可以找到一组坐标(v1,v2,v3),使得 v = v1 a + v2 b + v3 c (1) 而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得 p –

OSG 两个相机

独自空忆成欢 提交于 2019-12-20 21:09:58
在场景中创建两个视口。其中一个用于从坦克驾驶员的视角观察场景。该视口将被渲染于屏幕的上半部分。第二个视口由缺省的osgViewer::Viewer类接口(轨迹球,飞行等控制器)控制。它将被渲染于屏幕的中下部分。 概述: OSG向开发人员提供了各种的抽象层次接口。前面的教程讨论的主要是一些较高层级的接口应用:例如使用Viewer类来控制视点,场景,交互设备和 窗口系统。OSG的优势之一,就是可以允许开发者在使用高层次的接口的同时,访问较低层次的抽象接口。本章将使用一些低抽象层级的功能,对视点进行控制, 并使用相应的类渲染场景。 代码: 为了创建两个视口,我们需要提供两个独立可控的摄像机。与OSG 1.2版本中所述不同的是,本例中将不再使用Prodecer::CameraConfig类,而是将多个不同的视口添加到组合视口 CompositeViewer类当中。下面的函数即用于实现添加视口并设置其中的摄像机位置。 void createView (osgViewer::CompositeViewer *viewer,//查看器,一个相框 osg::ref_ptr<osg::Group> scene,//场景 osg::ref_ptr<osg::GraphicsContext> gc,//显示设置定义相框的大小,View和Viewr在屏幕上的大小,位置 osgGA: