ThreeJs/仿vue框架

Posted threejs交流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreeJs/仿vue框架相关的知识,希望对你有一定的参考价值。


Threejs可以理解为是一个web端三维引擎(渲染模型,数据可视化),如果有接触过UnralEngine 4(虚幻四)等游戏引擎的,应该很容易理解在一个三维场景必备的每一个部件(场景,渲染器,网格模型,材质,光源,色相机)。

      基础的知识目前先跳过,请自行到官网、论坛或者查阅相关资料。


因为插件的原因,threejs引入目前不推荐模块化,如果是在vue-cli等框架开发,直接在index.html全局引入。

先看架子:

  初始模板整合比较多的模块。

    物理场景/普通场景;

    检查浏览器兼容性;

    环境光源;

    平行光源;

    阴影控制;

    轨道摄像机;

    gui组件控制;

    xyz坐标轴;

    扩展插件;

    循环渲染函数动态插入;

下面是demo;


 new ThreeJs({ el: this.$refs["ThreeJs"], options: { // width:500, // height:300, cameraLookAt:{x:0, y:0, z:0}, cameraPosition:{x:-25,y:30,z:25}, browserCheck: true, backgroundColor: "#EEEEEE", alpha: true, antialias: true, shadowMapEnabled: false, physics: true }, data() { return {}; }, methods: { // 物理场景测试 physicsTest:function () { // 物理场景 let ground = new Physijs.BoxMesh( new THREE.CubeGeometry(100, 2, 100), new THREE.MeshPhongMaterial({ restitution: 0.5, friction: 0.5 }), 0 // 固定不动 ); this.scene.add(ground);
let ground2 = new Physijs.BoxMesh( new THREE.CubeGeometry(10, 10, 10), new THREE.MeshPhongMaterial({ restitution: 0.5, friction: 0.5 }), 1 // 重力控制 ); ground2.position.set(0, 100, 0); this.scene.add(ground2); }, // 正常场景测试 normalTest:function () { let planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1); let planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff}); let plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.receiveShadow = true; plane.rotation.x = -0.5 * Math.PI; plane.position.x = 15; plane.position.y = 0; plane.position.z = 0; this.scene.add(plane);
let cubeGeometry = new THREE.BoxGeometry(4, 4, 4); let cubeMaterial = new THREE.MeshLambertMaterial({color: 0xff0000}); let cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.castShadow = true; cube.position.x = -4; cube.position.y = 3; cube.position.z = 0; this.scene.add(cube);
let sphereGeometry = new THREE.SphereGeometry(4, 20, 20); let sphereMaterial = new THREE.MeshLambertMaterial({color: 0x7777ff}); let sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.x = 20; sphere.position.y = 0; sphere.position.z = 2; sphere.castShadow = true; this.scene.add(sphere); let step = 0; this.setRenderFun('transform',()=>{ cube.rotation.x += 0.02; cube.rotation.y += 0.02; cube.rotation.z += 0.02; step += 0.03; sphere.position.x = 20 + ( 10 * (Math.cos(step))); sphere.position.y = 2 + ( 10 * Math.abs(Math.sin(step))); }) } }, async mounted() { // this.physicsTest() this.normalTest(); } }) .initStats(this.$refs["Stats"]) .setOrbitControlsCamera() .GuiControl() .ambient({ gui: true, color: "#0c0c0c", name: "ambient" }) .directional({ gui: true, helper: false, color: "#ffffff", Shadow: false, position: { x: -40, y: 60, z: -10 } }) .expandPlugin({ // mmd: MMD }) .script();

  

  1:el :挂载的元素 

  2:options: 

            width/height : 固定canvas宽高,如果不填默认全屏,且随屏幕拉伸改变。

            cameraLookAt : 摄像机朝向

            cameraPosition: 摄像机位置

            browserCheck:  是否检查浏览器兼容

            backgroundColor: 背景颜色

            alpha: 是否透明

            antialias: 是否开启抗锯齿

            shadowMapEnabled: 是否开始全局阴影

            physics: 是否使用全局物理场景

  3:data(){}     类似vue里面的data,存储变量。在methods/mounted可通过this获取

                         scene,camera,render, sceneManage

  4:methods: {}   类似vue里面的methods

  5:mounted(){}  类型vue里面mounted 脚本的入口  !!!必须调用this.script();


  内置方法

  【所有方法都会返回this(可以链式调用)】

  this.script();        :  执行脚本必须放在最后 触发mounted()函数

  this.initStats(el)  :显示fps插件 el:挂载元素

  this.setOrbitControlsCamera()  设置成轨道摄像机

  this.GuiControl()  :加载Gui插件

  this.ambient({gui,color,name})  : 加载环境光

                          gui: 是否把控制项显示在gui插件,必须要先执行 this.GuiControl()函数

                          color:环境光颜色

                          name: 这个环境光对象的名称在this.sceneManage 对象写入场景管理器内

 this.directional({gui,color,name,Shadow,position,helper,intensity}) : 加载平行光

                          gui:同上

                          color:同上

                          name:同上

                          Shadow:是否显示阴影

                          position:可以理解为太阳的位置

                          helper :是否启用光源辅助,光源可视化  

                          intensity:光源强度(0-1)

this.expandPlugin({ mmd: class }) 插件拓展,在class类注入camera,scene,render对象

this.setAxes(10) 显示xyz轴辅助

this.setRenderFun(key,fun)  往循环渲染函数动态插入


有不懂或有新的提议可以留言!

下期更新【mmd插件】    下下期更新 gpu粒子转移系统



                            

以上是关于ThreeJs/仿vue框架的主要内容,如果未能解决你的问题,请参考以下文章

混合开发框架混合开发入门 Vue结合Android/iOS,开发仿‮东京‬项目App

Electron-Vite2-MacUI桌面管理框架|electron13+vue3.x仿mac桌面UI

THREE.JS学习使用THREEJS加载GeoJSON地图数据

实战:用 threejs 创建一个地球

Vue2+ThreeJS工程无痛搭建指南

Vue2+ThreeJS工程无痛搭建指南