three js 做小地圖

image.png

做個(gè)最簡單的mini map腮敌,這就是游戲中常用的小地圖膜钓,

研究了一圈桃煎,原來發(fā)現(xiàn)居然還有幾個(gè)小坑零蓉,這里分享一下笤受,希望對碰到這個(gè)問題的朋友有幫助

image.png

最初在試用的時(shí)候一切正常

我們先引入three js和相關(guān)lib,然后創(chuàng)建一個(gè)dom

<div id="ThreeJS" style="position: absolute; left:0px; top:0px"></div>

然后是js代碼

// MAIN

//全局變量
  var container, scene, renderer, controls, stats;
  var clock = new THREE.Clock();

  var MovingCube;
  var perspectiveCamera;

  var mapCamera, mapWidth = 240, mapHeight = 160; // w/h should match div dimensions

  var shape2

  init();
  animate();





  // FUNCTIONS
  function init() {
  
    scene = new THREE.Scene();
 
    var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
    var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;

    // orthographic 相機(jī)
    mapCamera = new THREE.OrthographicCamera(
      window.innerWidth / -2,       // Left
      window.innerWidth / 2,        // Right
      window.innerHeight / 2,       // Top
      window.innerHeight / -2,  // Bottom
      -5000,                        // Near
      10000 );                      // Far
    mapCamera.up = new THREE.Vector3(0,0,-1);
    mapCamera.lookAt( new THREE.Vector3(0,-1,0) );
    scene.add(mapCamera);

    // perspective 相機(jī)
    perspectiveCamera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);
    perspectiveCamera.position.set(0,200,550);
    perspectiveCamera.lookAt(scene.position);
    scene.add(perspectiveCamera);



      renderer = new THREE.WebGLRenderer( {antialias:true} );
    renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    container = document.getElementById( 'ThreeJS' );
    container.appendChild( renderer.domElement );


    controls = new THREE.OrbitControls(perspectiveCamera, renderer.domElement);
    controls.enableKeys = false;
    controls.enableKeys = false;


    // fps顯示stats
    stats = new Stats();
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.bottom = '0px';
    stats.domElement.style.zIndex = 100;
    container.appendChild( stats.domElement );
    // 燈光
    var light = new THREE.PointLight(0xffffff);
    light.position.set(0,250,0);
    scene.add(light);
    var ambientlight = new THREE.AmbientLight(0x111111);
    scene.add( ambientlight );

    // 地板
    var floorMaterial = new THREE.MeshBasicMaterial( { color: 0x999999, side: THREE.DoubleSide } );
    var floorGeometry = new THREE.PlaneGeometry(2000, 2000, 10, 10);
    var floor = new THREE.Mesh(floorGeometry, floorMaterial);
    floor.position.y = -0.5;
    floor.rotation.x = Math.PI / 2;
    scene.add(floor);




    // 創(chuàng)建6面顏色
    var materialArray = [];
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0xff0000 }));
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0xffee00 }));
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0xffeeff }));
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0x00eeff }));
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0x0000ff }));
    materialArray.push(new THREE.MeshBasicMaterial( { color: 0xff00ff }));

    
    var MovingCubeGeom = new THREE.CubeGeometry( 50, 50, 50, 1, 1, 1, materialArray );
    MovingCube = new THREE.Mesh( MovingCubeGeom, materialArray );
    MovingCube.position.set(0, 25.1, 0);
    scene.add( MovingCube );

  



    // 創(chuàng)建幾個(gè)場景上的物體
    var colorMaterial = new THREE.MeshLambertMaterial( { color: 0xff3333 } );
    var shape = new THREE.Mesh( new THREE.TorusKnotGeometry( 30, 6, 160, 10, 2, 5 ), colorMaterial );
    shape.position.set(-200, 50, -200);
    scene.add( shape );
    // torus knot
    var colorMaterial = new THREE.MeshLambertMaterial( { color: 0x33ff33 } );
    var shape = new THREE.Mesh( new THREE.TorusKnotGeometry( 30, 6, 160, 10, 3, 2 ), colorMaterial );
    shape.position.set(200, 50, -200);
    scene.add( shape );
    // torus knot
    var colorMaterial = new THREE.MeshLambertMaterial( { color: 0xffff33 } );
    var shape = new THREE.Mesh( new THREE.TorusKnotGeometry( 30, 6, 160, 10, 4, 3 ), colorMaterial );
    shape.position.set(200, 50, 200);
    scene.add( shape );
    // torus knot 這個(gè)讓它動(dòng)起來壁公,所以放到外面
    var colorMaterial = new THREE.MeshLambertMaterial( { color: 0x3333ff } );
     shape2 = new THREE.Mesh( new THREE.TorusKnotGeometry( 30, 6, 160, 10, 3, 4 ), colorMaterial );
    shape2.position.set(-200, 50, 200);
    scene.add( shape2 );

    renderer.setSize( window.innerWidth, window.innerHeight );
    renderer.setClearColor( 0x000000, 1 );
    renderer.autoClear = false;

  }

  function animate()
  {
    requestAnimationFrame( animate );
    render();
    update();
  }

  function update()
  {
    stats.update();
    controls.update();
  }

    var w = window.innerWidth, h = window.innerHeight;
  function render()
  {


    renderer.clear();
    if(shape2){
      shape2.rotation.y += 0.01
    }


    renderer.setViewport( 10, h - mapHeight - 10, mapWidth, mapHeight );
    renderer.render( scene, mapCamera );

    renderer.setViewport( 0, 0, w, h );
    renderer.render( scene, perspectiveCamera );

  }

