前言:在公司主要使用Babylon.js作为前端引擎,我自己在开发中总结到基本上每一个新项目都会需要这些基本设置。


一、ios兼容:解决镜面反射

 

如果不加offline,材质中有镜面反射,苹果手机都会打不开项目

  1. //ios兼容,解决镜面反射
  2. var offline;
  3. if (os.isPhone) {
  4. offline = false
  5. } else {
  6. offline = true
  7. }
  8.  
  9. var demo = {
  10. scene: 'MI8',
  11. binary: true,
  12. offline: offline,

二、提高支持硬件的质量(在查看器中应该是动态的)

  1. var scale = Math.max(1 / (window.devicePixelRatio || 2));
  2. engine.setHardwareScalingLevel(scale);

三、如果模型把材质都赋给了blank材质球,需手动赋材质

在JSON中分出两套材质,实现调试后即时保存

  1. var mats = {};
  2. function initMaterial() {
  3. //分材质
  4. scene.meshes.forEach(function (mesh) {
  5. if (mesh.material && mesh.material.name == "blank") {
  6. var mat1 = new BABYLON.StandardMaterial(mesh.name + 'mat', scene);
  7. var mat2 = new BABYLON.StandardMaterial(mesh.name + 'mat_2', scene);
  8.  
  9. if (!mats[mesh.name]) {
  10. mats[mesh.name] = {}
  11. }
  12. }
  13. if (mesh.material && mesh.material.diffuseTexture) {
  14. var text = mesh.material.diffuseTexture;
  15. mesh.material.opacityTexture = text;
  16. mesh.material.backFaceCulling = false;
  17. }
  18. mesh.isPickable = true;
  19. });
  20.  
  21. // if (os.isPc) {
  22. // openDebug();
  23. // }
  24.  
  25. //initSceneByJSON(json);

遍历获取两套材质一定要在开启调试链接,初始化json后:

  1. for (key in mats) {
  2. mats[key].mat1 = scene.getMaterialByName(key + "mat");
  3. mats[key].mat2 = scene.getMaterialByName(key + "mat_2");
  4. //默认显示的材质
  5. scene.getMeshByName(key).material = scene.getMaterialByName(key + "mat_2");
  6. }

按钮切换分别为:

  1. for (key in mats) {
  2. scene.getMeshByName(key).material = scene.getMaterialByName(key + "mat");
  3. //console.log(scene.getMeshByName(key).material.name)
  4. }
  5. for (key in mats) {
  6. scene.getMeshByName(key).material = scene.getMaterialByName(key + "mat_2");
  7. //console.log(scene.getMeshByName(key).material.name)
  8. }

四、初始化场景、材质等资源

  1. function initHUA(){
  2. function initScene(){
  3. //透明背景
  4. scene.clearColor = new BABYLON.Color4(0, 0, 0, 0);
  5.  
  6. //全部材质可pick
  7. scene.meshes.forEach(function(mesh){
  8. mesh.isPickable = true;
  9. if(mesh.animations.length){
  10. scene.beginAnimation(mesh, 0, 0, false)
  11. }
  12. });
  13.  
  14. //isready = true;
  15. }
  16.  
  17. function initCamera(){
  18. window.camera = new BABYLON.ArcRotateCamera("Camera",0 ,0.8 ,0, new BABYLON.Vector3(0,0,0),scene);
  19.  
  20. //限制范围
  21. camera.lowerBetaLimit = 0.95;
  22. camera.upperBetaLimit = 1.25;
  23. //camera.lowerAlphaLimit = -Math.PI / 6;
  24. //camera.upperAlphaLimit = Math.PI / 6;
  25. camera.lowerRadiusLimit = 45;
  26. camera.upperRadiusLimit = 65;
  27.  
  28. //变焦速度
  29. camera.wheelPrecision = 1;
  30. camera.pinchPrecision = 1;
  31. camera.zoomOnFactor = 50;
  32.  
  33. ////调整参数
  34. camera.radius = 52;
  35. camera.alpha = 0;
  36. camera.beta = 1.25;
  37. camera.targetScreenOffset.y = -10;
  38. camera.inertia = 0.85;
  39. camera.useAutoRotationBehavior = false;
  40.  
  41. scene.activeCamera = camera;
  42. camera.attachControl(canvas,true);
  43. }
  44.  
  45. function initLight(){
  46. var hem = new BABYLON.HemisphericLight("HemiLight", new BABYLON.Vector3(0, 1, 0),scene);
  47. hem.intensity = 0.3;
  48.  
  49. //创建缓冲函数 - Bezier曲线自定义缓冲
  50. //var easingFunction = new BABYLON.BezierCurveEase(.5,.21,.06,.98);
  51. }

五、微信钉钉兼容性问题

  • 微信中Dom元素全部需要放在canvas上面,放在下面会被场景挡住,设置z-index也没用
  • 钉钉中的动画全部需要兼容-webkit前缀,因为钉钉内嵌chrome
  • 注意@keyframes加前缀的形式是:@-webkit-keyframes

六、微信分享

  1. <script type="text/javascript">
  2. try{
  3. wxShareConfig({
  4. shareTitle: "小米8",
  5. shareLink: window.location.href,
  6. shareImgUrl: "https://forreall.cn/3ds/app/MI8/img/logo.png",
  7. shareDesc: "8周年旗舰手机"
  8. });
  9. }catch(e){
  10. }
  11. </script>

七、数据/事件统计

  1. //点击事件统计
  2. try {
  3. Forreall3d.trackEvent('_trackEvent', '小米8', '点
  4. 击', '切换普通版');
  5. } catch (e) {
  6. }

注意:点击事件有效时才统计一次,无效点击不统计

  1. //旋转事件统计
  2. Forreall3d.eventDetect("花儿送给你");

八、数字型loading

  1. <script src="../../js/loading.js"></script>

Fn1要放在demo前:

  1. function fn1(num){
  2. $('.loadwrap-first .heart').html(num);
  3. }

Fn2和loading放在最后:

  1. //loading
  2. function fn2(){
  3. $(".loadwrap-first").fadeOut();
  4. }
  5. loading(scene,fn1,fn2);

版权声明:本文原创,非本人允许不得转载 

【开发总结】—— BABYLON 项目开发必备系列的更多相关文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  3. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  10. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

随机推荐

  1. 我爱学 Python 之文件

    读取文件 假设你已经在某个文件夹下创建了 "test.txt" 文件,且里面有一些内容,那你在当前位置输入 Python3,进入到交互模式,然后执行下面的操作: >>& ...

  2. Leetcode 587.安装栅栏

    安装栅栏 在一个二维的花园中,有一些用 (x, y) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏.你需要找到正好位于栅栏边 ...

  3. 课堂笔记II

  4. myeclipse搭建activemq 简单聊天

    需要一起交流的请加群qq:200634530

  5. web自动化测试:watir+minitest(三)

    本文,谢绝转载. 整体框架设计: 1.用例的解耦性.一个测试用例一个脚本.而并非minitest中的N个test写在一个文件中 2.单独调试与全量连跑或部分连跑 3.任意变量.参数配置.这点对后期维护 ...

  6. ruby 发送邮件

    产品构建.打包.部署完需要发送邮件通知相关人员进行验证.请看过程 #encoding:utf-8 require 'mail' #~ branch = ARGV.to_s.sub('[','').su ...

  7. 洛谷 [P3388] 割点模版

    tarjan 求无向图的割点 割点,即割去此点后原图可变为两个或多个独立的联通块 一个点 x 是割点,当且仅当存在一个x 的子节点 y ,使得 low[y] >= dfn[x] 对于根节点来说, ...

  8. 排名次SQL语句【名次可重复时】

    原文发布时间为:2008-10-26 -- 来源于本人的百度文章 [由搬家工具导入] 功能实现 名次可重复时,比如第一名有两个。。。 select   *,(select   count(distin ...

  9. [LeetCode] Number of 1 Bits 位操作

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...

  10. [论文]A Link-Based Cluster Ensemble Approach for Categorical Data Clustering

    http://www.cnblogs.com/Azhu/p/4137131.html 这篇论文建议先看了上面这一遍,两篇作者是一样的,方法也一样,这一片论文与上面的不同点在于,使用的数据集是目录数据, ...