Vue实现图形化积木式编程(一)

article/2025/10/7 12:46:04

Babylon.js基础场景搭建

  • 路由
  • 前言
  • 最终实现效果
  • 本文实现效果
  • 技术选型
    • 1.前端
    • 2.后端
  • 完整代码
  • 代码分解
    • 0.npm安装相关依赖
    • 1.引入模块
    • 2.场景初始化
    • 3.ArcRotateCamera 相机初始化
    • 4.灯光初始化
    • 5.地面初始化
      • 5-1. 绿地
      • 5-2.网格地面
    • 6.正方体物体初始化
    • 7.天空盒初始化
  • 后续计划
    • Babylon.js
    • Blockly
  • 开源项目GitHub链接
  • 资源下载链接
  • 你的点赞是我继续编写的动力

路由

  • 下一篇内容:Vue实现图形化积木式编程(二) ---- Babylon.js加载模型到场景中

前言

前段时间想要做一个web端的图形化积木式编程(类似少儿编程)的案例,网上冲浪了一圈又一圈,终于技术选型好,然后代码一顿敲,终于出来了一个雏形。

TIPS:该案例设计主要参考iRobot Coding,只用做学习用途,侵删。

https://code.irobot.com/#/

最终实现效果

最终实现效果

本文实现效果

  • 可移动相机视角查看3d模型
    可移动相机视角

技术选型

1.前端

  • vuetify - 基于vue的界面框架

  • babylon.js - 3d图形引擎

  • ammo.js - 物理引擎库

  • blockly - 模块化编程工具

2.后端

  • ThinkJS - 基于Node.js的后端框架

完整代码

  • 一个完整的vue文件
<template><div style="height: 100%;width: 100%;"><div><canvas id="renderCanvas"></canvas></div></div>
</template><script>
import * as BABYLON from 'babylonjs';
import * as BABYLON_MATERAIAL from "babylonjs-materials"function loadScene() {//获取到renderCanvas这个元素var canvas = document.getElementById("renderCanvas");//初始化引擎var engine = new BABYLON.Engine(canvas, true);//初始化场景var scene = new BABYLON.Scene(engine);//注册一个渲染循环来重复渲染场景engine.runRenderLoop(function () {scene.render();});//浏览器窗口变化时监听window.addEventListener("resize", function () {engine.resize();});//相机初始化var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 5, new BABYLON.Vector3(0, 0, 10), scene);camera.setPosition(new BABYLON.Vector3(20, 200, 400));//相机角度限制camera.upperBetaLimit = 1.5;//最大z轴旋转角度差不多45度俯瞰camera.lowerRadiusLimit = 50;//最小缩小比例camera.upperRadiusLimit = 1500;//最大放大比例//变焦速度camera.wheelPrecision = 1; //电脑滚轮速度 越小灵敏度越高camera.pinchPrecision = 20; //手机放大缩小速度 越小灵敏度越高scene.activeCamera.panningSensibility = 100;//右键平移灵敏度// 将相机和画布关联camera.attachControl(canvas, true);//灯光初始化var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 10, 0), scene);//设置高光颜色light.specular = new BABYLON.Color3(0, 0, 0);//设置灯光强度light.intensity = 1// 绿地初始化var materialPlane = new BABYLON.StandardMaterial("texturePlane", scene);materialPlane.diffuseColor = new BABYLON.Color3(152 / 255.0, 209 / 255.0, 115 / 255.0)materialPlane.backFaceCulling = false;materialPlane.freeze()var plane = BABYLON.MeshBuilder.CreateDisc("ground", {radius: 3000}, scene);plane.rotation.x = Math.PI / 2;plane.material = materialPlane;plane.position.y = -0.1;plane.freezeWorldMatrix()//网格地板初始化const groundSide = 144;var ground = BABYLON.Mesh.CreateGround("ground", groundSide, groundSide, 1, scene, true);var groundMaterial = new BABYLON_MATERAIAL.GridMaterial("grid", scene);groundMaterial.mainColor = BABYLON.Color3.White();//底板颜色groundMaterial.alpha = 1;//透明度const gridLineGray = 0.95;groundMaterial.lineColor = new BABYLON.Color3(gridLineGray, gridLineGray, gridLineGray);groundMaterial.backFaceCulling = true; // 可看到背面//大网格间距groundMaterial.majorUnitFrequency = 16;//小网格间距groundMaterial.minorUnitVisibility = 0;const gridOffset = 8; // 网格偏移量groundMaterial.gridOffset = new BABYLON.Vector3(gridOffset, 0, gridOffset);groundMaterial.freeze(); // 冻结材质,优化渲染速度ground.material = groundMaterialground.freezeWorldMatrix()//正方形物体初始化var blueBox = BABYLON.Mesh.CreateBox("blue", 10, scene);var blueMat = new BABYLON.StandardMaterial("ground", scene);blueMat.diffuseColor = new BABYLON.Color3(0.4, 0.4, 0.4);blueMat.specularColor = new BABYLON.Color3(0.4, 0.4, 0.4);blueMat.emissiveColor = BABYLON.Color3.Blue();// blueMat.wireframe = true;//网格状blueBox.material = blueMat;//起始位置坐标blueBox.position.x = 0;blueBox.position.y = 5;blueBox.position.z = 0;//天空盒初始化var skyMaterial = new BABYLON_MATERAIAL.SkyMaterial("skyMaterial", scene);skyMaterial.inclination = 0skyMaterial.backFaceCulling = false;var skybox = BABYLON.Mesh.CreateBox("skyBox", 5000.0, scene);skybox.material = skyMaterial;
}export default {name: "test",data() {return {}},mounted() {//加载场景loadScene()},
}
</script><style scoped>
#renderCanvas {width: 680px;height: 680px;touch-action: none;z-index: 10000;border-radius: 10px;
}
</style>