整個(gè)顯示看起來非常不錯(cuò)感论,動(dòng)畫可以實(shí)時(shí)反應(yīng)到小地圖上


image.png

然后試著移植到項(xiàng)目中,怎么都無法顯示紊册,要么顯示地圖比肄,要么顯示主體,就是不正常顯示

找了半天發(fā)現(xiàn)項(xiàng)目中這句

scene.background = new THREE.Color( 0xbfd1e5 );

這個(gè)是讓背景不至于全黑囊陡,結(jié)果卻發(fā)現(xiàn)造成小地圖被覆蓋了
注釋掉這句芳绩,然后小地圖就可以正常顯示了

然后發(fā)現(xiàn)一個(gè)奇怪的問題


image.png

shader的粒子在小地圖上顯示得特別的大

中間嘗試換了一下相機(jī)類型,改成PerspectiveCamera撞反,結(jié)果發(fā)現(xiàn)居然會(huì)被地圖物體遮擋


image.png

這個(gè)最終的解決方法是給OrthographicCamera的position改變一下y的高度妥色,變成

mapCamera.position.y = 100

就可以避免這個(gè)問題,這個(gè)值的大小并不會(huì)改變小地圖中顯示的內(nèi)容遏片,

要修改小地圖中顯示內(nèi)容的多少嘹害,要去改 OrthographicCamera 的 Left撮竿, Right, Top笔呀, Bottom四個(gè)參數(shù)

目前雖然做了不少優(yōu)化


image.png

可最終的結(jié)果draw calls并不理想幢踏,幾乎多了一倍,同時(shí)也渲染了陰影等內(nèi)容许师,按照unity的推薦房蝉,mini map最好還是做成2D的
不知道有沒有對這塊了解的朋友,一起探討下如何優(yōu)化微渠?

謝謝~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搭幻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逞盆,更是在濱河造成了極大的恐慌檀蹋,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件云芦,死亡現(xiàn)場離奇詭異续扔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焕数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門纱昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堡赔,你說我怎么就攤上這事识脆。” “怎么了善已?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵灼捂,是天一觀的道長。 經(jīng)常有香客問我换团,道長悉稠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任艘包,我火速辦了婚禮的猛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘想虎。我一直安慰自己卦尊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布舌厨。 她就那樣靜靜地躺著岂却,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏哩,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天署浩,我揣著相機(jī)與錄音,去河邊找鬼扫尺。 笑死瑰抵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的器联。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婿崭,長吁一口氣:“原來是場噩夢啊……” “哼拨拓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氓栈,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤渣磷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后授瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醋界,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年提完,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了形纺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒欣,死狀恐怖逐样,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打肝,我是刑警寧澤脂新,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站粗梭,受9級特大地震影響争便,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜断医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一滞乙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鉴嗤,春花似錦酷宵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荣挨,卻和暖如春男韧,著一層夾襖步出監(jiān)牢的瞬間朴摊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工此虑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甚纲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓朦前,卻偏偏與公主長得像介杆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子韭寸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于修昔底德本人的記載少有信史春哨,關(guān)于他的生平,只能到他本人的著作中去尋找恩伺。 從《伯羅奔尼撒戰(zhàn)爭史》中的記載可以推測...
    鹿韜閱讀 972評論 2 1
  • 昨天跟以前的好友同床共枕晶渠,她還是像從前那樣健談凰荚。而我依然是一個(gè)聽眾,末了褒脯,她說了一句:“你還是跟小時(shí)候一樣便瑟,什么都...
    明兮兮閱讀 496評論 0 0
  • 都說 再好 也只不過是獨(dú)行者的執(zhí)念和向往 可我 還是把夢留在了雪域 我想去看從布達(dá)拉宮升起的太陽 那些孩子們天籟般...
    默子江閱讀 374評論 0 0