日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

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

發(fā)布時間:2023/12/14 vue 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue实现图形化积木式编程(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Babylon.js基礎(chǔ)場景搭建

  • 路由
  • 前言
  • 最終實現(xiàn)效果
  • 本文實現(xiàn)效果
  • 技術(shù)選型
    • 1.前端
    • 2.后端
  • 完整代碼
  • 代碼分解
    • 0.npm安裝相關(guān)依賴
    • 1.引入模塊
    • 2.場景初始化
    • 3.ArcRotateCamera 相機初始化
    • 4.燈光初始化
    • 5.地面初始化
      • 5-1. 綠地
      • 5-2.網(wǎng)格地面
    • 6.正方體物體初始化
    • 7.天空盒初始化
  • 后續(xù)計劃
    • Babylon.js
    • Blockly
  • 開源項目GitHub鏈接
  • 資源下載鏈接
  • 你的點贊是我繼續(xù)編寫的動力

路由

  • 下一篇內(nèi)容:Vue實現(xiàn)圖形化積木式編程(二) ---- Babylon.js加載模型到場景中

前言

前段時間想要做一個web端的圖形化積木式編程(類似少兒編程)的案例,網(wǎng)上沖浪了一圈又一圈,終于技術(shù)選型好,然后代碼一頓敲,終于出來了一個雛形。

TIPS:該案例設(shè)計主要參考iRobot Coding,只用做學(xué)習(xí)用途,侵刪。

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

最終實現(xiàn)效果

本文實現(xiàn)效果

  • 可移動相機視角查看3d模型

技術(shù)選型

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);//注冊一個渲染循環(huán)來重復(fù)渲染場景engine.runRenderLoop(function () {scene.render();});//瀏覽器窗口變化時監(jiān)聽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軸旋轉(zhuǎn)角度差不多45度俯瞰camera.lowerRadiusLimit = 50;//最小縮小比例camera.upperRadiusLimit = 1500;//最大放大比例//變焦速度camera.wheelPrecision = 1; //電腦滾輪速度 越小靈敏度越高camera.pinchPrecision = 20; //手機放大縮小速度 越小靈敏度越高scene.activeCamera.panningSensibility = 100;//右鍵平移靈敏度// 將相機和畫布關(guān)聯(lián)camera.attachControl(canvas, true);//燈光初始化var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 10, 0), scene);//設(shè)置高光顏色light.specular = new BABYLON.Color3(0, 0, 0);//設(shè)置燈光強度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()//網(wǎng)格地板初始化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; // 可看到背面//大網(wǎng)格間距groundMaterial.majorUnitFrequency = 16;//小網(wǎng)格間距groundMaterial.minorUnitVisibility = 0;const gridOffset = 8; // 網(wǎng)格偏移量groundMaterial.gridOffset = new BABYLON.Vector3(gridOffset, 0, gridOffset);groundMaterial.freeze(); // 凍結(jié)材質(zhì),優(yōu)化渲染速度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;//網(wǎng)格狀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安裝相關(guān)依賴

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"//材質(zhì)庫,有些材質(zhì)像是SkyMaterial,babylonjs庫的默認材質(zhì)中是沒有這個對象的 }

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); //注冊一個渲染循環(huán)來重復(fù)渲染場景 engine.runRenderLoop(function () {scene.render(); }); //瀏覽器窗口變化時監(jiān)聽 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軸旋轉(zhuǎn)角度差不多45度俯瞰 camera.lowerRadiusLimit = 50;//最小縮小比例 camera.upperRadiusLimit = 1500;//最大放大比例 //變焦速度 camera.wheelPrecision = 1; //電腦滾輪速度 越小靈敏度越高 camera.pinchPrecision = 20; //手機放大縮小速度 越小靈敏度越高 scene.activeCamera.panningSensibility = 100;//右鍵平移靈敏度 // 將相機和畫布關(guān)聯(lián) camera.attachControl(canvas, true);

4.燈光初始化

//設(shè)置半球光 var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 10, 0), scene); //設(shè)置高光顏色 light.specular = new BABYLON.Color3(0, 0, 0); //設(shè)置燈光強度 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.網(wǎng)格地面

//地板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.//大網(wǎng)格間距groundMaterial.majorUnitFrequency = 16;//小網(wǎng)格間距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:很多同學(xué)會發(fā)現(xiàn),將兩個平面疊加時,移動相機視角,會出現(xiàn)蟲影現(xiàn)象

  • 優(yōu)化方案
//1、凍結(jié)材質(zhì)和模型 //綠地 //設(shè)置為靜態(tài)網(wǎng)格,freezeWorldMatrix之后,改變postion、rotation是無效的 plane.freezeWorldMatrix() //將材質(zhì)凍結(jié) plane.material.freeze() //網(wǎng)格 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;//網(wǎng)格狀 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;

后續(xù)計劃

Babylon.js

  • 加載網(wǎng)絡(luò)模型
  • 點擊移動物體
  • 自定義啟動界面
  • 初始化攝像機動畫
  • 物體重力效果
  • babylonjs-gui 按鈕實現(xiàn)
  • babylonjs+ammojs 碰撞體實現(xiàn)
  • 將3d界面放入可拖動窗口中

Blockly

  • 入門使用blockly
  • 自定義block塊
  • blockly第三方組件使用
  • 接入js-interpreter,步驟運行block塊
  • …(想到啥寫啥)

開源項目GitHub鏈接

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

資源下載鏈接

  • Vue前端源碼
  • ThinkJS后端源碼

你的點贊是我繼續(xù)編寫的動力

總結(jié)

以上是生活随笔為你收集整理的Vue实现图形化积木式编程(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。