首页
学习
活动
专区
工具
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.5K62
  • 【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.2K50

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

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

    2.2K30

    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.2K70

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

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

    2.8K40

    附加实验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,这些镜头参数调节依赖于GL10gluPerspective方法,具体参数调整代码举例如下: // 设置投影矩阵,对应gluPerspective(调整相机参数)...第二到第四个参数为相机位置坐标,第五到第七个参数为相机画面中心点坐标,第八到第十个参数为朝上坐标方向,比如第八个参数为1表示x轴朝上,第九个参数为1表示y轴朝上,第十个参数为1表示z轴朝上

    1.2K20

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

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

    2.1K20

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

    每哪一个被使用了,如果我们沿着渲染管线走,我们得到齐次坐标下顶点集,这将会被用于检测相机是否可以看到它们。...假设场景被渲染进一个窗口,其中两个为\((x_1, y_1)\)和\((x_2, y_2), x_1 < x_2, y_1 < y_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); // 场景(000视点中心 (0,5,50),Y轴向上 //三个数组代表分别是:相机在世界坐标位置

    2K30

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

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

    4.9K23

    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_LIGHT12等。...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),后面三个参数一般设为010,表示是照相机头部方向,如果把照相机看错人眼,那照相机头部方向也就是我们头方向...glLoadIdentity(); gluLookAt(x, y, z, x + lx,y + ly,z + lz, 0.0f,1.0f,0.0f); } 可以注意到照相机位置还是不变

    93020

    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

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

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

    8.8K30

    变换(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会有不同范围。例如OpenGLz范围是-1, 1,但DirectXz范围是0, 1。...DirectX,投影后z轴不会被映射到-1, 1而是0, 1上(跟正交矩阵一样),并且DirectX观察空间和裁剪空间都是左手系,一直看向z正轴,其n和f值是正数: \mathbf{M_{per[

    9920

    Android利用OpenGLES绘制天空盒实例教程

    前言 天空盒这个效果最早是腾讯实景地图里看到,当时觉得很牛逼,但是没有想过自己去实现以下。最近这段时间对opengl很有兴趣,顺便就搞了这个天空盒,话不多说,先上效果。 ?...天空盒原理就是在三维空间中放置一个正方体,然后将我们相机放置正方体内,当我们视点转动,相机跟着转动。我们就可以看到相应景色变换了,天空盒本质上是一个立方体。...第一步 SkyBoxView继承了GLSurfaceView,为什么要继承GLSurfaceView,因为使用OpenGLES需要建立一个窗口和一个上下文,GLSurfaceView帮我们做了这些工作...onTouchEvent则根据手指滑动距离设置俯仰角pitch和偏移脚yaw,调用skyBoxRender进行相机旋转。...另外如果你看github可能发现注释掉了很多代码,那是用传感器旋转尝试,但是觉得麻烦,也没继续做,有兴趣读者可以自己搞一下。

    90530
    领券