从昨天开始遇到一个看似很小,但令我苦恼的问题,由于对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(,,);
float3 viewLightPos = float3(,,); float3 dirToLight = viewPos.xyz - viewLightPos; float3 h = viewDir + normalize(-dirToLight);
o.spec = _SpecColor * pow(saturate(dot(viewNormal, normalize(h))), ); 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同学,希望我的这个帖子能给遇到相同问题困扰的同学带来帮助:)

  结贴!

 
 
 
 

关于Unity的ViewSpace(CameraSpace)的坐标系的更多相关文章

  1. 【Unity】5.1 3D坐标系基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...

  2. Unity 3D 的四种坐标系

    1, World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2, Screen Spa ...

  3. Unity小厨房之-----背后视角摄像机

    相信每一个接触过Unity的人,应该都认识Unity引擎自带的那个水管工,也一定知道那个小人模型上挂着3个脚本控制着小人的一切,今天我就来说一下关于Unity背后视角摄像机的实现,当然方法并不唯一,这 ...

  4. Unity 4.3 2D 教程:新手上路

    这篇文章译自 Christopher LaPollo 先生的 Unity 4.3 2D 教程的第一部分 Unity 4.3 2D Tutorial: Getting Started 感谢这套优秀教程的 ...

  5. Unity引擎相关知识UnityKnowledgeHyperlink

    请简述Unity中的四种坐标系 http://liuqingwen.me/blog/2017/07/31/understanding-coordinate-system-in-unity3d/

  6. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  7. 【Unity】8.1 Unity内置的UI控件

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 Unity 5.x内置了-套完整的GUI系统,提供了从布局.控件到皮肤的-整套GUI解决方案,因此可直接利用它做出各种风 ...

  8. Siki_Unity_3-16_3D数学基础

    Unity 3-16 3D数学基础 任务0-1:课程介绍 课程大纲: 1. 3D数学介绍 2. Unity中的几种坐标系: 全局坐标系.屏幕坐标系等 坐标系间的坐标转换:比如屏幕坐标转换到世界坐标 3 ...

  9. 第三章 学习Shader所需的数学基础(3)

    @[TOC] 1. 顶点的坐标空间变换过程 我们知道,在渲染流水线中,一个顶点要经过多个坐标空间的变换才能最终被画在屏幕上.一个顶点最开始是在模型空间中定义的,它最后会被变换到屏幕空间中,得到真正的屏 ...

随机推荐

  1. [Excel] C# ExcelHelper操作类 (转载)

    点击下载 ExcelHelper.rar 主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Exc ...

  2. Oracle数据库学习 视图、序列及存储过程

    视图(View) 视图也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示. 视图对应一个select语句,结果集被赋予一个名字,也就是视图的名字. 视图本身不包含任何数据,它只是包含映射到基表的一个查 ...

  3. Quartz定时任务使用小记(11月22日)

    骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...

  4. matlab结构体形式保存数据生成.mat文件< 转>

    2015年 参加天池大数据竞赛     为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVX ...

  5. 网页解析Jsoup简单使用

    public static void main(String[] args) throws IOException { //System.out.println("Hello World!& ...

  6. 看es6 字符串新方法有感

    'x'.repeat(3) // "xxx" 'hello'.repeat(2) // "hellohello" 'na'.repeat(0) // " ...

  7. 下载安装sublime text3,打包sublime text3便携版,激活sublime text3,配置sublime text3的php环境

      下载安装sublime text3: http://www.sublimetext.com/3 安装就一直下一步   打包sublime text3便携版 : 参考http://segmentfa ...

  8. C#快递单号查询源码

    源码本人测试过,没有啥问题,能查询快递单号,支持的快递还挺多,圆通快递.申通快递.韵达快递的都支持单号查询的,程序是通过向爱快递(www.aikuaidi.cn)接口传输参数来查询快递单号,我直接把代 ...

  9. 【python之旅】python的基础二

    一.集合的操作 1.什么是集合?     集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重:把一个列表变成集合,就自动去重 关系测试:测试两组数据之前的交集,差集,并集等关系   2.常用 ...

  10. windows下使用cxfreeze打包python3程序

    1:下载适合版本的cxfreeze http://sourceforge.net/projects/cx-freeze/files/4.3.2/ 2:安装,注意python版本是否正确 3:安装完成后 ...