代码分解

0.npm安装相关依赖

npm install babylonjs babylonjs-gui babylonjs-loaders babylonjs-materials --save
  • 安装的模块在package.json中生成
"dependencies": {{"babylonjs": "^4.2.0",//babylon核心库"babylonjs-gui": "^4.2.0",//UI界面库(按钮等)"babylonjs-loaders": "^4.2.0",//开机加载库(修改启动动画的)"babylonjs-materials": "^4.2.0"//材质库,有些材质像是SkyMaterial,babylonjs库的默认材质中是没有这个对象的
}

1.引入模块

import * as BABYLON from 'babylonjs';
import * as BABYLON_MATERAIAL from "babylonjs-materials"

2.场景初始化

  • template中
<div><canvas id="renderCanvas"></canvas>
</div>
  • css中
#renderCanvas {width: 680px;height: 680px;touch-action: none;z-index: 10000;border-radius: 10px;
}
  • js中
//获取到renderCanvas这个元素
var canvas = document.getElementById("renderCanvas");
//初始化引擎
var engine = new BABYLON.Engine(canvas, true);
//初始化场景
var scene = new BABYLON.Scene(engine);
//注册一个渲染循环来重复渲染场景
engine.runRenderLoop(function () {scene.render();
});
//浏览器窗口变化时监听
window.addEventListener("resize", function () {engine.resize();
});

3.ArcRotateCamera 相机初始化

var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 5, new BABYLON.Vector3(0,0,10), scene);
camera.setPosition(new BABYLON.Vector3(20, 200, 400));
//相机角度限制camera.upperBetaLimit = 1.5;//最大z轴旋转角度差不多45度俯瞰
camera.lowerRadiusLimit = 50;//最小缩小比例
camera.upperRadiusLimit = 1500;//最大放大比例
//变焦速度
camera.wheelPrecision = 1; //电脑滚轮速度 越小灵敏度越高
camera.pinchPrecision = 20; //手机放大缩小速度 越小灵敏度越高
scene.activeCamera.panningSensibility = 100;//右键平移灵敏度
// 将相机和画布关联
camera.attachControl(canvas, true);

4.灯光初始化

