12345 第1页 | 共5 页下一页
返回列表 发新帖
查看: 19319|回复: 48
打印 上一主题 下一主题

away3d4.0 新手入门系列教程 第四讲 创建天地

[复制链接]

10

主题

3

听众

760

积分

初级设计师

Rank: 3Rank: 3

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-8-29 23:06:26 |只看该作者 |倒序浏览
今天我们来讲一下运用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)来获取地形的高度。 让我们的摄像机和地形高度同步。这样便可以完美的模拟出以第一视角在高低不平的路上行走。





期到此结束。我会上传源文件供大家学习。



分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

wsk    

0

主题

1

听众

24

积分

设计初学者

Rank: 1

纳金币
24
精华
0

活跃会员 灌水之王

沙发
发表于 2012-9-7 11:53:26 |只看该作者
顶顶!!!!!!!!!!!!
回复

使用道具 举报

0

主题

0

听众

22

积分

设计初学者

Rank: 1

纳金币
22
精华
0
板凳
发表于 2012-9-7 17:30:15 |只看该作者
只有5节课吗?继续等待中。。。。。。。
回复

使用道具 举报

10

主题

3

听众

760

积分

初级设计师

Rank: 3Rank: 3

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-9-7 19:19:36 |只看该作者
原帖由  如同  于 2012-09-07 17:30 发表:
只有5节课吗?继续等待中。。。。。。。

-----------------------------------------------------
下一节会讲下模型导入 就是新手教程的最后一节 往后可能会多用实例来讲解 谢谢支持
回复

使用道具 举报

zsg    

0

主题

0

听众

34

积分

设计初学者

Rank: 1

纳金币
34
精华
0
5#
发表于 2012-9-18 22:52:21 |只看该作者
很好的教程,让俺入门了。感谢。
回复

使用道具 举报

0

主题

0

听众

28

积分

设计初学者

Rank: 1

纳金币
24
精华
0
6#
发表于 2012-9-19 13:23:58 |只看该作者
这个入门教程很好,顶起
回复

使用道具 举报

0

主题

0

听众

20

积分

设计初学者

Rank: 1

纳金币
16
精华
0
7#
发表于 2012-9-21 16:53:21 |只看该作者
很喜欢这个教程~
回复

使用道具 举报

0

主题

1

听众

18

积分

设计初学者

Rank: 1

纳金币
16
精华
0
8#
发表于 2012-9-27 11:31:16 |只看该作者
回复

使用道具 举报

0

主题

0

听众

16

积分

设计初学者

Rank: 1

纳金币
16
精华
0
9#
发表于 2012-10-3 15:11:38 |只看该作者
太谢谢楼主了,顶顶顶顶~~~
回复

使用道具 举报

0

主题

0

听众

14

积分

设计初学者

Rank: 1

纳金币
14
精华
0
10#
发表于 2012-10-4 11:38:49 |只看该作者
非常感激!!~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

12345 第1页 | 共5 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 00:42 , Processed in 0.137348 second(s), 37 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部