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

在OpenGL ES中,如何将屏幕坐标转换为世界坐标?

在OpenGL ES中,将屏幕坐标转换为世界坐标需要经过以下步骤:

  1. 视口变换:将裁剪坐标系的坐标转换为屏幕坐标。
  2. 逆矩阵变换:将屏幕坐标转换为裁剪坐标系的坐标。
  3. 透视除法:将裁剪坐标系的坐标转换为归一化设备坐标系的坐标。
  4. 逆矩阵变换:将归一化设备坐标系的坐标转换为模型视图坐标系的坐标。
  5. 逆矩阵变换:将模型视图坐标系的坐标转换为世界坐标系的坐标。

以下是一个示例代码,演示如何将屏幕坐标转换为世界坐标:

代码语言:c++
复制
// 获取视口变换矩阵
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

// 获取模型视图矩阵和投影矩阵
GLfloat modelview[16], projection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
glGetFloatv(GL_PROJECTION_MATRIX, projection);

// 获取逆矩阵
GLfloat inverse_modelview[16], inverse_projection[16];
gluInvertMatrix(modelview, inverse_modelview);
gluInvertMatrix(projection, inverse_projection);

// 计算屏幕坐标
GLfloat screen_x = (2.0f * x) / viewport[2] - 1.0f;
GLfloat screen_y = 1.0f - (2.0f * y) / viewport[3];

// 计算裁剪坐标系的坐标
GLfloat clip_x = screen_x;
GLfloat clip_y = screen_y;

// 计算归一化设备坐标系的坐标
GLfloat ndc_x = clip_x;
GLfloat ndc_y = clip_y;

// 计算模型视图坐标系的坐标
GLfloat eye_x = ndc_x * inverse_projection[0] + ndc_y * inverse_projection[4] + inverse_projection[12];
GLfloat eye_y = ndc_x * inverse_projection[1] + ndc_y * inverse_projection[5] + inverse_projection[13];
GLfloat eye_z = ndc_x * inverse_projection[2] + ndc_y * inverse_projection[6] + inverse_projection[14];
GLfloat eye_w = ndc_x * inverse_projection[3] + ndc_y * inverse_projection[7] + inverse_projection[15];

// 计算世界坐标系的坐标
GLfloat world_x = eye_x * inverse_modelview[0] + eye_y * inverse_modelview[4] + eye_z * inverse_modelview[8] + eye_w * inverse_modelview[12];
GLfloat world_y = eye_x * inverse_modelview[1] + eye_y * inverse_modelview[5] + eye_z * inverse_modelview[9] + eye_w * inverse_modelview[13];
GLfloat world_z = eye_x * inverse_modelview[2] + eye_y * inverse_modelview[6] + eye_z * inverse_modelview[10] + eye_w * inverse_modelview[14];
GLfloat world_w = eye_x * inverse_modelview[3] + eye_y * inverse_modelview[7] + eye_z * inverse_modelview[11] + eye_w * inverse_modelview[15];

// 输出世界坐标系的坐标
std::cout << "World coordinates: ("<< world_x / world_w << ", "<< world_y / world_w << ", "<< world_z / world_w << ")"<< std::endl;

需要注意的是,这个示例代码仅适用于OpenGL ES 1.x和2.x版本,OpenGL ES 3.x版本需要使用不同的着色器语言和着色器程序来实现。

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

相关·内容

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

OpenGL绘制过程 其实在OpenGL,所有物体都是一个3D空间里的,但是屏幕都是2D像素数组,所以OpenGL会把3D坐标转变为适应屏幕的2D像素。...OpenGL坐标系变换的过程 之前我们已经提到OpenGL,所有物体都是一个3D空间里的,但是屏幕都是2D像素数组,所以OpenGL会把3D坐标转变为适应屏幕的2D像素。...由于这个过程OpenGL ES是自动进行的,我们不需要针对它来编程,因此我们经常把它和投影变换放在一起来理解。我们可以不太严谨地暂且认为,相机坐标经过了一个投影变换,就直接得到NDC了。...它才是真正的由OpenGL ES来定义的坐标NDC的定义,x、y、z各个坐标都在[-1,1]之间。...这样NDC坐标就需要一个变换,才能变换到屏幕坐标,这个变换被称为视口变换。OpenGL ES,这个变换也是自动完成的,但需要我们通过glViewport接口来指定绘制屏幕的大小。

2.2K50