//设置半球光
var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 10, 0), scene);
//设置高光颜色
light.specular = new BABYLON.Color3(0, 0, 0);
//设置灯光强度
light.intensity = 1

5.地面初始化

5-1. 绿地

// 添加地面
var materialPlane = new BABYLON.StandardMaterial("texturePlane", scene);
materialPlane.diffuseColor = new BABYLON.Color3(152 / 255.0, 209 / 255.0, 115 / 255.0)
materialPlane.backFaceCulling = false;//Allways show the front and the back of an element
materialPlane.freeze()
var plane = BABYLON.MeshBuilder.CreateDisc("ground", {radius: 6000}, scene);
plane.rotation.x = Math.PI / 2;
plane.material = materialPlane;
plane.position.y = -0.01;
plane.freezeWorldMatrix()

5-2.网格地面

//地板const groundSide = 144;var ground = BABYLON.Mesh.CreateGround("ground", groundSide, groundSide, 1, scene, true);var groundMaterial = new BABYLON_MATERAIAL.GridMaterial("grid", scene);groundMaterial.freeze(); // Optimization.groundMaterial.mainColor = BABYLON.Color3.White();//底板颜色groundMaterial.alpha = 1;//透明度const gridLineGray = 0.95;groundMaterial.lineColor = new BABYLON.Color3(gridLineGray, gridLineGray, gridLineGray);groundMaterial.backFaceCulling = true; // Change this if the back of the pad needs to be visible.//大网格间距groundMaterial.majorUnitFrequency = 16;//小网格间距groundMaterial.minorUnitVisibility = 0;const gridOffset = 0; // This makes the grid cells to be aligned with the pad's borders.groundMaterial.gridOffset = new BABYLON.Vector3(gridOffset, 0, gridOffset);ground.material = groundMaterialground.freezeWorldMatrix()
  • TIPS:很多同学会发现,将两个平面叠加时,移动相机视角,会出现虫影现象

两平面叠加虫影

  • 优化方案
//1、冻结材质和模型
//绿地
//设置为静态网格,freezeWorldMatrix之后,改变postion、rotation是无效的
plane.freezeWorldMatrix()
//将材质冻结
plane.material.freeze()
//网格
ground.freezeWorldMatrix()
ground.material.freeze()
//2、增大两个物体的y轴间距
plane.position.y = -0.1

6.正方体物体初始化

 //添加物体
var blueBox = BABYLON.Mesh.CreateBox("blue", 10, scene);
var blueMat = new BABYLON.StandardMaterial("ground", scene);
blueMat.diffuseColor = new BABYLON.Color3(0.4, 0.4, 0.4);
blueMat.specularColor = new BABYLON.Color3(0.4, 0.4, 0.4);
blueMat.emissiveColor = BABYLON.Color3.Blue();
// blueMat.wireframe = true;//网格状
blueBox.material = blueMat;
//起始位置坐标
blueBox.position.x = 0;
blueBox.position.y = 5;
blueBox.position.z = 0;

7.天空盒初始化

//天空盒初始化
var skyMaterial = new BABYLON_MATERAIAL.SkyMaterial("skyMaterial", scene);
skyMaterial.inclination = 0
skyMaterial.backFaceCulling = false;
var skybox = BABYLON.Mesh.CreateBox("skyBox", 5000.0, scene);
skybox.material = skyMaterial;

后续计划

Babylon.js

  • 加载网络模型
  • 点击移动物体
  • 自定义启动界面
  • 初始化摄像机动画
  • 物体重力效果
  • babylonjs-gui 按钮实现
  • babylonjs+ammojs 碰撞体实现
  • 将3d界面放入可拖动窗口中

Blockly

  • 入门使用blockly
  • 自定义block块
  • blockly第三方组件使用
  • 接入js-interpreter,步骤运行block块
  • …(想到啥写啥)

开源项目GitHub链接

https://github.com/Wenbile/Child-Programming-Web

资源下载链接

  • Vue前端源码
  • ThinkJS后端源码

你的点赞是我继续编写的动力


http://chatgpt.dhexx.cn/article/1ew0HU2p.shtml

相关文章

