从昨天开始遇到一个看似很小,但令我苦恼的问题,由于对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. (转)网站隔几天打不开,多次重启Apache解决办法

    网站打不开了重启一下apache又好了,但过二天又打不开了,只有重启一下才好,基本上二天重起一次,本文主要解决这个问题 工具/原料 linux服务器 网站 方法/步骤   注意观察cpu占用情况{:s ...

  2. [JS] JavascriptHelp (转载)

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  3. C# 调用AForge类库操作摄像头

    如有雷同,不胜荣幸,若转载,请注明 最近做项目需要操作摄像头,在网上百度了很多资料,很多都是C#调用window API 发送SendMessage,实现操作摄像头,但是C#调用window API的 ...

  4. ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等

    [摘要]ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.本文介绍ThinkPHP 中使用 PHPMailer 发送邮件. PHP是自带可以发送邮件的Ma ...

  5. php返回相对时间(如:20分钟前,3天前)的方法

    function plural($num) { if ($num != 1) return "s"; } function getRelativeTime($date) { $di ...

  6. 网站访问架构cdn与负载均衡

    曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需 要从无数个角度去考虑他,大到服务器的布局,小到软件中某个 ...

  7. mysql-积累管理sql语句

    //连接数据库 mysql -h xxx -u root -p; //查看数据库 show databases //查看数据表 show tables //查看某数据表结构 desc xxx表 //修 ...

  8. python读取excel文件

    一.xlrd的说明 xlrd是专门用来在python中读取excel文档的模块,使用前需要安装. 可以到这https://pypi.python.org/pypi/xlrd进行下载tar.gz文件,然 ...

  9. mssql 获取表结构信息

    SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名, (case when ...

  10. 字符串copy

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...