首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在OpenGL中,为什么我的相机可以看到z=-1或z=0,但不能看到z=-2?

在OpenGL中,相机的视锥体定义了可见的场景空间范围。视锥体由近裁剪面和远裁剪面组成,它们分别定义了相机能够看到的最近和最远的距离。

当相机看到z=-1或z=0时,这意味着这些点位于近裁剪面上或者稍微远离近裁剪面。因为近裁剪面是相机视锥体的一部分,所以相机可以看到这些点。

然而,当相机看不到z=-2时,这意味着这个点位于远离远裁剪面的位置。远裁剪面定义了相机能够看到的最远距离,超出这个距离的点将不可见。

这种行为是因为OpenGL使用透视投影来模拟相机的视觉效果。透视投影会将场景中的点从三维空间映射到二维屏幕上,同时考虑到距离的因素。远离相机的点在透视投影中会被压缩到屏幕上的较小区域,超出远裁剪面的点将被裁剪掉,因此无法看到。

总结起来,相机能够看到的点取决于其位置相对于近裁剪面和远裁剪面的位置。只有位于这两个裁剪面之间的点才会被渲染到屏幕上。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OpenGL矩阵变换的数学推导

说起OpenGL的矩阵变换,我是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,一直想写这篇文章,由于很忙(lǎn),拖了很久,再不写我自己也要忘了。...缩放变换 旋转变换         1)绕x轴旋转          2)绕y轴旋转           3)绕z轴旋转 大家可以看到旋转变换有三个矩阵?...我们用一个括号把其中一个部分括了起来,外面乘了一个因子(-1/z0),后面会说这个因子是什么东西,现在只需要知道,x2、y2实际上就是前面括号里那堆东西,所以上面投影矩阵的第一行和第二行就自然能轻松地构造出来...还记得括号外面乘了一个因子(-1/z0)吗?乘(-1/z0)可以看成是除以-z0,因此希望w就是-z0,于是构造第四行让w的计算结果为-z0: 接下来就是最复杂的第三行,如何去构造第三行?...对于解方程来说,在能解决问题的情况下,未知数能少就尽量少,不然只会徒增烦恼。 这里其实不需要4个未知数,为什么呢?

1.1K30

OpenGL矩阵变换的数学推导

说起OpenGL的矩阵变换,我是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,当时一开始时,也只是知道怎么去用这些矩阵,却不知道这些矩阵是怎么得来的,当出现一些莫名其妙的问题时...: [jnld1f89l0.jpeg] 完成投影变换就需要靠投影矩阵,即图中的PROJECTION MATRIX 我看可以从图中看到经过投影变换后就到了裁剪坐标系CLIP SPACE,什么?....jpeg] 3) 绕z轴旋转 [0invbt2ppb.jpeg] 大家可以看到旋转变换有三个矩阵?...乘(-1/z0)可以看成是除以-z0,因此希望w就是-z0,于是构造第四行让w的计算结果为-z0:  [cgovel2fhk.jpeg] 接下来就是最复杂的第三行,如何去构造第三行?...对于解方程来说,在能解决问题的情况下,未知数能少就尽量少,不然只会徒增烦恼。 这里其实不需要4个未知数,为什么呢?

