[SceneKit]引用节点Reference Nodes(八)

96
作者 里脊糖醋
2017.07.25 15:13* 字数 1394

Reference Nodes: 在一个场景中(scn文件)去使用另一场景(scn)文件, 让两个场景中的效果组合起来. 这样做可以使我们对一个复杂场景进行模块划分, 分割成不同的组件进行绘制, 最后进行组合.

使用方法

首先要有两个场景, 选中最终要展示的scene, 把要被引用的节点拖进要展示的scene即可


屏幕快照 2017-07-25 上午10.07.10.jpg

这样game.scn里面就可以使用到obj_ball.scn中的ball节点了

下面具体认识下纹理贴图各个属性的含义


屏幕快照 2017-07-25 上午9.51.45.png

Diffuse(漫反射):给3维物体包裹一个2位图像
Specular(镜面):给几何体添加高光
Normal(法线):给几何体添加凹凸显示, 因为法线贴图可以控制光线的明亮阴暗
Reflective(反射):就是把天空的颜色反射到小球上
Emission(发光):使其发光


屏幕快照 2017-07-25 上午10.14.05.png

下面讲解每一个类型贴图的具体属性含义


屏幕快照 2017-07-25 上午10.05.24.png

Intensity: 光亮强度, 这可以控制您的漫反射材料的亮度级别; 0.0会使其完全黑色。
Mip Filter: Mipmap在3D图形学中主要是用来做anti-aliasing,这跟图像学中的概念是一致的:图像在缩小时因为采样率不够,就会导致混叠现象,如果是线,就表现为断线,如果是纹理比较复杂,就表现为纹理变得杂乱。在图形学中,我们经常会用到纹理贴图(注意:图形学中的纹理与图像学中的是两个概念,图像中一般将图片中较复杂的区域,即频谱能量高的,称为纹理;图形学中将用来贴图的图片统称为纹理),用来贴图的纹理大小与真正要render的区域不一定是刚好匹配的,这样就需要做放大或缩小,如果缩小,也就会产生上面所述的混叠现象。

现在先简单的理解为是为了改善渲染效果的


78946-20151222223953624-930004401.png

Scale: 默认情况下, 也就是值为1, 1的时候, 纹理图片会正好去包裹几何体的大小相当, Scale的作用就是把纹理缩放成原来的小的比例值, 加入设置成2, 2 纹理将会变成原来的1/4大小

Scale值为1, 1

屏幕快照 2017-07-25 下午3.03.48.jpg
Scale值为2, 2; 纹理只占1/4的区域

屏幕快照 2017-07-25 下午3.03..jpg

这个时候想要使用纹理渲染全部的区域就需要使用是否让纹理重复的属性了;
WarpS: 设置水平纹理重复
WarpT: 设置垂直纹理重复


屏幕快照 2017-07-25 下午3.10.17.png

看第二张图, 因为纹理的缩放比例被设置成的原来的1/3, 所以每个面之渲染了1/9的区域, 但是在渲染区域的右侧有一部扥被拉伸了, 这个拉伸的效
果及时Mip map造成的, 当设置WarpS为repeat时, 横向的被全部渲染, 当设置了WarpT为repeat时, 竖向的全部被渲染.


SkyBox天空盒

需要被渲染的天空盒贴图, 本人现在还没搞清楚scene是如何把这张图片渲染成skybox的效果的?


img_skybox.jpg

经过拼接之后的图片


屏幕快照 2017-07-25 下午3.35.02.png

实现的效果, 由于使用模拟器运行, 会有些卡顿, 有些黑色闪屏


Jietu20170725-213656.gif

什么是skybox?

为了给人以身临其境的感觉,游戏中所有的场景都会使用天空盒技术,用以模拟无穷远处的天空、山峦等景象。天空盒的实现有以下几个关键点:

1.  天空理论上应该位于无限远处,场景中任何物品都位于天空盒前部,而不会被其遮住;
2. 当在场景中移动时,场景中的物体会相对角色移动,但天空盒与自身相对位置保持静止不变;

 针对1, 可以通过让天空盒的变换后的z坐标位于可视范围内的最大值。这样场景中任何物品都能被正确渲染,并能遮挡远处的天空。因而符合实际情况;

 针对2, 为了实现让天空盒相对自己静止的效果,有两种方法:一是针对任一时刻自己的世界坐标,
        让天空盒具有相同的平移,这样自己将永远位于天空盒中心,从而相对静止;
        另一种方法是在渲染天空盒时,不对天空盒进行世界变换,并且让其视角矩阵中平移部分变为[0, 0, 0],
        这样天空盒可以保持在原点,由于视角空间中相机永远位于原点,因此自己相对天空盒位置总是保持相对静止。

下面来介绍一下天空盒实现的具体步骤:

1. 天空盒的几何体表示

在现实生活中,天空给我们的感觉是一个半球形。因此这里我们使用一个圆球,作为天空盒的几何体表示;

2. 天空盒纹理图

为了表示无限远处的天空、山峦等现象,我们需要在该圆球表面贴上包含空间任一角度的纹理图。
Cube map由于包含六张表示立方体各个面的贴图,而整个贴图把立方体内部整个空间完整地包围起来,因此可以用它来模拟周围的环境。这处情况下的应用,我们称之为环境映射(Environment Mapping)。这个想法其实很容易理解,考虑以下情形:把摄像机调整为90度视角,宽、高比设为1,放于某一点处。然后向周边上、下、左、右、前、后六个方向上分别拍照。这种情况下摄像机所能拍摄到的部分将囊括整个场景,而这六张拍摄的图片所组成的Cube Map即可作为表示相机位置处的周边场景的环境图(Environment Map)。

3.天空纹理映射

有了天空盒的几何表示以及环境图,现在的问题就是如何映射该环境图了。在上面介绍Cube Mapping时我们说过,Cube Mapping使用3D向量来实现纹理映射。这里Environment Mapping作为一种特殊的Cube Mapping,当然也可以使用这种映射方法。

使用在Scene中直接设置的方法来设置skybox


屏幕快照 2017-07-25 下午9.44.57.jpg

之后就可以看到skybox效果了

RefrenceNodes

SceneKit