纳金网
标题:
away3d4.0 新手入门系列教程 第四讲 创建天地
[打印本页]
作者:
D调的华丽
时间:
2012-8-29 23:06
标题:
away3d4.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)来获取地形的高度。 让我们的摄像机和地形高度同步。这样便可以完美的模拟出以第一视角在高低不平的路上行走。
期到此结束。我会上传源文件供大家学习。
作者:
wsk
时间:
2012-9-7 11:53
顶顶!!!!!!!!!!!!
作者:
如同
时间:
2012-9-7 17:30
只有5节课吗?继续等待中。。。。。。。
作者:
D调的华丽
时间:
2012-9-7 19:19
原帖由 如同 于 2012-09-07 17:30 发表:
只有5节课吗?继续等待中。。。。。。。
-----------------------------------------------------
下一节会讲下模型导入 就是新手教程的最后一节 往后可能会多用实例来讲解 谢谢支持
作者:
zsg
时间:
2012-9-18 22:52
很好的教程,让俺入门了。感谢。
作者:
蓝调昊
时间:
2012-9-19 13:23
这个入门教程很好,顶起
作者:
danceink
时间:
2012-9-21 16:53
很喜欢这个教程~
作者:
神魔黑
时间:
2012-9-27 11:31
作者:
測試用
时间:
2012-10-3 15:11
太谢谢楼主了,顶顶顶顶~~~
作者:
冰鏡
时间:
2012-10-4 11:38
非常感激!!~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者:
nonever200
时间:
2012-10-7 17:31
学习学习
作者:
sutang_888
时间:
2012-10-9 10:10
学习。。。
作者:
owen211
时间:
2012-10-17 15:45
非常不错哦
作者:
wahaha
时间:
2012-10-19 15:14
写的很好哦 继续努力!
作者:
seedcll
时间:
2012-10-19 15:37
写的很好 看下具体的11
作者:
zzlasp
时间:
2012-10-22 19:00
完整详尽的实例,收集了。
作者:
白菜无敌
时间:
2012-10-23 14:26
非常感谢老师的辛勤劳动
作者:
Roltec
时间:
2012-10-24 12:37
阿斯达斯好好看看一下一下
阿斯达斯
作者:
huixiusnow
时间:
2012-10-29 09:09
顶 ,太有用了
作者:
alps
时间:
2012-10-31 14:20
源文件呢,没看到啊。。。
作者:
acso
时间:
2012-10-31 20:39
源文件在哪里呢?请发下 286031567@qq.com谢谢
作者:
zhust
时间:
2012-11-8 16:36
完整详尽的实例,收集了。
作者:
81537261
时间:
2012-12-5 10:13
我就顶~~~~~~~~~~~~~~~~~~~~~QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
作者:
jonas
时间:
2012-12-5 16:44
谢谢谢谢谢谢谢谢谢谢谢谢
作者:
芮雪阁
时间:
2012-12-19 16:17
顶顶顶..................
作者:
愤怒的小牛
时间:
2013-1-8 16:05
必须填满10个字符的飘过
作者:
王飞
时间:
2013-1-9 09:48
原帖由 owen211 于 2012-10-17 15:45 发表:
非常不错哦
-----------------------------------------------------
楼主很威武啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者:
xwq1849
时间:
2013-1-10 10:53
看看先生!!!!!!!!!
作者:
iha2000
时间:
2013-1-10 14:36
写的很好,受教了!!!!!!!!!!!
作者:
北海盗22
时间:
2013-1-15 15:54
楼主好人那~~~~~~感动~~~~
作者:
yu
时间:
2013-1-16 16:41
非常不错,楼主加油!
作者:
水墨
时间:
2013-1-21 16:31
受教了,受教了,谢谢
作者:
sweet
时间:
2013-1-28 11:25
谢谢楼主楼主好认啊
作者:
xxds
时间:
2013-1-28 16:01
谢谢啦.实在太有用了111111
作者:
xsshsy
时间:
2013-1-29 11:26
教程不错额,蛮好的,我下载下来看看
作者:
愤怒的水果刀
时间:
2013-2-25 11:25
多谢楼猪,楼猪好淫啊。
作者:
haoyi
时间:
2013-2-27 16:41
哇 真的挺好的 教程很详细 很明了
作者:
awakerr
时间:
2013-2-28 15:31
看不懂 页支持看不懂 页支持看不懂 页支持
作者:
long
时间:
2013-3-2 11:17
学习中。。。。。。。。。。。。。。。。。。。
作者:
来学习
时间:
2013-3-5 20:25
这个必须顶~~~这个必须顶~~~这个必须顶~~~这个必须顶~~~这个必须顶~~~这个必须顶~~~
作者:
bubi
时间:
2013-3-12 19:12
来拿素材了!oh yeah..
作者:
开拓者
时间:
2013-3-12 21:56
期待后面的教程 哈哈
作者:
luoxi1111
时间:
2013-5-6 14:33
求素材,求素材,
作者:
qq545213635
时间:
2013-6-29 11:36
牛逼啊!!!!!!!!!赞
作者:
路、人bobo
时间:
2013-8-23 15:15
加油 支持、、、
作者:
西方朔
时间:
2013-10-8 20:31
必须顶。。。
作者:
sonic
时间:
2013-10-11 02:23
好的教程,让俺入门了。感谢。
作者:
sonic
时间:
2013-10-11 02:24
thx very much
作者:
raycg
时间:
2013-10-28 04:35
很好的教程
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5