ThreeJS中三维世界坐标转换成二维屏幕坐标

WebGL是openGL浏览器上的一个实现。Threejs对WebGL进行了封装,让前端开发人员不需要掌握很多数学知识和绘图知识的情况下轻松进行web 3D开发,简单易用。...三维开发中最常用的是三维坐标和二维坐标的转换,比如说:给一个三维模型动态赋予一个文字标签进行展示,以前使用OpenGL处理起来比较麻烦,使用Threejs就简单了很多。...关键一步:vector.project(camera) ,表示将该三维坐标投影到视角相机平面上,变成一个二维坐标,结果为一个单位向量(标准向量),返回的结果是世界坐标worldVectorcamera...var vector = worldVector.project(camera);//通过世界坐标获取标准设备坐标 var w = window.innerWidth / 2;...var h = window.innerHeight / 2; var x = Math.round(vector.x *w + w);//标准设备坐标屏幕坐标 var

4.9K10
  • OpenGL ES-3D图形变换知识

    最近一段时间很忙,没什么时间再去研究OpenGL,有朋友问我OpenGL ES图形变换的相关问题,这里抽出时间整理一下相关资料,便于大家学习3D图形运动的知识。...然后将这些标准化设备坐标传入光栅器(Rasterizer),再将他们转换为屏幕上的二维坐标或像素。...将坐标换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步,也就是类似于流水线那样子,实现的,流水线里面我们将对象转换到屏幕空间之前会先将其转换到多个坐标系统(Coordinate System...这些组合在一起的转换通常存储一个观察矩阵(View Matrix)里,用来将世界坐标转换到观察空间。...转成代码的话还需要大家自己根据项目实际来做,最后注意一点: OpenGL 物体最初是本地坐标空间中,然后转换到世界坐标空间,再到 camera 视图空间,再到投影空间,这一系列转换都是靠 matrix

    95420

    OpenGL ES 2.0 (iOS):坐标空间 与 OpenGL ES 2 3D空间

    屏幕空间 三、OpenGL ES 2 3D 空间 1. 变换发生的过程 2. 各个变换流程分解简述 3. 四次变换与编程应用 四、工程例子 五、参考书籍 ---- 一、多坐标系 1....世界坐标系 即物体存在的空间,以此空间某点为原点,建立的坐标世界坐标系是最大的坐标系,世界坐标系不一定是指“世界”,准确来说是一个空间或者区域,就是足以描述区域内所有物体的最大空间坐标,是我们关心的最大坐标空间...; ep: 比如有一架飞机,机翼位于飞机的两侧,那么描述机翼最合适的坐标系,当然是相对于飞机本身,机翼位于那里;飞机飞行的时候,飞机本身的坐标系是不是在跟随运动,机翼是不是飞机的坐标同时运动着。...;因为图形要从裁剪空间投影映射到屏幕空间中,需要知道真实的环境的像素分布情况,不然图形就会出现变形; 《OpenGL ES 2.0 (iOS)[02]:修复三角形的显示》这篇文章就是为了修复屏幕像素比例不是...像素缩放比 三、OpenGL ES 2 3D 空间 1. 变换发生的过程 ?

    1.8K20

    【Cocos2d-x游戏开发】浅谈游戏中的坐标

    无论是开发2D还是开发3D游戏,首先必须弄清楚坐标系的概念。Cocos2d-x,需要了解的有OpenGL坐标系、世界坐标系和节点坐标系。  ...2.OpenGL坐标系   OpenGL坐标系又称为绘图坐标系,Cocos2d-x以OpenGLOpenGL ES为基础,所以支持的自然是OpenGL坐标系。...OpenGL坐标系默认原点坐标(X=0,Y=0)屏幕左下角,X轴从屏幕最左边开始,由左向右逐渐增加, Y轴从屏幕最下方开始,由下至上逐渐增加。   ...IOS的屏幕触摸时间Touch传入的位置信息使用的是屏幕坐标系,因此Cocos2d-x对触摸时间进行处理时,需要先把触摸点的位置转换成OpenGL坐标,可以使用Director类的convertToGL...最后绘制屏幕的时候,Cocos2d-x会把这些元素的本地节点坐标映射成世界坐标坐标世界坐标系和OpenGL坐标系一致,原点默认屏幕左下角,X轴向右,Y轴向上。

    1.3K40

    Android OpenGL开发实践 - 基于OpenGL ES 2.0的Android相机实时图片涂鸦实现思路

    开始讲解之前,先简要介绍一下OpenGL ES 2.0的一些必要的基础知识,方便对文章的理解。...基础知识一:OpenGL坐标系 为方便讲解,以下只讲解二维的情况,OpenGL使用,我们主要会涉及到以下三个坐标系: 屏幕坐标屏幕坐标系就是我们手机屏幕坐标系,以像素为单位,左上角是坐标系原点...世界坐标系 它是OpenGL内部的绘图区域的坐标系,x、y的取值范围都是-1~1,坐标原点在绘图区域的中心,见下图,假设绿色区域是一个OpenGL的绘图区域: ?...其中IMAGE_POSITION_VERTEX是纹理图片的位置坐标数组,它的作用是确定要把纹理图片画在屏幕的什么地方,它里面的坐标值是对应世界坐标坐标值,IMAGE_TEXTURE_VERTEX是纹理图片本身的顶点坐标数组...因为OpenGL默认是渲染到屏幕的,我们往画布上画东西并不希望马上显示出来,因为画布还要贴到脸上,之后再显示出来。 坐标变换 有了涂鸦画布之后,下一步就是如何将涂鸦的内容画到画布上。

    7.2K130

    【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】一、初步了解OpenGL ES

    二、OpenGL ES坐标音视频开发,涉及到的坐标系主要有两个:世界坐标和纹理坐标。...纹理坐标 OpenGL ES世界坐标 通过名字就可以知道,这是OpenGL自己世界的坐标,是一个标准化坐标系,范围是 -1 ~ 1,原点在中间。...OpenGL ES纹理坐标 纹理坐标,其实就是屏幕坐标,标准的纹理坐标原点是屏幕的左下方,而Android系统坐标系的原点是左上方的。这是Android使用OpenGL需要注意的一个地方。...简单理解:其实就是对应了以上两个坐标系:顶点着色器对应世界坐标,片元着色器对应纹理坐标。 画面上的每个点,都会执行一次顶点和片元着色器的程序片段,并且是并行执行,最后渲染到屏幕上。...1) 初始化顶点坐标 前面我们讲到OpenGL世界坐标和纹理坐标绘制前就需要先把这两个坐标确定好。

    1.9K51

    【Cocos2d-x】开发基础-Cocos2d-x坐标

    本篇博客讲解: 1.UI坐标 2.OpenGL坐标 3.世界坐标和模型坐标 4.实例:世界坐标换为模型坐标 5.实例:模型坐标换为世界坐标 UI坐标OpenGL坐标...屏幕的高度 - OpenGL坐标 = UI坐标 屏幕的高度 - UI坐标 = OpenGL坐标 Vec2 touchLocation = touch->getLocationInView(); /...Vec2 convertTouchToNodeSpace ( Touch * touch ) //将世界坐标触摸点转换为模型坐标。...()); >//node2->getPosition()为Node2Node1的模型坐标(相对于Node1的坐标原点得到的坐标) ->(convertToWorldSpace)->转换为世界坐标,Node2...Node1坐标实际上是(0,0),在世界坐标,Node2的坐标其实就是A点的坐标 (150,50)为Node2的宽高 A点的坐标 = (400,500) - (150,50) = (250,450

    54920

    Cocos2d-x-v3坐标体系 原

    一、UI坐标体系         UI坐标体系相对于移动开发人员来说再熟悉不过了,iOS系统,它就是frame体系,即坐标(0,0)点位于屏幕的左上角,向右x增大,向下y增大。...二、OpenGL坐标体系         OpenGL坐标系是cocos2d中使用的坐标系,它更接近于数学上的坐标系,即(0,0)点位于屏幕的左下角,往左x增大,往上y增大。...三、世界坐标系         简单的理解,世界坐标系就是绝对坐标系,cocos2d,精灵的坐标是相对于其父视图而言的,是相对的坐标世界坐标则是统一绝对的坐标项目中是固定的。...(const Vec2& uiPoint);         这个方法将UI坐标系转换为OpenGL坐标系。...UI坐标,(0,0)点就是节点的左上角,OpenGL坐标,(0,0)点就是节点的左下角。

    43620

    OpenGL坐标系及坐标转换

    世界坐标系:现实世界,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。...世界坐标系以屏幕中心为原点(0, 0, 0),OpenGL中用来描述场景的坐标。比如使用这个坐标系来描述物体及光源的位置。世界坐标系,是不会被改变的。...无论是在世界坐标系中进行转换还是局部坐标系中进行 换,程序代码是相同的,只是不同的坐标系考虑的转换方式不同罢了。 视坐标系:以视点为原点,以视线方向为Z轴正方向的坐标系。...OpenGL会将世界坐标系先变换到视坐标系,然后进行裁剪,只有视见体之内的场景才会进入下一个阶段进行处理。...模型变换 模型变换是在世界坐标系中进行的。缺省时,物体模型的中心定位在坐标系的中心处。OpenGL在这个坐标,有三个命令,可以模型变换。

    4.2K70

    终端图像处理系列 - OpenGL ES 2.0 - 3D基础(矩阵投影)

    Overview 移动设备的屏幕是二维平面,要想把一个三维场景渲染在手机二维屏幕上,需要利用OpenGL的矩阵投射,将三维空间中的点映射到二维平面上。...通常情况下,我们会根据画布(屏幕)的大小设定一个坐标范围,顶点着色器中将这些坐标换为标准化设备坐标。...项目中,物体坐标最终被转化为屏幕坐标之前会变换到多个坐标系统,因为相应的过度坐标做特定运算会方便容易一些。...世界空间(World Space):物体更大的空间范围的坐标;如我们构造了一个圆球来表示世界,圆心为世界坐标原点O2,把正方体放在圆球t(x1,y1,z1)位置。...投影矩阵会将在这个指定范围内的坐标换为标准化设备坐标的范围(-1。0,1.0)。使用投影矩阵能将3D坐标投影到2D的标准化设备坐标

    2.4K110

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

    一、渲染视频画面 第一篇文章【音视频基础知识】文章,就介绍过,视频其实就是一张张图片组成的,在上文【初步了解OpenGL ES,介绍了如何通过OpenGL渲染一张图片,可以猜想到,视频的渲染和图片的渲染应该是差不多的...我们已经知道,视频的画面色彩空间是YUV,而要显示到屏幕上,画面是RGB的,所以,要把视频画面渲染到屏幕上,必须把YUV转换为RGB。拓展纹理就起到了这个转换的作用。...画面被拉伸 二、画面比例矫正 投影 OpenGL世界坐标是一个标准化的坐标体系,xyz坐标范围都在(-1~1),默认起始和结束位置分别对应世界坐标的平面的四个角。...相机的位置 OpenGL 世界坐标系是一个右手坐标系,正 X 轴右手边,正 Y 轴朝上,正 Z 轴穿过屏幕朝向你。 ?...OpenGL 世界坐标系 那么相机坐标可以是(0,0,5),也就是位于Z轴上的一个点。

    2.2K30

    OpenGL坐标转换推导(十一)

    OpenGL坐标转换过程 之前我们已经提到OpenGL,所有物体都是一个3D空间里的,但是屏幕都是2D像素数组,所以OpenGL会把3D坐标转变为适应屏幕的2D像素,最终投射到2D的屏幕上去。...总的来说OpenGL体现,如果要实现3D物体的运动实际上是每个顶点的位置改变,而顶点的位置改变则是通过矩阵乘法来实现的。...代码的vec4(position.xyz, 1)表示顶点在本地坐标坐标(是一个四维的齐次坐标)。它左边乘上model矩阵,就得到了该顶点在世界坐标坐标。...然后,世界坐标坐标再左乘一个view矩阵,就变换到了相机坐标系。最后,再左乘projection矩阵。也就是说上面代码projection, view ,model分别对应着一种矩阵。...多出来的这个1只要在需要的时候把它去掉,我们就能得到原来的3维坐标。实际上,OpenGL ES,我们总是以4维的齐次坐标来表示顶点坐标

    2.5K70

    解剖 WebGL & Three.js 工作原理

    我们先看下图: 我们引入了一个新的名词,叫“顶点着色器”,它由opengl es编写,由javascript以字符串的形式定义并传递给GPU生成。...position; uniform mat4 matrix; void main() { gl_Position = position * matrix; } 这就是应用了矩阵matrix,将三维世界坐标转换成屏幕坐标...它同样是一段opengl es程序,模型看起来是什么质地(颜色、漫反射贴图等)、灯光等由片元着色器来计算。...5.1、three.js顶点处理流程 从WebGL工作原理的章节,我们已经知道了顶点着色器会将三维世界坐标转换成屏幕坐标,但实际上,坐标转换不限于投影矩阵。...坐标转换流程: 1、首先,顶点坐标存储Mesh.Vertex.position; 2、随后,如果模型(Mesh)设置了旋转、缩放、移动,那将这些转换信息存储Mesh的模型矩阵里; 3、同样,相机转换信息存储视图矩阵

    9.7K21

    iOS开发-OpenGL ES入门教程1

    前言 这里是一篇新手教程,环境是Xcode7+OpenGL ES 2.0,目标写一个OpenGL ES的hello world。 OpenGL ES系列教程在这里。...OpenGL ES系列教程的代码地址 你的star和fork是我的源动力,你的意见能让我走得更远。 核心思路 通过GLKit,尽量简单地实现把一张图片绘制到屏幕。 效果展示 ?...,OpenGLES的世界坐标系是[-1, 1],故而点(0, 0)是屏幕的正中间。...纹理坐标系的取值范围是[0, 1],原点是左下角。故而点(0, 0)左下角,点(1, 1)右上角。...把屏幕切分成4个三角形,左边两个三角形同上,右边两个三角形的纹理坐标的x值调整即可。 附 一个热血青年想在业余时间做更多的尝试,做一些能帮助别人也能受惠自己的事情。

    1.4K90

    使用SharpGL三维建模技术生成3D井眼轨迹图

    最后一个选择使用SharpGL的原因是,OpenGL中大量的很痛苦的重复的工作如加载信息等,但是这些工作.NET是非常容易处理的。...物体顶点的起始坐标按序经过上述5个坐标系系统最终转换为屏幕坐标坐标系及坐标转换的内容感兴趣的朋友请自行baidu。...说白了其实就是不同的屏幕位置绘制文字。...SharpGL中有两种类型的绘制文字,立体文字和平面文字 立体文字是在世界坐标系上绘制文字,方法是: gl.DrawText3D, 平面文字是二维屏幕上绘制文字,对应的方法是: gl.DrawText...这里我们更适合使用平面文字,我们需要把三维的世界坐标转换成只有x,y的二维屏幕坐标

    4K50

    Unity基础(10)-坐标系统

    Vector3(x,y,z) Unity坐标系分类: word Space (世界坐标系) local Space (局部坐标系) Screen Space(屏幕坐标系) viewport (视口坐标...) GUI界面的坐标系 2-1 世界坐标世界坐标系:用来描述游戏场景内所有物体位置和方向的基准,Unity场景创建的物体都是以全局坐标坐标原点(0,0,0)来确定各自的位置。...参数的z坐标的作用就是:用来表示上述平面离摄像机的距离。X,Y表示像素坐标,根据(X,Y)相对于屏幕的位置,得到游戏世界的点相对于截面P的位置,也就将屏幕坐标换为世界坐标。...screenPos = Camera.main.WorldToScreenPoint(cube.transform.position); // 如何将屏幕坐标转换成世界坐标(得到的是相机坐标)...参数的z坐标的作用就是:用来表示上述平面离摄像机的距离。X,Y表示像素坐标,根据(X,Y)相对于屏幕的位置,得到游戏世界的点相对于截面P的位置,也就将屏幕坐标换为世界坐标

    4.9K20

    OpenGL 学习系列---坐标系统

    三维坐标立体几何的坐标系里面定义一个点的位置,需要 x、y、z 三个坐标轴的值,而在 OpenGL 绘制 3D 物体也是需要的。...绘制基本形状时,只是定义了 x、y 轴的坐标,这样 z 轴的坐标就默认为 0 了。 OpenGL 将定义好的坐标轴的值转换为实际绘制的坐标,需要经过五个坐标系统的转换。 如下图所示: ?...进入不同的坐标空间之前,需要先了解 OpenGL坐标系: OpenGL 是一个右手坐标系,正 X 轴右手边,正 Y 轴朝上,正 Z 轴穿过屏幕朝向你。 ?...局部空间和世界空间有点相像,可以局部空间定义坐标系时就考虑到世界坐标系,避免多个物体绘制时出现扎堆现象。 当然还有更好的方法,就是使用模型矩阵(Model Matrix)。...参考 《OpenGL ES 应用开发实践指南》 《OpenGL ES 3.x 游戏开发》 http://blog.csdn.net/iispring/article/details/27970937 具体代码详情

    1.3K30
    领券