6.6K62
  • 【GAMES101-现代计算机图形学课程笔记】Lecture 04 Transformation Cont.

    (projection transformation) 2.1.1 相机的定义 那么相机需要定义如下几个向量: position \vec{e} : 即我的相机摆在什么位置 look-at / gaze...: image.png OpenGL 采用的是左手系,所以上面式子中的负号可能相反但不影响理解。...比如 [1,0,0,1] 和 [2,0,0,2] 表示的是同一个点 (1,0,0) 。 下图给出了透视投影(frustum,平截头体)和正交投影的投影例子(Cuboid)。 ?...可以看到透视投影其实就是将右边平面(即( f )远平面)的东西投影到左边平面(即近( n )平面),所有投影的线最后都相交于一个点,即视点。而正交投影的投影线互相之间是平行的。...下面我们从侧面来观察远近平面投影特点(看视频的时候我一直以为Q点是P点挤压后得到的点,其实P'才是,Q是P'在近平面上的投影点): original point坐标为 P=(x,y,z) ,transformed

    1.8K20

    OpenGL 学习系列---观察矩阵

    在 OpenGL 投影矩阵 这篇文章中,讲述了 OpenGL 坐标系统中的投影矩阵,有两种类型的投影矩阵,分别是正交投影和透视投影。...比如,假设此时摄像机位于彩色小球的上面,那么整个视景体就是垂直立起来了的,所观察到的小球也是朝上的那一面了。 所以,可以看到相机的位置和朝向,决定了视景体在什么位置和什么朝向展开。...在 OpenGL 坐标系统的转换公式中也可以印证这一点: ?...Matrix.lookAt 函数 从上面的内容可以看到,只要知道了相机坐标点,以及观察的点,还有辅助的上向量,就可以确定相机的坐标系了。...小结 通过上面的例子,就应该对 OpenGL 中的相机有一个更加清晰的认识了。

    2.4K30

    Android OpenGL 介绍和工作流程(十)

    OpenGL是什么? 简单来说OpenGL API是一套接口,通过这套接口我们可以在那些支持OpenGL的机器上对图形硬件设备特性进行访问,例如在电脑屏幕或手机屏幕上进行图形绘制。...OpenGL绘制过程 其实在OpenGL中,所有物体都是在一个3D空间里的,但是屏幕都是2D像素数组,所以OpenGL会把3D坐标转变为适应屏幕的2D像素。...而顶点数据是用顶点属性表示的,它可以包含任何我们常用数据,比如顶点的位置和颜色 我们可以观察上图,在OpenGL中的物体是有重多的顶点表示的三角形共同构成。...由于这个过程在OpenGL ES中是自动进行的,我们不需要针对它来编程,因此我们经常把它和投影变换放在一起来理解。我们可以不太严谨地暂且认为,相机坐标经过了一个投影变换,就直接得到NDC了。...它才是真正的由OpenGL ES来定义的坐标。在NDC的定义中,x、y、z各个坐标都在[-1,1]之间。

    2.3K50

    【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】二、使用OpenGL渲染视频画面

    一、渲染视频画面 在第一篇文章【音视频基础知识】文章中,就介绍过,视频其实就是一张张图片组成的,在上文【初步了解OpenGL ES】中,介绍了如何通过OpenGL渲染一张图片,可以猜想到,视频的渲染和图片的渲染应该是差不多的...人看到的物体是投影在视网膜上,相机看到的则是投影在近平面(距离相机比较近的平面)上的成像。...OpenGL 世界坐标系 那么相机坐标可以是(0,0,5),也就是位于Z轴上的一个点。...比如可以将相机的朝向设置为(0,1,0),这个时候,相机位于(0,0,5),向上方向为Y轴,这时候,相机正好看到XY组成的平面,是画面的正面。...正交投影矩阵 可以看到其实就是生成了一个缩放矩阵,由于z和w都是0,所以可以忽略后面两列。

    2.3K30

    OpenGL坐标系及坐标转换

    左图——相机模拟OpenGL中的各种坐标变换 从三维物体到二维图象,就如同用相机拍照一样,通常都要经历以下几个步骤: 1、将相机置于三角架上,让它对准三维景物,它相当于OpenGL中调整视点的位置,即视点变换...2、将三维物体放在场景中的适当位置,它相当于OpenGL中的模型变换(Modeling Transformation),即对模型进行旋转、平移和缩放。...1、模型平移 glTranslate{fd}(TYPE x,TYPE y,TYPE z); 该函数用指定的x,y,z值沿着x轴、y轴、z轴平移物体(或按照相同的量值移动局部坐标系)。...2、模型旋转 glRotate{fd}(TYPE angle,TYPE x,TYPE,y,TYPE z); 该函数中第一个变量angle制定模型旋转的角度,单位为度,后三个变量表示以原点(0,0,0)...在OpenGL中,除了视景体定义的六个裁剪平面(上、下、左、右、前、后)外,用户还可自己再定义一个或多个附加裁剪平面,以去掉场景中无关的目标,如下图——《附加裁剪平面》所示。 ?

    4.2K71

    WebGL简易教程(五):图形变换(模型、视图、投影变换)

    其中模型变换、视图变换、投影变换是我们自己在着色器里定义和实现的,而视口变换一般是WebGL/OpenGL自动完成的。这就好像我们拍照的时候,需要自己去调整位置,相机镜头焦距,而成像的过程就交给相机。...这一步由WebGL/OpenGL自动完成。 在参考文献[2]中描述的WebGL/OpenGL整个图形变换过程的坐标系和单位: ?...以绕Z轴旋转为例,在Z轴正半轴沿着Z轴负方向进行观察,如果看到的物体是逆时针旋转的,那么就是正旋转,旋转方向就是正的,旋转值就是正数;反之如果旋转值为负数,说明旋转方向就是负的,沿着顺时针旋转。...在WebGL/OpenGL中,透视投影就决定了一个视点、视线、近裁剪面、远裁剪面组成的四棱椎可视空间。如图所示: ?...在实际使用中,图形矩阵库(我这里用的WebGL的cuon-matrix.js)一般都会提供类似setPerspective()的函数,具体定义如下: ?

    2.9K40

    附加实验2 OpenGL变换综合练习

    1.实验目的: 理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。 2.实验内容: (1)使用图a中的尺寸绘制小桌,三维效果图见图b。...要求绘制小桌各部件时只能使用函数glutSolidCube()和变换函数,不能使用函数glVertex()等直接指定顶点位置; (2)添加键盘按键或右键菜单控制实现小桌效果图在正投影和透视投影模式间的切换...图一、相机模拟OpenGL中的各种坐标变换 从三维物体到二维图象,就如同用相机拍照一样,通常都要经历以下几个步骤: 1、将相机置于三角架上,让它对准三维景物,它相当于OpenGL中调整视点的位置,即视点变换...3、选择相机镜头并调焦,使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(Projection Transformation),OpenGL中投影的方法有两种...所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。

    1.4K30

    Android开发笔记(一百五十四)OpenGL的画笔工具GL10

    // 设置输出屏幕大小 gl.glViewport(0, 0, width, height); 2、调整镜头参数 框住了绘图区域,还要把三维物体在二维平面上的投影一点一点描绘进去才行,...对于镜头的焦距而言,拍摄同样尺寸的照片,广角镜头看到的景物比标准镜头看到的景物更多,这意味着单个景物在广角镜头中会比较小,从而照片面积不增大、容纳的景物却变多了。...对于镜头的视距而言,它表示镜头的视力好坏,即最近能看到多近的景物,最远能看到多远的景物。在日常生活当中,每个人的睫毛离自己的眼睛太近了,这么近的东西能看得清楚吗?...在OpenGL中,这些镜头参数的调节依赖于GL10的gluPerspective方法,具体的参数调整代码举例如下: // 设置投影矩阵,对应gluPerspective(调整相机参数)...第二到第四个参数为相机的位置坐标,第五到第七个参数为相机画面中心点的坐标,第八到第十个参数为朝上的坐标方向,比如第八个参数为1表示x轴朝上,第九个参数为1表示y轴朝上,第十个参数为1表示z轴朝上

    1.3K20

    【笔记】《计算机图形学》(7)——观察

    1.相机变换部分 上图左数的两个步骤,对于一个世界坐标系空间中的物体,我们将虚拟摄像机相机旋转和移动到需要的角度上,然后把物体的顶点坐标从世界坐标系转到相机坐标系中 2.投影变换部分 中间的步骤,把那个横着的金字塔形视体压缩为下面规范视体的形状...这里的0.5是3.2提到的过冲问题引起的,n是在x或y轴上的像素长度,这部分可以对照前面3.2的图来看 ?...上面的图是一个标准的正交投影的形式,在这里我们可以看到相机由相机自己的相机坐标系和一个立方体形的视体组成,在这幅图中就提出了几个问题: 此处相机坐标系为什么z轴正方向和视体不在同一个方向上?...矩阵的1,2,4行明显就是上面那个不完整的投影矩阵的形式,经过齐次化后,我们成功让xy值都变成了我们想要的样子,而第3行是为了保持z深度值顺序且保证z可以被映射到[n,f]区间中的妥协 ? ?...为什么我们要把z映射到[n,f]中?

    2.1K20

    图形渲染管线简介_渲染流水线和渲染管线

    每哪一个被使用了,如果我们沿着渲染管线走,我们得到的齐次坐标下的顶点集,这将会被用于检测相机是否可以看到它们。...假设场景被渲染进一个窗口,其中两个为\((x_1, y_1)\)和\((x_2, y_2), x_1 2, y_1 2\)。屏幕映射是一个伴随着缩放操作的变换。...\(z\)坐标(OpenGL:\([-1, 1]\), DirectX: [0, 1])被映射到\([z_1, z_2]\),默认情况下\(z_1 = 0, z_2 = 1\) (可以调用 API修改值...在所有图形APIs中像素的位置的横坐标都是从左向右逐渐变大的,但纵坐标0点的位置在OpenGL和DirectX中是不一致的。...这意味着当整个场景被渲染后,color buffer中存储的应该是在相机视点可见的场景中的primitive的颜色。

    1.3K40

    实验6 OpenGL模型视图变换

    3.实验原理:   首先来简单了解计算机图形学中四个主要变换概念:   (1)视图变换:也称观察变换,指从不同的位置去观察模型;   (2)模型变换:设置模型的位置和方向,通过移动、旋转或缩放变换,...下面是这些变换函数使用时需要注意内容:   (1)在OpenGL程序中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。   ...如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向,即照相机位于原点,指向z轴负方向,朝上向量为(0,1,0)。...在深度测试算法中,通过扫描投影在xOy平面上每一点的z坐标的大小,确定遮挡关系,只显示z坐标小的像素,进而完成遮挡效果。...[0], center[1], center[2], 0, 1, 0); // 场景(0,0,0)的视点中心 (0,5,50),Y轴向上 //三个数组代表的分别是:相机在世界坐标中的位置

    2.1K30

    基础渲染系列(一)图形学的基石——矩阵

    本文重点内容: 1、创建一个立方体构建的Grid网格 2、支持缩放、位移、旋转 3、变换矩阵 4、创建简单的相机投影 译注:从原创作者博客转为公众号文章非常复杂,我需要先将原文翻译一遍,然后在公众号再排版一遍...这样就可以在保持播放模式的同时使用Transform组件,并立即看到结果。 为什么使用List而不是数组? GetComponents方法的最直接的版本只是返回一个包含请求类型的所有组件的数组。...由于圆周的长度等于圆半径的2π倍,因此1个弧度等于π/ 180度。 在这里你还可以看到π的定义。 它是圆的周长与其直径之比。 很高兴我们找到了一种旋转(1,0)和(0,1)的方法,但是旋转任意点呢?...Unity使用矩阵求逆来做同样的事情。 5.2 透视摄像机 正交摄影机很好,但不能像我们看到的那样显示世界。 为此,我们需要一个透视相机。 由于视角的原因,距离较远的事物对我们来说显得较小。...我们可以根据点与相机的距离缩放比例来重现此效果。 将所有内容除以Z坐标。 我们可以用矩阵乘法吗? 是的,通过将单位矩阵的底部行更改为[0,0,1,0]。 这将使结果的第四个坐标等于原始Z坐标。

    5K23

    Three.js入门

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。你可以在它的主页上看到许多精采的演示。...(1) 声明全局render对象; (2) 获取画布的高和宽; (2) 生成渲染器对象 (3) 指定渲染器的高宽(一般跟画布框大小一致); (4) 追加canvas元素到canvas3d元素中; (5)...renderer.setClearColorHex(0xFFFFFF,1.0); //设置canvas背景色 } 2.设置摄像机camera OpenGL(WebGL)中...(1) 声明全局的变量(对象); (2) 设置透视投影的相机; (3) 设置相机的位置坐标; (4) 设置相机的上为「z」轴方向; (5) 设置视野的中心坐标。...和OpenGL一样、在一个场景中可以设置多个光源。 基本上,都是环境光和其他几种光源进行组合。 如果不设置环境光,那么光线照射不到的面会变得过于黑暗。

    7.8K92

    OpenGL3D迷宫场景设计「建议收藏」

    ,可以加环境光G_AMBIENT、漫射光GL_DIFFUSE或镜面光GLSPECULAR,可以同时加8个光源,上面的光源时GL_LIGHT0,其他的就是GL_LIGHT1、2等。...3)显示列表 显示列表是OpenGL提供的一种方便反复调用相同的显示函数的方法,比如你的程序中需要反复的描绘一个物体,你就最好用显示列表来调用,这样做能够大大优化性能。...先理解一下gluLookAt函数,我的程序里参数是这样的gluLookAt(x, y, z, x + lx,y + ly,z + lz,0.0f,1.0f,0.0f) 总共有9个参数,前三个参数代表了照相机的位置...,所以这里照相机的位置是(x,y,z),接下来三个参数是目标的中心位置,即(x+lx, y+ly,z+lz),后面三个参数一般设为0, 1, 0,表示的是照相机头部的方向,如果把照相机看错人眼,那照相机头部的方向也就是我们头的方向...glLoadIdentity(); gluLookAt(x, y, z, x + lx,y + ly,z + lz, 0.0f,1.0f,0.0f); } 可以注意到照相机位置还是不变的

    99221

    看完这篇,你也可以实现一个360度全景插件

    基于 OpenGL,一般使用 C或 Cpp开发,对前端开发者来说不是很友好。...= -1; 然后我们将相机的中心点移动到球的中心: _camera.position.set(0, 0, 0); 现在我们已经在全景球的内部啦: ?...,如下面的代码,若标准化坐标在 -1和 1的范围内,则它会出现在我们的视野中,我们将它进行准确渲染。...4.1 要求 建立坐标和全景的映射关系,为全景赋予一套虚拟坐标 在一张平铺的全景图上,可以在任意位置增加标记,并获取标记的坐标 使用坐标在预览全景增加标记,看到的标记位置和平铺全景中的位置相同...4.2 坐标 在 2D平面上,我们能监听屏幕的鼠标事件,我们可以获取的也只是当前的鼠标坐标,我们要做的是将鼠标坐标转换成三维空间坐标。

    8.9K30

    Android图像处理系列:OpenGL深度测试的应用

    在OpenGL中绘制3D物体时,几乎不可避免地要用到深度测试,因为希望绘制的结果像真实世界中的效果那样,前面的物体会挡住后面的物体。...有人可能会说:我先绘制绿色的,再绘制蓝色的不就行了吗?后绘制的会盖在先绘制的上面,就不用深度测试了 对于这个简单的case,是可以的,那么看下面这个case: ?...小结一下,深度测试就是说OpenGL自动为我们判断所要渲染的东西的前后关系,并按某种规则来实现最后看到的是哪部分,这些说的“某种规则”是可以设置的,通常会设置为让OpenGL渲染出的来最终效果为看到的是深度最浅的部分...Depth Buffer中存储的对应像素的深度值将是A的深度值,如果此后再渲染B,则会因为B的深度比A的浅,不会将B对应的颜色更新到Color Buffer,从而渲染出来透过半透明的A不能看到后面的B。...加入我们: 天天P图技术团队长期招聘: (1) AND / iOS 开发工程师 (2) 图像处理算法工程师  期待对我们感兴趣或者有推荐的技术牛人加入我们(base 上海)!

    1.7K21

    变换(Transform)(2)-坐标空间变换

    为什么要进行坐标空间的变换 在日常生活中,当我们给其他人指明一个地点的位置时经常使用东南西北,但另一个人可能根本就分不清方向;如果我们使用另一种表达方式,比如面向某某建筑物大门时的右侧,就很容易理解,这就是坐标空间的转换...在二维笛卡尔坐标系中,(3, -5)我们为什么能找到它呢,首先坐标系原点是(0, 0),构成这个坐标系的标准正交基是(1, 1),那么(3, -5)就是向x轴移动3个单位1,向y轴移动-5个单位1。...这里的困惑其实就是games101给出的公式: 其中,g表示gaze,相机看向哪里。t就是top,上向量。为什么这里的公式是-g呢?因为这是一个右手系公式,右手系相机看向-z轴,那么z轴就是-g。...这个立方体的x轴和y轴都很好确定,就是-1, 1,但z轴不同的API会有不同的范围。例如OpenGL中z轴的范围是-1, 1,但DirectX中z轴的范围是0, 1。...在DirectX中,投影后z轴不会被映射到-1, 1而是0, 1上(跟正交矩阵一样),并且DirectX在观察空间和裁剪空间都是左手系,一直看向z正轴,其n和f值是正数: \mathbf{M_{per[

    13620

    OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

    OpenGL的坐标系 在3D图形学里,OpenGL为右手坐标系(准确来说,OpenGL的世界空间和相机空间是右手坐标系)。随便提一下,D3D11为左手坐标系。 (1) 右手坐标系 ?...(2) 左手坐标系 ? OpenGL的矩阵和向量结合方式 OpenGL的向量为列向量,矩阵和向量采用的方式为“矩阵X列向量”的方式,而D3D11为"行向量X矩阵"的方式。...,旋转矩阵,平移矩阵构成的 (1)缩放矩阵 (ScaleMatrix) 假设在X轴缩放Sx倍,在Y轴缩放Sy倍,在Z轴缩放Sz倍,缩放如下所示: ?...顶点乘以矩阵的公式如下: ? (2)旋转矩阵 在说明旋转矩阵之前,我得说明一下,在右手坐标系如何判断哪个方向为顺时针方向旋转。...这里的“X”为叉乘的意思,并且一样可以通过右手规则(OpenGL世界空间为右手坐标系)得到叉乘向量的方向,也就是用右手从叉乘符号左边那个向量绕向叉乘符号右边的那个向量,拇指所指方向即为叉乘得到向量的方向

    1.4K50
    领券