世界坐标_世界坐标系 - CSDN
精华内容
参与话题
  • 世界坐标系、相机坐标系、图像平面坐标系

    万次阅读 多人点赞 2018-07-12 18:04:09
    一、四个坐标系简介和转换 相机模型为以后一切标定算法的关键,只有这边有相当透彻的理解,对以后的标定算法才能有更好的理解。本人研究了好长时间,几乎每天都重复看几遍,最终才会明白其推导过程。   &...

    一、四个坐标系简介和转换

    相机模型为以后一切标定算法的关键,只有这边有相当透彻的理解,对以后的标定算法才能有更好的理解。本人研究了好长时间,几乎每天都重复看几遍,最终才会明白其推导过程。
         我觉得首先我们要理解相机模型中的四个平面坐标系的关系:像素平面坐标系(u,v)、像平面坐标系(图像物理坐标第(x,y)、相机坐标系(Xc,Yc,Zc)和世界坐标系(Xw,Yw,Zw),在每一篇介绍相机模型的文章中都有介绍。
         我刚开始理解时,看着那一堆的公式十分的头晕,我相信很多初学者和我一样,但仔细想想,只不过是,我们假设了一些参数,使四个坐标系之间的坐标联系起来,这样我们就可以从拍摄的图片上一个点坐标一路反推出世界中的那个点的坐标,这样就达到了我们的目的,三维重建。而那些我们假设的参数,就是我们要标定的内外参数。


    1、像素坐标与像平面坐标系之间的关系 
          确定他们的关系之前,我们可以假设每一个像素在u轴和v轴方向上的物理尺寸为dx和dy。仔细看下他们的模型可以推出以下公式(这个还是比较好理解的):






    解释:1、dx,dy,u0,v0其实都是我们假设出来的参数,dxdy表示感光芯片上像素的实际大小,是连接像素坐标系和真实尺寸坐标系的,u0,v0是图像平面中心,最终是要我们求的内外参数。
    得出这个公式后我们可以运用线性代数的知识把方程用矩阵形式表示:

    当然我们也可以用另一种矩阵形式表示:

    2、相机坐标系与世界坐标系之间的关系 

         这两个坐标系之间的关系我们可以旋转矩阵R和平移矩阵T来得到以下关系:


                                           

                                                                        公式4

       解释:1、 在这个公式中,R为3*3矩阵,T为3*1,0为(0,0,0),简化用Lw表示后为4*4矩阵。

    3、成像投影关系(相机坐标系与像平面坐标系) 


         在相机模型中我们可以得到以下公式:


                                           

                                                                     公式5

               解释:1、

    同样我们用矩阵形式表示:

                                              

                                                                           公式6


    4、得到公式


    而我们可以将以上公式综合一下就可以得到:

      

    因此,内参数矩阵可以表示为:

    =


    外参矩阵可以表示为:,由旋转矩阵R和平移向量T组成


    当然在好多资料上都有这种做法:



    上图中表示的情况是像素坐标系和图像物理坐标系的两个坐标轴不是平行的关系,像素坐标系的两个坐标轴也不是垂直90°的关系,而图像物理坐标系的两个坐标轴是垂直关系。所以,我们在转换两个坐标轴的坐标之间的关系时就必须考虑像素坐标系两个坐标轴之间的夹角了。就有了上面的不同的内参矩阵,理解了就好了。


    二、图像坐标:我想和世界坐标谈谈(B)

             玉米将在这篇博文中,对图像坐标与世界坐标的这场对话中涉及的第二个问题:谈话方式,进行总结。世界坐标是怎样变换进摄像机,投影成图像坐标的呢?

            玉米做了一个简单的图示,在这里做一个提纲。图中显示,世界坐标系通过刚体变换到达摄像机坐标系,然后摄像机坐标系通过透视投影变换到达图像坐标系。可以看出,世界坐标与图像坐标的关系建立在刚体变换和透视投影变换的基础上。为了奖励刚体变和透视投影变换沟通了“世界上最远的距离”,玉米在图上奖励了他们两朵小红花。哈哈


     首先,让我们来看一下刚体变换是如何将世界坐标系与图像坐标系联系起来的吧。这里,先对刚体变换做一个介绍:

            刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移运动,称之为刚体变换

    因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。转一转,走一走,就到另外一个坐标系下了。以前可能是面朝大海,经过平移旋转,最终可能只能面朝冰山了,哈哈


    下面让我来看一下,二者之间刚体变化的数学表达。


    其中,XC代表摄像机坐标系,X代表世界坐标系。R代表旋转,T代表平移。R、T与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter)可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

             R则为分别绕XYZ三轴旋转的效果之和。如下面所示:



     R=r1*r2*r3.其由三个方向的θ控制,故具有三个自由度。

               好了,刚体变换就讲完了。大家应该都了解,世界坐标系到摄像机坐标系之间的转换过程了吧。

              接下来,让我们看看摄像机坐标下的坐标如何投影到图像坐标系下,最终变为照片中的一个像素。这其中包含两个过程:一是从摄像机坐标到“空间图像坐标”(x,y)所发生的透视投影;二是从“连续图像坐标”到“离散图像坐标”(u,v)。后者我们已经在第一篇博文中解释过。所以在这里,主要介绍一下透视投影。

             透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)。

             啰嗦这么多,其实大家看看示意图,看看公式,秒懂。


      以图中B(XB,YB)点为例,在小孔成像摄像机模型下(几何分析的最常用模型)。这里的f为摄像机的焦距,其属于摄像机的内参数(intrinsic parameter)。其在成像平面上的投影点b(xb,yb)的坐标利用简单的相似三角形比例关系很容易求出:


    上面两式也阐明了摄像机坐标与图像坐标之间的透视投影关系。

                好吧,现在玉米已经把图像坐标与世界坐标之间的这场对话所需经历的三个波折的过程加以了解释。即:刚体变换、透视投影、(x,y)换(u,v)(ps.这个在上一篇博文中讲过)。接下来玉米用一张图把三个过程连接起来。实现从世界坐标(X,Y,Z)到(u,v)之间的转换。让图像坐标与世界坐标直接对话。

             下图中的转换关系,都是用齐次坐标表达的,大家会发现这样的表达非常整洁。

             其实这张图显示的过程还有一个名字:摄像机模型(camera model)。其实也就是摄像机的几何模型了。

             将三者相乘,可以把这三个过程和在一起,写成一个矩阵:


    P就是世界坐标到图像坐标的直接联系人,P就表示了一个投影相机,有下面公式:


    注意在表示齐次坐标时,需要在符号上面加个小帽子。除去齐次坐标控制位P23P具有11个自由度。


           摄像机模型及其中涉及的坐标系等,是弄清3D重建几何框架的基础。可以把它们视为基本运算关系。后面对于三维重建几何框架的推导,都是要用到三个基本坐标系和摄像机模型的。

            </div>
                </div>
    
    展开全文
  • 世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真 照相机是日常生活中最常见的。它能把三维的空间图片等比例缩小投影在照片上,称为一个二维图像。 以下我们就讲一讲原理,并相应的进行matlab...

    世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真

    照相机是日常生活中最常见的。它能把三维的空间图片等比例缩小投影在照片上,称为一个二维图像。

    以下我们就讲一讲原理,并相应的进行matlab仿真。

    在学之前,先要了解几个概念:

    • 什么是世界坐标?
      • 也就是真实世界的立体空间坐标,是一个三维坐标系
      • Ow-XwYwZw :世界坐标系,描述相机位置,单位m
    • 什么是相机坐标?
      • 根据透镜成像原理,将世界坐标在照相机内呈现,是一个三维坐标系
      • Oc-XcYcZc  :相机坐标系,光心为原点,单位m
    • 什么是图像坐标?
      • 将相机呈现的三维坐标投影到屏幕上,而建立的新坐标系,不含高程信息,是一个二维坐标系
      • o-xy :图像坐标系,原点为成像平面中点,单位mm
    • 什么是像素坐标?
      • 将投影的图像坐标离散抽样形成的做种图片,是一个二维的坐标系
      • uv :像素坐标系,原点为图像左上角,单位pixel

    所以步骤流程就是:

      • step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移,称之为刚体变换;
      • step2:将相机坐标转化为图像坐标,称为投影
      • step3:将图像坐标离散抽样

    模型如下图所示:

    step1:构造rigbt()函数

           世界坐标转化为相机坐标模型如下图所示:

     

    从世界坐标系变换到相机坐标系属于刚体变换:即物体不会发生形变,只需要进行旋转和平移。

    R:表示旋转矩阵

    T:表示偏移向量

    接下来分析旋转和平移

           坐标轴绕z轴旋转 θ=Theta(希腊字母读法,编程用的到),其几何模型如下图所示:

     

     公式满足:

     矩阵形式为:

    同理,绕x、y轴可以写成:

    所以刚体变化中旋转变换R=R1R2R3。

    平移矩阵T,则刚体变换可以写成:

    进一步转化,可以写成4阶矩阵:

    R矩阵是一个3×3矩阵,T是一个3×1矩阵,RT是一个4×4矩阵。

    matlab 仿真:

    function [RT] = rigbt(Phi, Psi, Theta, x0, y0, z0)
    %刚体变换函数:rigid body transformation
    %输入参数:
    %   φ=Phi       绕x轴转动的角度
    %   ψ=Psi       绕y轴转动的角度
    %   θ=Theta     绕z轴转动的角度
    %输出参数:
    %    RT 将坐标轴进行刚体变化(旋转+平移)成新的坐标轴
    %
    %% 程序
    R1 = [1 0 0; 0 cos(Phi) sin(Phi); 0 -sin(Phi) cos(Phi)];%绕X轴旋转
    R2 = [cos(Psi) 0 -sin(Psi); 0 1 0; sin(Psi) 0 cos(Psi)];%绕Y轴旋转
    R3 = [cos(Theta) sin(Theta) 0;-sin(Theta) cos(Theta) 0; 0 0 1 ];%绕Z轴旋转
    R = R3 * R1 * R2;%旋转矩阵(刚体变换一部分)
    T = [x0; y0; z0];%平移矩阵
    RT=[R T;0 0 0 1];%刚体变换矩阵
    return
    

    step2:构造proj()函数

    相机坐标投影成图像坐标,几何模型如下图所示:

    几何关系(相似)满足:

     

    即:

     

    代入:

    写成矩阵形式:

    matlab 仿真:

    function [Projection_Matrix] = proj(f)
    %相机坐标投影(projection)成图像坐标
    %输入参数
    %   f                   相机焦距(数,cm)
    %输出参数
    %   Projection_Matrix   投影成像(矩阵)
    Projection_Matrix = [f 0 0 0; 0 f 0 0; 0 0 1 0];
    return

     

    step3:构造pixel()函数

     xoy是图像坐标; uo_{uv}v是像素坐标; (u0,v0)是像素坐标的中心; p(x,y)是图像中的任意一点。

    模型如下:

     

    将x、y分成n份,每份长度为dx、dy。

    则几何公式为:

    转化为矩阵形式:

     

    matlab仿真:

    function [Pixel_Matrix] = pixel(dx,dy,u0,v0)
    %图像坐标离散化,转化为像素坐标
    %输入参数:
    %   dx      x轴方向上分辨率,像素大小
    %   dy      y轴方向上分辨率,像素大小
    %   (u0,v0) 参考坐标,图像平面中心
    if nargin==2
        u0 = 0;
        v0 = 0;
    end
    Pixel_Matrix = [1/dx 0 u0; 0 1/dy v0; 0 0 1];
    return 
    

    step4:前三步整合

    公式中, fx=f/dx,fy=f/dy。

    matlab 主程序

    % 将世界坐标转化为像素坐标的参数
    %% 程序
    clear all;close all; clc;
    % 参数
    Phi = pi/4;%绕x轴旋转角度
    Psi = pi/4;%绕y轴旋转角度
    Theta = pi/4;%绕z轴旋转角度
    x0 = 0;%x平移量
    y0 = 0;%y平移量
    z0 = 0;%z平移量
    f = 35e-3;%35mm相机
    dx = 0.026;%一个像素的长
    dy = 0.026;%一个像素的宽
    u0 = 0;%图像平面中心
    v0 =0;%图像平面中心
     
    %% step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移(刚体变换)
    RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%刚体变换矩阵
     
    %% step2:将相机坐标转化为图像坐标(投影)
    Projection_Matrix = proj(f);%投影矩阵
     
    %% step3:将图像坐标离散抽样
    Pixel_Matrix = pixel(dx,dy,u0,v0);%1像素=0.635厘米÷24≈0.026458厘米
    %% 数据整合
    Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相机内参数
    Camera_External_Parameters = RT;%相机外参数
    %清除不用的变量
    clearvars -except Camera_Internal_Parameters Camera_External_Parameters
    %相机参数
    Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters 
    clearvars -except Camera_Parameters%清除变量
    

    仿真结果:

    扩展:

    实际应用中,往往将上面的主程序main制作成一个相机参数函数camera_ parameters(),更有利于调用。可以用下面相机参数函数一个代替上面的main程序。

    matlab 仿真

    function [Camera_Parameters] = camera_parameters()
    % 将世界坐标转化为像素坐标的参数(相机参数矩阵)
    % 参数,可以省,省去的话,必须设置相应的入参
    Phi = pi/4;%绕x轴旋转角度
    Psi = pi/4;%绕y轴旋转角度
    Theta = pi/4;%绕z轴旋转角度
    x0 = 0;%x平移量
    y0 = 0;%y平移量
    z0 = 0;%z平移量
    f = 35e-3;%35mm相机
    dx = 0.026;%一个像素的长
    dy = 0.026;%一个像素的宽
    u0 = 0;
    v0 =0;
     
    %% step1:将世界坐标转化为相机坐标,等比例缩小,外加旋转平移(刚体变换)
    RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%刚体变换矩阵
     
    %% step2:将相机坐标转化为图像坐标(投影)
    Projection_Matrix = proj(f);%投影矩阵
     
    %% step3:将图像坐标离散抽样
    Pixel_Matrix = pixel(dx,dy,u0,v0);%1像素=0.635厘米÷24≈0.026458厘米
    %% 数据整合
    Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相机内参数
    Camera_External_Parameters = RT;%相机外参数
    %相机参数
    Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters; 
    

    仿真结果:

     

    注:

     

                                                                                                                     给学matlab的人,包括我自己一个勉励:路漫漫其修,吾上下而求索

    展开全文
  • 世界坐标本地坐标之间的转换

    千次阅读 2017-11-13 14:51:42
    在cocos2d-x,提供现成的两个用于...convertToNodeSpace:将世界坐标转换为本地坐标 用法: node1->convertToNodeSpace(node2->getPosition()); 注释: 将node2的世界坐标转化为相对于node1的本地坐标

    在cocos2d-x,提供现成的两个用于坐标转换的函数,convertToNodeSpace和convertToWorldSpace

    convertToNodeSpace:将世界坐标转换为本地坐标

    用法:

    node1->convertToNodeSpace(node2->getPosition());

    注释:

    将node2的世界坐标转化为相对于node1的本地坐标,这里node2不是添加在node1上面的,使用node2->getPosition(),拿到的坐标是世界坐标

    --------------------------------------------------------------

    convertToWorldSpace:本地坐标转化为世界坐标

    用法:

    node1->convertToWorldSpace(node2->getPosition());

    注释:node2是添加在node1上的,使用node2->getPosition(),拿到的坐标是本地坐标

    展开全文
  • 使用深度图重建世界坐标

    千次阅读 2018-12-21 14:22:49
    首先建立一个绘制世界坐标的项目。 保证物体的顶点在0到1范围之内,这样颜色能够有意义的表示物体的世界坐标位置。 然后编写一个shader,用于绘制世界坐标位置: Shader &amp;amp;amp;amp;amp;amp;amp;quot...

    在学习利用深度图重建世界坐标,遇到了很多的问题,这里需要好好的总结下,文章的最后给出参考网址以及书籍。

    首先给出项目的地址:
    git@gitee.com:yichichunshui/CameraDepth.git
    or
    https://gitee.com/yichichunshui/CameraDepth.git

    然后我们介绍利用深度图来推导世界坐标的两种方法:
    第一种方法,使用vp矩阵的逆矩阵的方式重建。
    原理如下:
    在这里插入图片描述
    这就整个3D图形学的变换了。
    首先一个矩阵的前三个维度所形成的向量,就是标准的正交基。他们是互相正交的轴。
    一个模型的局部坐标点经过MVP矩阵变换之后得到的是齐次空间坐标的点,而不是NDC坐标的点。
    NDC坐标的点要经过透视除法才能得到,NDC的坐标的点在OpenGL中xyz都被映射到[-1,1]之间,而DX中xy被映射到[-1,1]之间,而z被映射到[0,1]之间。unity中利用了OpenGL的映射方式,其xyz也是都被映射到[-1,1]之间,这个参考我之前的博文:https://blog.csdn.net/wodownload2/article/details/85069240
    下面就是数学推导了。

    在这里插入图片描述

    上图,我们以后会经常的使用,这里给出一个通用的透视图。
    关于上图的说明如下:
    o点为摄像机所在位置,也就是眼睛的位置。
    ABCD为近平面,其OM=n
    A’B’C’D’为远平面,其OM’=f
    M为ABCD的中心点,M’为A’B’C’D’的中心点。
    我们现在要推导的是,视锥体中的任意一点P(x,y,z)。在近平面上找到对应的投射点P’。这里的P’的z是只知道的就是近平面n,然后根据相似三角形原理,推出:
    在这里插入图片描述
    能推出y’:
    在这里插入图片描述

    同理:也能推出x’:
    在这里插入图片描述
    ok,现在我们知道了投影点P’的值了:
    就是(

    下面的工作就是要将,这个p’点映射到规范的空间了,也就是说将x’y’z’都映射到[-1,1]范围内。
    如下图:
    在这里插入图片描述

    于是乎,我们的只要将视锥体空间中的点P的x坐标带入上面的公式,就能得到NDC空间的x’‘了。
    在这里插入图片描述
    同理,y’'如下:
    在这里插入图片描述
    上面的式子中,都除以了z,这个对于如果改写成如下的矩阵形式是做不到的:
    在这里插入图片描述
    那么咋办呢?

    为啥要这样,就是为了好写成矩阵的形式。
    同理得到y’’=2ny/(t-b) - (t+b)/(t-b)
    而z’‘稍微有些不同,我们知道近平面n,和远平面f,将其映射到-1到1,咋映射呢?
    这个我真不知道咋整了。
    但是网上的文章也没有讲解怎么做,而是大胆的给出,如果我们通过找到如下的公式:
    zz’’ = pz+q的形式就可以了。
    这样zz’‘就和z成为线性关系,也就好写成矩阵的形式了。
    现在的问题就转换为求得p和q了。
    而我们知道,当z=n的时候,z’’=-1
    当z=f的时候,z’’=1
    也是求得:
    p = (f+n)/(f-n)
    q =-2nf/(f-n)
    于是zz’’=(f+n)z/(f-n)-2nf/(f-n)
    我们将其转换为矩阵的形式:

    ok,经过上的讨论之后,我们知道了,什么是齐次坐标,什么是ndc坐标。下面就要利用这种方式,来求得世界坐标。

    还需要知道的是,摄像机渲染的深度图,得到的是什么,是[0,1]范围的线性深度,还是[-1,1]的ndc中的非线性坐标呢?
    答案是后者。

    为了将验证用深度图转换世界坐标的正确性,那么我们最好确保plane的面上的顶点在0到1范围,这样直接从颜色上,肉眼判定就可以了。
    这里还有一个注意点,初始的plane是scale=1,但是其坐标的点的世界坐标,却在-5到5之间,所以在将其缩小10倍即可。
    在这里插入图片描述

    下面我们先用一个普通的shader,打印其世界坐标的颜色:

    Shader "Unlit/DrawWorldPoint"
    {
    	SubShader
    	{
    		Tags { "RenderType"="Opaque" }
    		LOD 100
    
    		Pass
    		{
    		
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float4 vertex : SV_POSITION;
    				float3 worldPos : TEXCOORD0;
    			};
    
    			
    			v2f vert (appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
    				return o;
    			}
    			
    			fixed4 frag (v2f i) : SV_Target
    			{
    				return fixed4(i.worldPos, 1.0);
    			}
    			ENDCG
    		}
    	}
    	FallBack "Legacy Shaders/Diffuse"
    }
    
    

    注意这个shader的最后有一个fallback,它在这里没有用,但是在后面的后处理,使用深度图的时候有用。后面会讲到。

    这样得到的效果是:
    在这里插入图片描述

    ok,下面是使用逆矩阵的方式反推世界坐标。
    首先,我们要使用后处理的方式,所以要写一个C#脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [ExecuteInEditMode]
    public class InverseMatrix : MonoBehaviour
    {
        private Material postEffectMat = null;
        private Camera currentCamera = null;
    
        void Awake()
        {
            currentCamera = GetComponent<Camera>();
        }
    
        void OnEnable()
        {
            if (postEffectMat == null)
                postEffectMat = new Material(Shader.Find("Unlit/InverseMatrix"));
            currentCamera.depthTextureMode |= DepthTextureMode.Depth;
        }
    
        void OnDisable()
        {
            currentCamera.depthTextureMode &= ~DepthTextureMode.Depth;
        }
    
       void OnRenderImage(RenderTexture source, RenderTexture destination)
        {
            if (postEffectMat == null)
            {
                Graphics.Blit(source, destination);
            }
            else
            {
                Matrix4x4 projMat = GL.GetGPUProjectionMatrix(currentCamera.projectionMatrix, false); //这句重点了,如果直接使用camera的投射矩阵的话,则会得不到准确的颜色效果。
                var vpMatrix = projMat * currentCamera.worldToCameraMatrix;
                postEffectMat.SetMatrix("_InvVP", vpMatrix.inverse);
                Graphics.Blit(source, destination, postEffectMat);
            }
        }
    }
    
    

    这个C#很简单,它做了两个重要的事情,一个是负责将深度图传递给我们将要编写的shader,这个是unity自己为我们做的事情,另外一个工作还要传递一个逆矩阵给我们将要编写的shader。
    千呼万唤使出来,我们的后处理的shader如下:

    Shader "Unlit/InverseMatrix"
    {
    	SubShader
    	{
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "UnityCG.cginc"
    
    			sampler2D _CameraDepthTexture;
    			float4x4 _InvVP;
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			struct v2f
    			{
    				float4 vertex : SV_POSITION;
    				float2 uv : TEXCOORD0;
    			};
    
    			v2f vert(appdata v)
    			{
    				v2f o;
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = v.uv;
    				return o;
    			}
    
    			fixed4 frag(v2f i) : SV_Target
    			{
    				float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
    				float4 ndc = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, depth, 1);
    				worldPos /= worldPos.w;
    				return worldPos;
    			}
    			ENDCG
    		}
    	}
    }
    
    

    最核心的应该frag中的采样深度图的代码,以及使用逆矩阵变换ndc坐标到世界坐标的代码了。这里为什么要最后除以w分量呢?请参考文章最后给出的链接。
    ok,这样之后我们得到的图如下:
    在这里插入图片描述
    上图scene视图下的plane它没有后处理效果,也就是原始的使用绘制世界坐标的的颜色。下图是用深度图反推世界坐标的颜色,我们只关注中间的plane颜色即可,两个颜色是正确的,说明反推正确。

    这里有一个小小的疑问为什么, float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
    用顶点的uv直接就也采样深度图了,这也是百思不得其解的,有人造吗?
    至此,第一种方式验证成功。

    下面就要介绍,使用射线偏移的方法,反推世界坐标了,这也是建议使用的方式,因为,使用逆矩阵的方式,是针对屏幕上的每个像素都要进行矩阵变换,这个比较耗。

    这个博客有点长了,一时写不了,后面会继续补充。

    参考:
    https://blog.csdn.net/puppet_master/article/details/77489948
    http://feepingcreature.github.io/math.html

    展开全文
  • unity 屏幕坐标&世界坐标相互转换

    万次阅读 2018-02-11 21:04:53
    世界坐标转屏幕坐标:Vector3 screenPos = Camera.main.WorldToScreenPoint(pos); 屏幕坐标转世界坐标:Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos);
  • 世界坐标系和相机坐标系,图像坐标系的关系

    万次阅读 多人点赞 2016-01-26 19:36:04
    二、图像坐标:我想和世界坐标谈谈(B)  玉米将在这篇博文中,对图像坐标与世界坐标的这场对话中涉及的第二个问题:谈话方式,进行总结。世界坐标是怎样变换进摄像机,投影成图像坐标的呢?  玉米做了一个简单的...
  • 世界坐标系与像素坐标系的点互相转换

    万次阅读 多人点赞 2017-11-27 18:42:00
    最近是多么的崩溃,昨天中了最新的cerber病毒,把我的电脑资料一扫而空,虽然有备份,但是已经是一周前的了。不得不加班加点补回来。 这篇博客,这是我第二次写,我凭着记忆,重新写一遍之前写的,因为之前写好了...
  • 世界坐标系,相机坐标系和图像坐标系的转换(Python)

    万次阅读 多人点赞 2020-10-20 10:58:47
    世界坐标系,相机坐标系和图像坐标系的转换(Python) 相机内参外参说明:https://panjinquan.blog.csdn.net/article/details/102502213 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系...
  • 世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换 图像处理、立体视觉等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图: 构建世界坐标系只是为了更好的描述...
  • 世界坐标系,相机坐标系,图像坐标系,图像像素坐标系这四个坐标系的转换实质就是刚体变换、透视投影和数字化图像这几个成像里的步骤。 一、世界坐标系到相机坐标系 世界坐标系,也称为测量坐标系,它是一个三维...
  • 最近在网上看到了很多关于坐标系转换的帖子,但是其内容很多都是相互转载(甚至还有一部分是错误的),同时大部分的文章内容都是告诉你四种坐标系间的相互转化的数学公式,看完之后很多时候还是不知所云,本文意在...
  • world为世界坐标系,可以任意指定xwx_wxw​轴和ywy_wyw​轴,为上图P点所在坐标系。 camera为相机坐标系,原点位于小孔,z轴与光轴重合,xwx_wxw​轴和ywy_wyw​轴平行投影面,为上图坐标系XcYcZcX_cY_cZ_cXc​Yc​...
  • 介绍 unity 总共有四种坐标: ... 3,世界坐标,三维世界坐标 数据类型是vector3 Unity3D的四种坐标系 【Unity3D的四种坐标系】 1、World Space(世界坐标):我们在场景中添加物体(如:Cube...
  • 【Unity3D】世界坐标与屏幕坐标

    万次阅读 2017-05-08 17:42:04
    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。...其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。 在Unity3D中一打开就会有一个主照相机Main Camera,根
  • UGUI坐标与世界坐标的转换

    万次阅读 2017-10-31 15:04:40
    UGUI坐标的转换网上网友说的很多,有正确的也有误导的,这里我通过实验来总结了一下正确的转换方式(假设你充分了解RectTransform坐标系和本地坐标、世界坐标的关系): 一、将UGUI坐标转化为世界坐标,比如说我想...
  • 屏幕坐标向世界坐标转换

    千次阅读 2013-05-29 14:24:34
    计算机中有很多坐标系,对象坐标系、世界坐标系、裁剪坐标系、屏幕坐标系!OpenGL流水线很容易实现上述顺序的转换。从网上查的信息: 1. 设备坐标系与屏幕坐标系 设备坐标(Device Coordinate)又称为物理坐标...
  • unity中世界坐标与局部坐标

    万次阅读 2015-10-31 16:01:29
     unity中的坐标系统包括世界坐标(World Space),屏幕坐标(Screen Space),视口坐标(View Space)以及GUI坐标系统。  世界坐标(World Space)  场景中添加的对象,它们是以世界坐标显示在场景中,可以通过代码...
  • OpenCV局部坐标系和世界坐标系转换

    千次阅读 2019-10-16 14:27:55
    假设机器在p1处在世界坐标系下的位姿为(x,y,z,θ)=(1,1,0,0),p1 和p2之间的转换为t12表示为(1,1,0,45), 求p2处世界坐标系下的位姿(x,y,z,θ)? 结果为(2,2,0,45)#include&lt;opencv2/...
  • world为世界坐标系,可以任意指定轴和轴,为上图P点所在坐标系。 camera为相机坐标系,原点位于小孔,z轴与光轴重合,轴和轴平行投影面,为上图坐标系。 image为图像坐标系,原点位于光轴和投影面的交点,轴和轴平行...
  • 现在的问题是屏幕坐标转世界坐标异常,不管点击屏幕上的任何一点,计算出的世界坐标都几乎一样,只有小数点后好几位的值有细微差别,旋转相机或者远离或靠近地球时坐标值会改变,但依然屏幕任何一点的坐标都差不多...
1 2 3 4 5 ... 20
收藏数 82,165
精华内容 32,866
关键字:

世界坐标