所有分类
  • 所有分类
  • 后端开发
科技进步,游戏中真风来袭

科技进步,游戏中真风来袭

(接上文)桌面游戏通常创建于一个核心的物理引擎。因此,在这个游戏中我们必须找到一种方式来创建风的效果。现在,让我们通过Three.js在简单的3D场景创建一个风的效果。下面是如何在Thress.js中用CoffeeScript创建这个简单的

想不想玩会动的桌子?不过这种物理现象可不咋容易出现。别急,慢慢研究,科技正不断发展。要不来试下,微风轻轻吹过的感觉怎么样?接下来我给大家简单讲讲,怎么在游戏中弄出真实的自然风。这个玩法特有趣,设定下风的反应模型与加点风元素后,真实感就更上了一层楼。

为3D模型添加风敏度

想感受真正的风吹感觉吗?很简单,只需要给3D物体加上个叫‘风敏感度’的设定,然后给每一个顶点设上‘风属性’就行了。这样电脑就能准确算出每个点受多少风力影响,控制每个物品摇曳生姿,让画面看起来更加逼真吸引人!

好,一起来感受下”风”的乐趣!我们先做个Perlin噪音图,这样就能知道哪里有风了~还能看到风的强弱用线条表示出来。想更真实地感受到风的话,就试试转动图片,看看风是怎么吹过来的。别忘了设定图像区域不然就像没头苍蝇似的到处乱跑咯。

创建简单的3D风效果

咱们试试用Three.js搞个有暴风雨效果的真3D画,比如《程序草地》里的那种。首先挑张漂亮点的地图,然后把每根草想象成90度翻转的圆锥,大约和地图一样大就好。

科技进步,游戏中真风来袭

想要用 Three.js 做个三维游戏?先搜他了解一下!接着我们要链接好摄像头鼠标这些设备。让照明更丰富是个好主意!接下来,用上 initGrass和initTerrain这俩方法,种植一片绿油油的草地和山丘。比如 initGrass,设置 15×15棵草,随机给每棵草加些点缀,不是超有意思嘛!

搞定那些小草后,别忘了加点风感,因为底端的草地防风效果好些,顶上的部位更易被吹斜。有了这”风”功能,每个小草都能根据所在高度,摆出各种酷炫外形


优化并扩展

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()

记住,除了基本的设置和动画,我们还能让这个小景观变得更加花哨!比如说加上染色特效(就是shader啊),这样视觉效果就会非常好啦;另外,你还可以试着加入一些互动环节,让大家都来摸摸碰碰小景观;如果还是觉得不够爽快的话,那就再试试加一些音效或者粒子系统之类的东西,保证你们玩的开心到飞起!

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

玩游戏最重要的就是性能得好,还能适配各种设备!合理运用资源,抓紧时间,按设备适当调设,这样游戏就会跑得飞快,让大家玩得过瘾~

你知道,做个3D游戏可不简单,得多琢磨琢磨。学好物理引擎和图形技术,再懂点儿编程,游戏就会真实又好看,玩着老带劲了!


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 )

原文链接:https://www.icz.com/technicalinformation/web/2024/04/14175.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?