Vue实现图形化积木式编程(十二)

执行Blockly生成代码 路由下一篇历史回顾Babylon.js部分Blockly部分 前言最终实现效果本文内容实现思路问题分析问题原因不优雅解决优雅解决 完整代码 后续计划开源项目GitHub链接资源下载链接你的点赞是我继续编写的动力 路由 下一篇 Vue实现图形化积木式编程(十三) ---- 步…

Vue实现图形化积木式编程(二)

Babylon.js加载模型到场景中 路由下一篇历史回顾 前言最终实现效果本文实现效果完整代码操作分解&#xff08;Babylon.js模型格式转换与导入&#xff09;0.在开源模型网上下载一个模型/自己制作一个1.转换为.babylon文件2.将模型文件放在服务器上方案一&#xff08;最新发现的方…

python积木式编程_TurnipBit—MicroPython开发板:从积木式编程语言开始学作小小创客...

编程、建模、制做动画和游戏……这些当初咱们默认只有成年人玩得转的事情,如今早已经被无数小孩子给颠覆甚至玩出新境界了。热爱科技和动手的“创客”(Maker)如今在全世界都煊赫一时。今年以来,对青少年的创客教育在中国不管是庙堂仍是大众而言亦是热门话题。编程 从TurnipBi…

c++手机编程软件_积木编程软件手机版下载-积木编程软件下载v1.0.1 安卓版

积木编程软件是可以在线可以学习编程的软件,平台给用户提供了大量的编程学习教程&#xff0c;软件还支持在线编程&#xff0c;学习内容丰富&#xff0c;让用户学习起来不会枯燥乏味&#xff0c;就算你是零基础的小白&#xff0c;也可以体验到编程的乐趣。 积木编程官方简介 积木…

Vue实现图形化积木式编程(十三)

步骤运行代码块高亮 路由历史回顾Babylon.js部分Blockly部分 前言最终实现效果本文内容实现1. 安装依赖2. 简化语法3. 引入js解析器4. 运行代码5. 加入高亮 完整代码本文章的用例代码已经同步到github上&#xff0c;运行程序后访问链接即可查看效果: [http://localhost:3000/#/…

搭积木php编程,Primo Toys,一款可以同时搭积木与编程的玩具

原标题&#xff1a;Primo Toys,一款可以同时搭积木与编程的玩具 时下社会&#xff0c;“编程”一词早已不是成人世界的一个职业&#xff0c;如今&#xff0c;编程能力就像蜗牛日常的读写一样&#xff0c;渗透到孩子生活的方方面面&#xff0c;不论是APP&#xff0c;游戏&#x…

python的积木式编程

edu.codemao.cn https://wood.codemao.cn/ https://static.codemao.cn/wood_docs/web/code/Control.html 编程猫和scratch大同小异&#xff0c;和其他Python平台相比较&#xff1a; 优势&#xff1a; 支持硬件编程丰富的Python库积木/代码一键转换搭积木 学编程使用方便&a…

c语言的积木编程,c语言入门第3节,掌握它就能随心所欲的编程了,自己造积木...

前面两节介绍了如何快速搭建 C 语言开发学习环境&#xff0c;并且给出并解释了 hello world 的代码。上一节介绍了C语言的函数&#xff0c;应该注意到&#xff0c;到目前为止&#xff0c;我们使用的函数都是现有的系统函数(例如 printf&#xff0c;sin 等函数)。事实上&#xf…

等边三角形的积木编程

用Scratch里的画笔&#xff0c;可以很方便的画出等边三角形。步骤如下&#xff1a; 1、定义"等边三角形"积木 点击Scratch里的"自制积木" --》制作新的积木 --》直线 --》添加4个参数&#xff0c;如图(1)、(2)所示&#xff1a; 图(1) 定义"等边三角…

积木编程软件

当然这种观点是很荒谬的&#xff0c;不会编程不等于文盲。虽然大多数父母都有文化和读写能力&#xff0c;但是大多数父母都不是程序员&#xff0c;也不知道程序员需要什么样的技能。格物斯坦认为&#xff1a;针对孩子们的编程书籍给出的都是一些问题的“标准”答案。如果你的孩…

