Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用Unity开发Virtual Reality #1

Open
Jenna-u opened this issue Oct 27, 2016 · 0 comments
Open

使用Unity开发Virtual Reality #1

Jenna-u opened this issue Oct 27, 2016 · 0 comments

Comments

@Jenna-u
Copy link
Contributor

Jenna-u commented Oct 27, 2016

使用Unity开发Virtual Reality

在进行第一个VR应用开发之前,我们来看看几个重要的概念

  1. 搭建场景:创建一个可视化、可交互、脚本驱动的虚拟现实环境。
  2. 立体渲染:用两个相机渲染场景分别表示用户的左右眼,然后通过Oculus Rift头显的透镜,这两幅图片被重合在一起,从而形成清晰且具有深度视觉的场景。
  3. 头动追踪:通过捕获Oculus Rift头显的位置和转向来改变虚拟世界中相机的位置和转向。

我们需要编写大量3D操作的代码来表现我们的想法,可以直接通过OpenGL和DirectX来渲染3D视图,但是这样做太浪费时间了,unity3D游戏引擎来做这件事,Unity用于快速构建VR内容非常合适,最主要的是它非常容易掌握。

依照国际惯例先放几张完成后的截图:
2016-09-22 3 13 31
2016-09-22 3 13 40

四不四很高大上啊

如果有兴趣想学习Unity
一、可以按照下面的学习路线
c

推荐几个学习Unity的网站:
Unity中文官方论坛http://forum.china.unity3d.com/forum.php
Unity官方文档https://unity3d.com/cn/learn/
Unity知乎话题http://www.zhihu.com/topic/19568806

二、Unity开发VR的流程
default

三、Unity重要模块的类图
4d963e63-18ff-4c70-88a1-84bf4cb017bf

Component的类如下:

Component 作用
RigidBody(碰撞器) 刚体使物体能在物理控制下运动刚体可通过受力与扭矩,使物体像现实方式一样运动;任何物体想要受重力影响,受脚本施加的力的作用,或通过NVIDIA PhysX物理引擎来与其它物体交互,都必须包含至少一个刚体组件
Collider(碰撞器) 和刚体一起,使碰撞发生如果两个刚体撞在一起,物理引擎将不会计算碰撞除非它们包含一个碰撞器组件。没有碰撞器的刚体,会在物理模拟中相互穿透
Renderer(渲染器) 渲染器使物体显示在屏幕上 对于任何游戏物体或组件可以通过它的渲染器属性来访问。使用这个类可访问任意物体,包括网格和粒子系统渲染器可以禁用,使物体不可见
AudioSource(音频源) 在场景中播放音频剪辑 如果音频剪辑是一个3D剪辑,音频源是在一个给定的未知,音频剪辑会以随距离衰减的方式进行播放
Animation(动画) animation组件用于播放动画 可以指定动画剪辑到动画组并通过脚本控制动画播放 animation系统支持动画融合、叠加动画、动画混合。。如果想播放一个简单的动画,可以使用Animation.Play 若果想在动画之间交叉淡入,可以使用Animation.CrossFad
Animator(动画控制器) Animator组件声明了一个Animator控制器,用来设置角色上的行为 包括:状态机、融合树、通过脚本控制的事件

四、Unity Component的生命周期

063a35a3-c6ca-4486-9617-f6a534dd88b2

五、简单介绍几个常用组件

  1. Mesh相关组件
  • Mesh Filter:网络过滤器。该组件用于在项目资源中获取网格(Mesh)并将其传递到所属的Game Obeject中。添加Mesh Filter后,还需要添加一个Mesh Renderer组件,否则网格虽然实际存在于场景中,但不会被渲染出来
  • Text Mesh:文本网格。用于生成三维的字符串
  • Mesh Renderer:网格渲染器。该组件用于从网格过滤器获得网格模型,进而根据Game Object的Transform组件中定义的位置并在Scene视图中渲染
  • Skinned Mesh Renderer:蒙皮渲染器。该组件用于呈现骨骼动画

2.Particle System组件
Particle System组件用于创作烟雾、气流、火焰、瀑布、喷泉、涟漪等效果
(建议使用realflow制作)

  1. Physics组件
    Physics组件分为Physics和Physics 2D两种。Unity拥有内置的NVIDIA PhysX物理引擎,可以模拟真实的物理行为。
  2. Image Effects组件
    Image Effects组件用于提高画面的画质感(图像后处理特效)。Image Effects可以为游戏画面补充很多外观和视觉上的效果。
    (也可以用AE)
  3. Scripts
    用于添加到Game Object上实现各种交互操作及其它功能
  4. 音效系统和Mecanim系统省略

六、Shuriken粒子系统

Shuriken粒子系统采用了模块化管理,个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种缤纷复杂的粒子效果。

创建一个粒子系统的方式有两种:
1.分别选择菜单栏中的 GameObject - Create Other - Particle System
2.创建一个Empty对象,在Component - Effects - Particle System

下面是粒子系统的属性面板

lizi

创建一个粒子系统后,
1.默认展开的是粒子系统的初始化模块:此模块为固有模块,不可删除或者禁用。该模块定义了粒子初始化时的持续时间、循环方式、发射速度、大小等一些列基本的参数。

