2012-12-19 93 views
1

我有一個three.js場景,其中有一個大網格作爲我的地圖(從blender導出)。如何讓玩家控制與three.js中的牆壁相撞

我加載它這樣:

// map 
var loader = new THREE.JSONLoader(true); 
var thiz = this; 
loader.load(
    "iceworld.js" 
    , function(geometry, materials) { 
     materials[0].side = THREE.DoubleSide; 
     var faceMaterial = new THREE.MeshLambertMaterial(materials[0]); 
     //var faceMaterial = new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('ice.jpg'), side: THREE.DoubleSide }); 

     mesh = new THREE.Mesh(geometry, faceMaterial); 
     thiz.scene.add(mesh); 
    } 
); 

我用的是PointerLockControls。現在我可以穿過地圖的牆壁,因爲沒有碰撞檢測。

我該如何執行此操作?我沒有在例子和文檔中找到解決方案。

回答

2

Three.js是一個圖形渲染庫,不涉及碰撞檢測。你需要一些不同的東西。這裏有幾個選項:

  • 如果場景主要是平面和矩形,即儘管它的3D,玩家只能在一個二維平面上行走具有簡單形狀的牆壁,你可以創建一個簡單的網格,這標誌着位置的障礙物,然後你檢查你的球員的座標對網格,並取消移動,如果它結束了牆內。
  • 使用物理引擎:Physijs是Three.js的一款易用且靈活的Bullet動態引擎包裝器。你可以將你的場景網格包裹在一個單獨的Physijs.ConcaveMesh中,爲你的相機添加一個碰撞形狀,並且可以即時,準確地進行碰撞檢測 - 但是如果你有一個非常複雜的場景,那會很慢。
  • 更好的方法是將場景分解爲離散對象,例如矩形牆段,併爲它們單獨添加便宜的碰撞形狀(如立方體,球體,圓柱體)。 Physijs可以做到這一點,然後有cannon.jssee FPS demo here)。
  • 滾動您自己的碰撞檢測。我不推薦這麼做,因爲它是一個兔子洞,但它會讓您完全控制哪些功能,準確性和性能取決於您。

就我個人而言,我用Three.js創建了一個FPS遊戲。我的關卡設計非常規則,所以我可以使用網格方法來進行玩家碰撞,但是我也想要動態物體(例如桶,盒子等等),並且使用Physijs允許我將它們整合得很平凡。通過創建Physijs立方體來處理牆壁碰撞。

+0

這聽起來像一個困難的部分。我真的需要包含一個完整的物理引擎嗎? 我想知道是否有可能用「Ray」來檢測世界碰撞。 – appsthatmatter

+1

這確實是一種選擇,儘管我會將其歸類爲「自己滾動」。有很多事情需要考慮,比如射擊和玩家角色尺寸,所以你很可能不會得到完美的結果,只需投射一縷光芒即可。 [這個例子](http://mrdoob.github.com/three.js/examples/misc_controls_pointerlock.html)使用'Ray',但不幸的是僅用於地面碰撞。 – Tapio

+1

以下是關於如何使用光線投射進行碰撞檢測的教程。 http://webmaestro.fr/collisions-detection-three-js-raycasting/ – arpo

相關問題