金字塔的积木编程

金字塔是一个上尖下方的四面体&#xff0c;它的截面是一个三角形&#xff0c;可以用长方形的砖块去堆叠成一个大的三角形来表示金字塔。     下面介绍使用Scratch来画金字塔。 1、定义"砖块"积木 图(1) 定义"砖块"积木 图(2) "砖块"积木代码 …

OpenBlock Desktop v2.3.1积木编程

最新版 2.3.1 Release OpenBlock Desktop v2.3.1 openblockcc/openblock-desktop GitHubhttps://github.com/openblockcc/openblock-desktop/releases/tag/v2.3.1 新功能 用户可以在串口终端中使用回车键发送数据。提高 esp32/8266 的默认上传波特率以提高上传速度。删除 es…

python积木编程软件_积木编程软件手机版下载

积木编程软件是可以在线可以学习编程的软件,平台给用户提供了大量的编程学习教程&#xff0c;软件还支持在线编程&#xff0c;学习内容丰富&#xff0c;让用户学习起来不会枯燥乏味&#xff0c;就算你是零基础的小白&#xff0c;也可以体验到编程的乐趣。 积木编程官方简介 积木…

零代码积木编程案例分享

和大家分享一个通过积木编程技术实现的复杂业务系统的案例&#xff0c;主要比较传统有代码和零代码积木编程在项目各个阶段的人力投入和成本比较。 客户是一家工业丝线工厂&#xff0c;期望实现生产、仓库、设备的管理&#xff0c;同时连线近百台设备&#xff0c;还要集成AGV、…

时钟的积木编程

家里壁挂的时钟滴答滴答响着&#xff0c;里面有时针、分钟和秒针。在时钟刻度盘里&#xff0c;秒针每60秒走完一周&#xff0c;即秒针的最小角度为360/60 6&#xff1b;分针每60分钟走完一周&#xff0c;即分针的最小角度为360/60 6&#xff1b;时针每12小时&#xff0c;走完一…

长方形的积木编程

用Scratch画长方形有多种方法&#xff0c;可以用一个“点长宽”来画&#xff0c;也可以使用"长方形的2个对角顶点来画"&#xff0c;还可以使用"长翻转90宽翻转90来画"。 1、"点长宽"方式 1.1 定义"直线"积木 点击Scratch左侧的&quo…

Netsparker介绍

Netsparker是一款综合型的web应用安全漏洞扫描工具&#xff0c;它分为专业版和免费版&#xff0c;免费版的功能也比较强大。Netsparker与其他综合性的web应用安全扫描工具相比的一个特点是它能够更好的检测SQL Injection和 Cross-site Scripting类型的安全漏洞。‍‍ 转载于:ht…

使用Netsparker扫描及**某站点

1.1使用Netsparker扫描及某站点 目前市面上漏洞扫描软件有多款,前面介绍了一些扫描软件例如awvs对目标站点进行扫描,其实国外还有一款扫描软件Netsparker也挺厉害,扫描误报率低,扫描效果还不错。在本文中,对一个目标站点进行扫描,并未发现高危漏洞,但通过列目录漏洞…

开源的网络监控工具:Sniffnet,简单而有趣!

在当今数字化的世界中&#xff0c;网络监控工具对于管理和保护网络的安全至关重要。网络管理员和安全专业人员需要一种高效且易于使用的工具&#xff0c;以监视和分析网络流量&#xff0c;识别潜在的安全威胁和性能问题。Sniffnet 是一个开源的网络监控工具&#xff0c;它提供了…

Netspark自动批量扫描powershell脚本

脚本需要创建2个文件&#xff0c;1个文件夹&#xff0c;都放到Netsparker目录下&#xff0c;将脚本中涉及到netspark目录的修改成自己的目录。 注意&#xff1a;Netsparker目录不能含有中文名。 文件1&#xff1a;脚本文件&#xff0c;文件名auto.ps1&#xff0c;内容如下&am…