• 关于Unity的ViewSpace(CameraSpace)的坐标系


      从昨天开始遇到一个看似很小,但令我苦恼的问题,由于对Unity的坐标系没有直接搞清楚,所以导致一个shader没看懂,于是发了个贴:http://game.ceeger.com/forum/read.php?tid=11367&fid=2,结果到晚上终于搞明白了,心情大好,趁热分享。

      因为实在是懒得再重新写一遍了,我就把原帖子抄一遍:

      一楼:

    大家好,我是unity新手,在研究ShadowGun提供的shader,其中建筑使用的高光shader:“MADFINGER-Lightmap- Unlit-VirtualVertexGlossy-Add.shader”,这里面是在viewspace中计算视角和vertex的法线以及光线间 的关系,来确定高光,以下是vertex shader中选取的重要部分(为了简化,去掉了无关部分):

    v2f vert (appdata_full v)
    {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.texcoord;
                   
            float3 viewNormal   = mul((float3x3)UNITY_MATRIX_MV, v.normal);
            float4 viewPos      = mul(UNITY_MATRIX_MV, v.vertex);
            float3 viewDir      = float3(0,0,1);
            float3 viewLightPos = float3(0,0,0);
                   
            float3 dirToLight = viewPos.xyz - viewLightPos;
                   
            float3 h = viewDir + normalize(-dirToLight);
            o.spec   = _SpecColor * pow(saturate(dot(viewNormal, normalize(h))), 89);
          
            return o;
    }

           对于基本的算法我没有疑问,疑问在于:
    疑问1: “viewDir”是如果是float3(0,0,1)的话,那么应该是从眼睛的位置(原点)沿着轴的正方向,“dirToLight”也是从原点到顶点 的方向,所以第14行计算二者的和时,“dirToLight”方向取了反指向原点,所以按道理"viewDir"也应该取反但是这里没有,如果我把 “viewDir”取反计算结果反而不对,难道在viewspace中“viewDir”为float3(0,0,1)时方向为沿着z轴负方向吗?
    疑问2:在viewspace中,所有方向指向摄像机的法线“viewNormal”(假设全都沿着摄像机的z轴指向原点),在单位化后不都应该 是(0,0,-1)吗?可实际情况是(0,0,1),因为我把所有viewspace中的法线用颜色表示出来,面对摄像机的法线都是蓝色(0,0,1), 看到这里又有些凌乱
       以上就是我现在非常不理解的地方,有明白的同学能不能给讲解下,或者跟我一样有疑惑的同学一起探讨下,谢谢

      二楼:

    画了个图

    图片:未命名.PNG

      三楼:

    原来是坐标系的问题
    heroboy:画了个图回到原帖

            多谢heroboy的回复,还画了这么形象的图,一目了然,辛苦啦:),我的误区在坐标系:我一直把unity的viewspace的z轴正方向是对着屏 幕往里的(左手坐标系),这么一来,unity的viewspace的坐标系变成右手的了(不对?可是实验结果确实是这样),但我今天搜索了很多资料,大 家都说unity的默认坐标系是左手,官方和其它人都没明确说viewspace的坐标系是右手。(请问heroboy同学能给个出处吗?谢啦:)

    图1 Unity中ViewSpace中法线颜色

         请看图1中这个箱子的法向量:面朝摄像机为蓝色(0,0,1),右侧红色(1,0,0),顶部这个位置看不到,实际是绿色(0,1,0)。可见为右手坐标系。

     
    图2 DX中ViewSpace中法线颜色
         请看图2中的圆柱体和地面的法向量,面朝摄像机的圆柱部分为黑色(0,0,-1),右侧为红色(1,0,0),地面的法线朝上为绿色(0,1,0)。可见为左手坐标系。

         以上为我今天的理解,现在我纠结的就是unity官方没找到哪里提起ViewSpace的坐标系为右手坐标系(虽然验证确实如此)。

      四楼:

      找到官方说法了

    heroboy:画了个图回到原帖

    1:关于Unity默认使用左手坐标系:http://docs.unity3d.com/Documentation/ScriptReference/Vector3.Cross.html
    截图:
     

    2:关于Unity中ViewSpace使用右手坐标系(ViewSpace中的Z轴方向和Unity中其它的所有坐标系相反):http://docs.unity3d.com/Documentation/ScriptReference/Camera-worldToCameraMatrix.html
    截图:
     

    至此,我的疑问全部解决,结贴!非常感谢heroboy同学,希望我的这个帖子能给遇到相同问题困扰的同学带来帮助:)

      结贴!

     
     
     
     
  • 相关阅读:
    开发中学习英语
    eclipse 常用快捷键
    eclipse 查看快捷键
    沟通的方式——大道至简第四章读后感
    java练习题——类与对象
    团队与管理方法——大道至简第三章读后感
    java程序——两数的加减乘除
    java练习题
    java程序——从命令行接收多个数字,求和之后输出结果
    李冰烧山——大道至简第二章读后感
  • 原文地址:https://www.cnblogs.com/yaukey/p/unity_viewspace_coordinate.html
Copyright © 2020-2023  润新知