2.Emission:发射模块
控制粒子的发射速率(Rate),在粒子持续时间内,可实现某个特定时间生成大量粒子的效果,可模拟爆炸效果生成一大堆的粒子。

3.Shape :形状模块
定义粒子发射器的形状,可提供沿形状表面法线或随机方向的初始力,并控制粒子的发射位置以及方向。

4.Velocity over Lifetime :生命周期速度模块
制着生命周期内每一个粒子的速度,对有着物理行为的粒子效果更明显,但对于那些简单视觉行为效果的粒子,如烟雾飘散效果以及与物理世界几乎没有互动行为的粒子,此模块的作用就不明显了。

5.Limit Velocity over lifetime :生命周期速度限制模块
控制粒子在生命周期内的速度限制以及速度衰减,可以模拟类似拖动的效果。若粒子的速度超过设定的限定值,则粒子速度之会被锁定到该限定值。

6.Force over Lifetime:生命周期作用力模块
控制粒子在生命周期内的受力情况。

7.Color over lifetime:生命周期颜色模块
控制粒子在生命周期内的颜色变化。

8.Color by Speed:颜色的速度控制模块
此模块可让每个粒子的颜色根据自身的速度变化而变化。

9.Size Over Lifetime :生命周期粒子大小模块
控制每一颗粒子在其生命周期内的大小变化。

10.Size by Speed:粒子大小的速度控制
此模块可让每颗粒子的大小根据自身的速度变化而变化。

11.Rotation Over Lifetime :生命周期旋转模块
控制每颗粒子在生命周期内的旋转速度变化。

12.Rotation by Speed :旋转速度控制模块
此模块可让每颗粒子的旋转速度根据自身速度的变化而变化。

13.External Forces:外部作用力模块
此模块可控制风域的倍增系数。

14.Collision:碰撞模块
可为每颗粒子建立碰撞效果,目前只支持平面碰撞,该碰撞对于简单的碰撞检测效率非常高。

15.Sub Emitters:子发射器模块
此模块可时粒子在出生、消亡、碰撞等三个时刻生成其他的粒子。

16.TextureSheet Animation:序列帧动画纹理模块
可对粒子在其生命周期内的UV坐标产生变化,生成粒子的UV动画。可以将纹理划分成网格,在每一格存放动画的一帧。同时也可以将文理划分为几行,每一行是一个独立的动画。需要注意的是,动画所使用的纹理在Renderer模块下的Material属性中指定。

17.Renderer:粒子渲染器模块
该模块显示了粒子系统渲染相关的属性。

七、Shader(着色器)和Material(材质)
ps:补充下可能用到的计算机图形学内容光照与材质

  1. Shader和Material基本概念
    Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。
    Shader只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。
  2. Unity中Shader的三种基本类型
    计算机图形学中的渲染管线一般可以分为两种类型:
    1.固定功能渲染管线(fixed-functionrendering pipelines)
    2.可编程渲染管线(programmablerendering pipelines)

Unity中Shader分为三种基本类型:
1.固定功能着色器(Fixed Function Shader)
2.表面着色器(Surface Shader)
3.顶点着色器&片段着色器(Vertex Shader & Fragment Shader)

固定功能着色器便是我们所说的固定功能渲染管线(fixed-functionrendering pipelines)的具体表现,而表面着色器、顶点着色器以及片段着色器便属于可编程渲染管线。

  1. 区分Shader类型
    没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字的,就是固定功能着色器。
    嵌套了CG语言,代码段中有surf函数的,就是表面着色器。
    嵌套了CG语言,代码段中有#pragma vertex name和 #pragma fragment frag声明的,就是顶点着色器&片段着色器。
  2. Shader的基本框架
    Unity中Shader整体的框架写法可以用如下的形式来概括:
    Shader "name" { [Properties] SubShaders[Fallback] }
    ps:所有用于这个着色器的代码必须放置在之后的大括号中:{ }(称为“块”)。该名字应该是短且描述性的文字。它并不需要和shader文件名相同。而想要把着色器加入到Unity的子菜单里,名字需要用斜线(/)。

ae769482-adc2-4e98-a627-8562b8ebc904

首先是一些属性定义,用来指定这段代码将有哪些输入。接下来是一个或者多个的子着色器,在实际运行中,哪一个子着色器被使用是由运行的平台所决定的。子着色器是代码的主体,每一个子着色器中包含一个或者多个的Pass。在计算着色时,平台先选择最优先可以使用的着色器,然后依次运行其中的Pass,然后得到输出的结果。最后指定一个Fallback,即备胎,用来处理所有SubShader都不能运行的情况。

ps:在实际进行表面着色器的开发时,我们就是直接在SubShader这个层次上写代码,系统会将把我们的代码编译成若干个合适的Pass。
ps:SubShader在UnityShader的代码段中必须有且至少有一个,而properties和fallback对于追求简单的Shader,是可以不写出来的。而复杂一点的Shader,当然各种properties、fallback什么的肯定都有,甚至有多个SubShader,而每个SubShader中又有多个Pass。

ps:最后完成的工程并不适配oculus SDK,需将oculus SDK的摄像机设置为胶囊型刚体

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant