WEBGL學習筆記(四):three.js的結構


 

游戲已經做好,但是博客園不能支持哈,我在我的獨立博客里面加入了這個游戲。

 

 

 

加載時候會黑屏,等待數秒即可,點擊這里體驗試玩:FlappyBird3d游戲試玩

 

 

 

我們知道three.js有幾大件,掌握好這幾個類,那么就算入門了!

場景scene,攝像機camera,渲染器render。光源light、控制control、加載器loader

 

three.js的寫法由一個套路,基本上是

1.新建場景*

2.攝像機*

3.新建object3d,光源等(添加到場景)

4.新建渲染器並渲染*three.js-master\examples\js\renderers)

5.添加控制(three.js-master\examples\js\controls)

6.游戲循環和動畫

 

上面帶*的都是必須的,比較基礎這里不說了。下面說兩個3和5

 

下面說一下loader,我管他叫加載器,其實我覺得它實際干的是格式轉換的活。

 

因為three.js本身很難做出復雜的模型,因此復雜的人物模型都依靠加載js格式的3d模型,比如

 

                var loader = new THREE.JSONLoader();
                loader.load( "models/skinned/knight.js", function ( geometry, materials ) {
                    createScene( geometry, materials, 0, FLOOR, -300, 60 )
                    // GUI
                    initGUI();
                } );

 

 

 

但是很多3d模型都不是js格式的,所以three.js提供了很多loader,說白了就是轉換工具,把其他3d模型轉換為js格式。目前支持的格式在我看來非常的多,3mf,obj,amf,awd....

在目錄three.js-master\examples\js\loaders里面非常多,同時可以在example里面看到很多示例,很好上手。以obj模型為例,加載obj模型的語法大概是這樣的

 

var loader = new THREE.OBJLoader( manager );
                loader.load( 'obj/male02/male02.obj', function ( object ) {

                    object.traverse( function ( child ) {

                        if ( child instanceof THREE.Mesh ) {

                            child.material.map = texture;

                        }

                    } );

 

 

 

這些代碼在example里面都有,這里不詳細展開了。依我看來,想要做出比較精細的模型,loader的使用是必不可少的,我認為他很重要。

 

還有一個我認為也十分重要的是control,如果你打開示例,你會發現很多例子都支持拖拽,鼠標移動視角,縮放或者旋轉等等。這些東西如果都用js單獨定義lisenter去實現顯得太麻煩了。

現在controls類來了,你只需要把control引用,然后添加到dom里面就可以了,非常方便。都有哪些control呢?你可以打開(three.js-master\examples\js\controls)很多。

 

就我個人而言,也是一個初學者,我接觸的control主要有兩個,第一個THREE.OrbitControls,這個很容易實現3d的縮放旋轉(鼠標旋轉,滾輪縮放)

它的用法很簡單,如下:

 

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

            controls.addEventListener('change', render);

            //旋轉的中心點
            controls.target.set(0, 0, 0);
            
            controls.update();

        
        function render() {
           
            renderer.render(scene, camera);

        }

 

 

 

通過上面的代碼,看出這是個繞點旋轉的control,比較簡單實用,遺憾的是不支持平移(鼠標右鍵的平移應該是繞點平移)。問題不大,還有很多其他的control,他們是支持平移的,可以參考,這是一種control類型。

 

還有一種,第一人稱視角的control,前一種說白了移動的是物體,第一人稱視角移動的是攝像頭。如果你建立一個世界模型,想做一個類似cs的查看方式,你需要的就是移動攝像頭。我首先找到了這個

firstPersonControls,用起來挺簡單的,和前一個差不多,只不過這個視角移動太low了,和cs游戲里面的差距不是一般的大!有興趣的可以去看看,簡單是簡單,效果不好。

 

然后我找到了PointerLockControls,這個就完全實現了cs游戲的效果了,缺點也是很明顯,貌似只能全屏,就我看到的例子和自己試驗,只能全屏...不過效果真的沒的說!代碼這里不貼了,給個地址吧

https://github.com/mrdoob/three.js/blob/master/examples/misc_controls_pointerlock.html

 

如果你下載了github代碼,打開這個three.js-master/examples/index.html#misc_controls_pointerlock就是了。

 

除了上面介紹的幾種control,還有很多,我也沒一一研究,大家可以根據自己的實際需要來用。對於一些簡單的,完全可以自己寫control,並不難!

 

博客園主頁的webgl,我直接偷懶使用了OrbitControls,沒有自己寫,畢竟自己寫要麻煩些,如果我只想左右旋轉,像這種情況,自己寫的效果要好於使用OrbitControls

 

end~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM