怎样开发优秀的HTML5游戏-迪斯尼《寻找奥兹之路》游戏技术详解(二)


本文摘自PHP中文网,作者黄舟,侵删。

(接上文)桌面游戏通常创建于一个核心的物理引擎。因此,要在3D世界中模拟一个柔软的物体,需要一个完整的物理模拟器,并且建立一种可信的行为。

WebGL和JavaScript还不能奢华到可以运行一个完全成熟的物理模拟器。因此,在这个游戏中我们必须找到一种方式来创建风的效果。

我们在3D模型中为每一个对象嵌入“风敏度”的信息。3D模型的每个顶点有一个“风属性”,指定顶点应该要受到风速多大程度的影响。所以,这指定了3D物体的风敏度。然后,我们需要创建“风”本身。

我们通过创建包含Perlin噪声的图像来实现。此图片意在覆盖一块确定区域的风。所以,一个考虑它的好方法是,想象3D场景中一个特定矩形区域中像噪音一样覆盖一个画面的云。这幅图片每个像素的灰度值指定在一个特定的时刻3D区域中风力有多强。

为了创建风的效果,图像以恒定的速度和特定的方向即风的方向移动。并且为了确保“风的区域”不会影响场景中的任何内容,我们将风的图像环绕边界,限制于效果的区域内。

一个风的简单3D教程

现在,让我们通过Three.js在简单的3D场景创建一个风的效果。

我们将在一个简单的“程序草地”中创建风。

首先,让我们创建场景。我们将有一个简单的、质感平坦的地面。然后每一根草将简单地用倒立的圆锥展现。

1228.jpg

布满小草的地面

下面是如何在Thress.js中用CoffeeScript创建这个简单的场景。

首先我们要设置Three.js,并把它与摄像头、鼠标,以及一些灯光结合在一起:

1

<br>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

constructor: ->

 

   @clock =  new THREE.Clock()

 

   @container = document.createElement( 'p' );

   document.body.appendChild( @container );

 

   @renderer = new THREE.WebGLRenderer();

   @renderer.setSize( window.innerWidth, window.innerHeight );

   @renderer.setClearColorHex( 0x808080, 1 )

   @container.appendChild(@renderer.domElement);

 

   @camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 5000 );

   @camera.position.x = 5;

   @camera.position.y = 10;

   @camera.position.z = 40;

 

   @controls = new THREE.OrbitControls( @camera, @renderer.domElement );

   @controls.enabled = true

 

   @scene = new THREE.Scene();

   @scene.add( new THREE.AmbientLight 0xFFFFFF )

 

   directional = new THREE.DirectionalLight 0xFFFFFF

   directional.position.set( 10,10,10)

   @scene.add( directional )

 

   # Demo data

   @grassTex = THREE.ImageUtils.loadTexture("textures/grass.png");

   @initGrass()

   @initTerrain()

 

   # Stats

   @stats = new Stats();

   @stats.domElement.style.position = 'absolute';

   @stats.domElement.style.top = '0px';

   @container.appendChild( @stats.domElement );

   window.addEventListener( 'resize', @onWindowResize, false );

   @animate()

initGrass和initTerrain函数调用分别用小草和地面填充场景:

1

<br>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

initGrass:->

   mat = new THREE.MeshPhongMaterial( { map: @grassTex } )

   NUM = 15

   for i in [0..NUM] by 1

       for j in [0..NUM] by 1

           x = ((i/NUM) - 0.5) * 50 + THREE.Math.randFloat(-1,1)

           y = ((j/NUM) - 0.5) * 50 + THREE.Math.randFloat(-1,1)

           @scene.add( @instanceGrass( x, 2.5, y, 5.0, mat ) )

 

instanceGrass:(x,y,z,height,mat)->

   geometry = new THREE.CylinderGeometry( 0.9, 0.0, height, 3, 5 )

   mesh = new THREE.Mesh( geometry, mat )

   mesh.position.set( x, y, z )

   return mesh

在此我们创建了一个格子,由15*15的小草组成。我们添加了一个随机数到每根小草的位置,让它们不会因为排列的太整齐而有些古怪。

此地形仅仅是一个水平面,放置在这些小草的根部(Y = 2.5)。

1

<br>

1

2

3

4

initTerrain:->

  @plane = new THREE.Mesh( new THREE.PlaneGeometry(60, 60, 2, 2), new THREE.MeshPhongMaterial({ map: @grassTex }))

  @plane.rotation.x = -Math.PI/2

  @scene.add( @plane )

所以到目前为止,我们所做的只是简单地创建了一个Three.js场景,并且添加了一些小草,由程序生成的倒立圆锥创建,以及一个简单的地面。

到目前为止没有任何特别之处。


现在是添加风的时候了。第一件事,我们希望把风敏度信息嵌入到草的3D模型中。

我们要把此信息以自定义属性嵌入到小草3D模型的每个顶点中。我们将要使用的规则是:每个小草模型的底部(圆锥体的顶)具有的风敏度为0,因为它贴在地面上。小草模型(圆锥体的底部)的顶部具有最大的风敏度,因为它远离地面。

下面是如何重写instanceGrass函数来为小草的3D模型添加风敏度作为自定义参数。


1

2

3

4

5

6

7

8

9

10

11

12

13

instanceGrass:(x,y,z,height)->

 

  geometry = new THREE.CylinderGeometry( 0.9, 0.0, height, 3, 5 )

 

  for i in [0..geometry.vertices.length-1] by 1

      v = geometry.vertices[i]

      r = (v.y / height) + 0.5

      @windMaterial.attributes.windFactor.value[i] = r * r * r

 

  # Create mesh

  mesh = new THREE.Mesh( geometry, @windMaterial )

  mesh.position.set( x, y, z )

  return mesh

以上就是怎样开发优秀的HTML5游戏-迪斯尼《寻找奥兹之路》游戏技术详解(二)的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

解决HTML5对手机页面长按会粘贴复制禁用的方法

如何解决HTML5 虚拟键盘出现挡住输入框的问题

具体解析HTML5文件读取filereader及文件读取模块的封装

使用HTML5 canvas api中的clip()方法裁剪区域图像

HTML5的页面结构需要注意那些方面

HTML5web本地存储实例详细说明

HTML5+nodejs实现websocket即时通讯的示例代码分享

HTML5中5大存储方式汇总

HTML5实现下雪效果的实例代码分享

HTML5 应用程序缓存

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...