初次使用babylonjs

481 阅读2分钟

访问官网

我是真没想到使用这个库的第一个麻烦,居然是文档访问过慢。 慢到点了之后全然没反应,让人怀疑是不是年久失修。 老办法, 先把文档下载下来,本地运行. 结果下载缓慢,先将就一下官网吧。

先 npm i babylonjs, 这个包名是我直接在npm上搜出来的, 这个包之所以是babylonjs是因为babylon已经被另一个库占用了。

用的是之前搭好的ts环境,所以我又 npm i @types/babylonjs 果然有。有了ts ,代码即文档。 官网的第一个示例,隐去了头尾,那我就只能猜了, 然后通过ts的语法提示,补全。

官网代码 image.png

我的ts代码 image.png

结果 image.png 没有报错 ,但是, 除了默认的背景, 并不见立方体。于是,我点了一下,官网示例代码上面的下载。下载下来完整的代码,除了获取engine是异步的,我还没看到什么区别,后来试着加了连续渲染,就出来了。 最让我奇怪的是 ,居然不用在场景里添加物体, 光源好歹还在初始化的时候就和场景关联了起来。

image.png 这个是官网下载下来的部分源码 ,因为我确实没发现哪里有异步,Engine函数不是异步的,因为提示的返回值不是promise.

最终代码

import {Scene, ArcRotateCamera, HemisphericLight, MeshBuilder , Vector3, Engine} from 'babylonjs'

const { PI, sin, cos , tan, random } = Math

class Cube{ 
    constructor(canvas :HTMLCanvasElement){ 
        const gl = canvas.getContext('webgl2') || canvas.getContext('webgl')
        const engine  =new Engine(gl, ) ;
        const scene = new Scene(engine )
        const camera  =new ArcRotateCamera('c1', -PI/2, PI/2.5 , 3 ,new Vector3(0,1,0),  )
        const light = new HemisphericLight('l1', new Vector3(1,1,1),scene) ;
        const box  =  MeshBuilder.CreateBox('box' , {})
        box.position.y = 1
        camera.attachControl(canvas, true) ;
        this.scene =scene ;
        // scene.addMesh(box) ;
        // scene.addLight(light)
    }
    scene ;

    render(){ 
        this.scene.render()
    }
}


const [ vw, vh] = [window.innerWidth -6, window.innerHeight -6]
// const canvas= document.getElementById('3d') as HTMLCanvasElement ; 都是断言 有点强转类型的意思
const canvas= <HTMLCanvasElement>document.getElementById('3d')  ;
canvas.width =  vw ;
canvas.height = vh ;
const cube  =new Cube(canvas) ;

cube.render() ; //  直接调没反应。要连续渲染才出来,说明,有些东西是异步的
ani()
function ani(){ 
    cube.render()
    requestAnimationFrame(ani)

}

确实不需要把物体放入场景,下次再研究是怎么回事。效果如下, 这个相机轨道控制器默认是有惯性的。 以后就可以看本地的文档了 image.png