- 最后登录
- 2017-6-3
- 注册时间
- 2012-8-13
- 阅读权限
- 30
- 积分
- 760
- 纳金币
- 3
- 精华
- 0
|
今天我们来讲一下运用SkyBox和 Elevation 来创建一个3D虚拟世界
ps:从这一期开始 因为代码量的增加 我会以单独类来发代码。方便管理也方便阅读。
1创建天(SkyBox)
我们一般创建天空用球(Sphere)或者天空盒子(SkyBox)。 SkyBox是最为广泛的用来模拟天空,它不受摄像机渲染范围的影响,且能保持同步,所以在3D的虚拟世界里,天空永远都在远端。
既然是盒子 所以我们用一个BitmapCubeTexture 来做贴图容器。
BitmapCubeTexture 是个盒子贴图,里面可以放置6张无缝位图贴图,类似于盒子的6个面。贴图方式如下图
以下就是Sky类创建的全部代码
package skyBox
{
import away3d.containers.ObjectContainer3D;
import away3d.primitives.SkyBox;
import away3d.textures.BitmapCubeTexture;
import away3d.textures.CubeTextureBase;
public class Sky extends ObjectContainer3D
{
private var _skyBox:SkyBox;
[Embed(source='asset/SkyBox/sky_negX.jpg')]
private var m_1:Class;
[Embed(source='asset/SkyBox/sky_negY.jpg')]
private var m_2:Class;
[Embed(source='asset/SkyBox/sky_negZ.jpg')]
private var m_3:Class;
[Embed(source='asset/SkyBox/sky_posX.jpg')]
private var m_4:Class;
[Embed(source='asset/SkyBox/sky_posY.jpg')]
private var m_5:Class;
[Embed(source='asset/SkyBox/sky_posZ.jpg')]
private var m_6:Class;
public function Sky()
{
_cubeMapMaterial=new BitmapCubeTexture(new m_4().bitmapData,new m_1().bitmapData,new m_5().bitmapData,new m_2().bitmapData,new m_6().bitmapData,new m_3().bitmapData);
_skyBox=new SkyBox(_cubeMapMaterial);
this.addChild(_skyBox);
}
}
}
现在我们来创建地面
用过unity3d的人应该比较清楚。Unity3D的地形是用笔刷刷出来的。其实笔刷并非是真正把地形刷起来了。而是去绘制了颜色。Unity3d通过颜色来改变了地形。在Away3d里同样可以。
我们可以用Elevation来创建一个复杂的地形。
创建地形图我们需要一张地形图。地形图的样式如下图
一张黑白渐变的图 。如同在外太空看地球一样。颜色越深的地方海拔越低。相反越浅的地方海拔越高。我们之需要给他最高的值 他便会按照这个值 用颜色来生成出个复杂的地形。
我们现在来创建一个25000*25000 最高的高度为1000的地形
_terrain = new Elevation(terrainMaterial, new HeightMap().bitmapData, 25000, 1000, 25000);
terrainMaterial为一个地形的TextureMaterial的位图贴图, new HeightMap().bitmapData 遍为这张高度图。
我们的Terrian类为
package terrain
{
import away3d.containers.ObjectContainer3D;
import away3d.ex***sions.Elevation;
import away3d.materials.TextureMaterial;
import away3d.materials.methods.FogMethod;
import away3d.materials.methods.TerrainDiffuseMethod;
import away3d.textures.BitmapTexture;
public class Terrain extends ObjectContainer3D
{
[Embed(source="asset/terrain/terrain_diffuse.jpg")]
private var Albedo:Class;
[Embed(source="asset/terrain/terrain_heights.jpg")]
private var HeightMap:Class;
[Embed(source="asset/terrain/terrain_normals.jpg")]
private var Normals:Class;
[Embed(source="asset/terrain/grass.jpg")]
private var Grass:Class;
[Embed(source="asset/terrain/rock.jpg")]
private var Rock:Class;
[Embed(source="asset/terrain/beach.jpg")]
private var Beach:Class;
[Embed(source="asset/terrain/terrain_splats.png")]
private var Blend:Class;
private var _terrain:Elevation;
private var fogMethod:FogMethod;
private var terrainMaterial:TextureMaterial;
public function Terrain()
{
fogMethod=new FogMethod(5000,10000,0x5f5e6e);
terrainMaterial = new TextureMaterial(new BitmapTexture(new Albedo().bitmapData));
terrainMaterial.normalMap = new BitmapTexture(new Normals().bitmapData);
terrainMaterial.ambientColor = 0xff00ff;
terrainMaterial.ambient = 1;
terrainMaterial.specular = .2;
_terrain = new Elevation(terrainMaterial, new HeightMap().bitmapData, 25000, 1000, 25000);
addChild(_terrain);
}
public function get getTerrain():Elevation
{
return _terrain;
}
}
}
好了 天地创建完了 我们打开输出之后可以看到我们所创建的天和地了
好了 我们一个简单的天地就创建出来了,看起来不错吧。我们可以放置一个FirstPersonController 的第一视角的摄像机来和第一人称射击游戏那样去观看这个3D世界。
这里为了模拟人物在高地不同的地面上行走。我们一方面会采取类似awyphyscis 或者jiglib这样的3D物理引擎。但是 我们用Elevation里我们可以通过getHeightAt(x,z)来获取地形的高度。 让我们的摄像机和地形高度同步。这样便可以完美的模拟出以第一视角在高低不平的路上行走。
期到此结束。我会上传源文件供大家学习。
|
|