从昨天开始遇到一个看似很小,但令我苦恼的问题,由于对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. C#中隐式类型本地变量var

    在新接触的项目中,看到很多声明变量时用var.只记得在javascript中声明变量用var.今天在家里看C#和.Net高级编程,看到隐式变量这一块,就总结一下C# 中隐式变量var的用法. 1.C# ...

  2. asp.net各种获取客户端ip方法

    Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ...

  3. hadoop_并行写操作思路

    这篇文章是关于,如何修改hadoop的src以实现在client端上传大文件到HDFS的时候, 为了提高上传的效率实现将文件划分成多个块,将块并行的写入到datanode的各个block中 的初步的想 ...

  4. linux下安装mysql5.6(官方文档)

    Using the MySQL Yum Repository  /  Installing MySQL on Linux Using the MySQL Yum Repository Chapter ...

  5. YII CRUD 例子

    < ? php class PostTest extends CDbTestCase{ public $ fixtures = array ( 'posts' = > 'Post' , ' ...

  6. Java单例模式深入详解

    原文地址:http://www.cnblogs.com/hxsyl/ 仅作为笔记收藏…… 一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过stati ...

  7. 4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  8. 使用SourceTree将bitbucket的远程仓库回滚到某一次提交-b

    目的: 使用SourceTree将bitbucket的远程仓库回滚到某一次提交. 原理: 在本地需要回滚的commit上创建一个分支,将该分支合并到远程仓库. 准备: 远程仓库有一个master主分支 ...

  9. 用Org-Mode和Jekll写博客

    该文章同时发布在我的github blog上:http://cheukyin.github.io/jekyll/emacs/2014-08/org2jekyll.html 1 前言 在这个月之前,我一 ...

  10. VS中无法加入断点进行调试解决方案

    原文地址:http://blog.csdn.net/gukesdo/article/details/6535054 [ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DL ...