关于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同学,希望我的这个帖子能给遇到相同问题困扰的同学带来帮助:)

  结贴!

 
 
 
 
posted @ 2013-06-18 22:21  yaukey  阅读(4083)  评论(0编辑  收藏  举报