布加迪奇龙Blender雕刻、shading,并导入Three.js ,3DWEB模型【Three.js+Blender建模+web前端+可视化】
本文主要探索blender建模、渲染、导入到three.js,并在页面呈现、交互,为下步深入应用积累经验,呈现web3D效果
第一部分:3D 建模,Shading
官网:blender版本2.83
blender 分两个部分:建模,也就是常说的雕刻;然后是shading也就是贴图渲染。
对blender,threejs不熟悉的可先自行百度,bilibili上有很多油管上的blender优秀的教程,可以自己去对着教程操练一下,有梯子可以去油管官网上去找适合自己的教程(不建议从0开始,直接对着别人的教程操练,会很快),找个合适视屏的一起操练就行,我就是这么过来的。这个算是成品,雕刻,渲染的时候没有截图,主要是练习blender 的曲面,材质,镜像及各种快捷键使用。汽车在周围的环境是新建圆球,放大后把汽车移动到圆内,并给圆shading一个全景图像,
先上图:
建模完成后导出glb格式:
第二部分:在three.js页面中引入:
主要依赖:
1,threejs版本V96,
2,FirstPersonControls第一人称视角控制
3,OrbitControls轨道控制器
4,gltf导入依赖GLTFLoader_src.js,glb或者gltf文件引入到threejs
1,页面依赖:
<script src="https://cdn.bootcss.com/jquery/2.0.0/jquery.min.js"></script>
<script src="./libs/three-V96.js"></script>
<script type="text/javascript" src="./assets/models/gltf-wlii/FirstPersonControls.js"></script>
<script type="text/javascript" src="./assets/models/gltf-wlii/physi.js"></script>
<!-- <script src="./libs/threeBSP.js"></script> -->
<script src="./libs/OrbitControls.js"></script>
<script src="./libs/dat.gui.min.js"></script>
<script src="./libs/stats.min.js"></script>
<script src="./libs/GLTFLoader_src.js"></script>
2,threejs引入Glb模型核心代码:
function gltfLoader(){var groupFloor1 = new THREE.Group(),groupFloor1Arr;var groupFloor2 = new THREE.Group();var groupFloor3 = new THREE.Group();var groupFloor4 = new THREE.Group();var stairs = new THREE.Group();var baseGroup = new THREE.Group();let loader = new THREE.GLTFLoader();loader.load('./assets/models/gltf-wlii/bujiadi.glb',function (obj) {var objChildren = obj.scene.children;for(var i=0; i<objChildren.length;i++){var floorName = objChildren[i].name;addGroup(floorName)}function addGroup(floorName){var r1 = /floar1/g;var r2 = /floar2/g;var r3 = /floar3/g;var r4 = /floar4/g;var s = /stairs/g;if(r1.test(floorName) !=false){groupFloor1.children.push(objChildren[i]);}else if(r2.test(floorName) !=false){groupFloor2.children.push(objChildren[i]);}else if(r3.test(floorName) !=false){groupFloor3.children.push(objChildren[i]);}else if(r4.test(floorName) !=false){groupFloor4.children.push(objChildren[i]);}else if(s.test(floorName) !=false){stairs.children.push(objChildren[i]);}else{baseGroup.children.push(objChildren[i]);}}this.scene.add(groupFloor1);this.scene.add(groupFloor2);this.scene.add(groupFloor3);this.scene.add(groupFloor4);this.scene.add(baseGroup);this.scene.add(stairs);console.log(scene)document.getElementById('loading').style.display = 'none';},function (xhr) {console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' ); },function (error) {console.log('load error!'+error.getWebGLErrorMessage());})}
3,页面代码全:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><script src="https://cdn.bootcss.com/jquery/2.0.0/jquery.min.js"></script><script src="./libs/three-V96.js"></script><script type="text/javascript" src="./assets/models/gltf-wlii/FirstPersonControls.js"></script><script type="text/javascript" src="./assets/models/gltf-wlii/physi.js"></script><!-- <script src="./libs/threeBSP.js"></script> --><script src="./libs/OrbitControls.js"></script><script src="./libs/dat.gui.min.js"></script><script src="./libs/stats.min.js"></script><script src="./libs/GLTFLoader_src.js"></script><!-- <script src="./libs/RGBELoader.js"></script><script src="./libs/PMREMGenerator.js"></script> --><style>body {/* set margin to 0 and overflow to hidden, to go fullscreen */margin: 0;overflow: hidden;}#left-bar{ width: 200px; height: 100vh; position: absolute; left: 0; top: 0; z-index: 1; background: rgba(0,0,0,0.1);}</style></head><body><div id="container"></div><script>var stats = initStats();var scene, camera, renderer, controls, light, composer,camControls;var group = new THREE.Group();var clock = new THREE.Clock();// 初始化场景function initScene() {scene = new THREE.Scene();}// 初始化相机function initCamera() {camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 100);camera.position.set(5, 5,5);camera.lookAt(new THREE.Vector3(0, 0, 0));camControls = new THREE.FirstPersonControls(camera);camControls.lookSpeed = 0.1;camControls.movementSpeed = 20;camControls.noFly = true;camControls.lookVertical = true;camControls.constrainVertical = true;camControls.verticalMin = 1.0;camControls.verticalMax = 2.0;camControls.lon = 0;camControls.lat = 0;}// 初始化灯光function initLight() {var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.7 );//模拟远处类似太阳的光源directionalLight.color.setHSL( 0.1, 1, 0.95 );directionalLight.position.set( 0, 200, 0).normalize();scene.add( directionalLight );var ambient = new THREE.AmbientLight( 0xffffff, 1 ); //AmbientLight,影响整个场景的光源ambient.position.set(0,0,0);scene.add( ambient );var light = new THREE.DirectionalLight( 0xdfebff, 1);light.position.set( 50, 200, 100 );light.position.multiplyScalar( 1.3 );light.castShadow = true;light.shadow.mapSize.width = 1024;light.shadow.mapSize.height = 1024;var d = 300;light.shadow.camera.left = - d;light.shadow.camera.right = d;light.shadow.camera.top = d;light.shadow.camera.bottom = - d;light.shadow.camera.far = 1000;scene.add( light );}// 初始化性能插件function initStats() {var stats = new Stats();stats.domElement.style.position = 'absolute';stats.domElement.style.left = '1px';stats.domElement.style.top = '1px';document.body.appendChild(stats.domElement);return stats;}// 初始化渲染器function initRenderer() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setSize(window.innerWidth, window.innerHeight);renderer.setClearColor(0x000000,1.0);document.body.appendChild(renderer.domElement);}// 初始化轨迹球控件function initControls() {controls = new THREE.OrbitControls( camera, renderer.domElement );controls.enableDamping = true;controls.dampingFactor = 0.5;controls.minDistance = 10;controls.maxDistance = 150;controls.maxPolarAngle = Math.PI/2.2;}//GLTF-GLTFLoader_srcfunction gltfLoader(){var groupFloor1 = new THREE.Group(),groupFloor1Arr;var groupFloor2 = new THREE.Group();var groupFloor3 = new THREE.Group();var groupFloor4 = new THREE.Group();var stairs = new THREE.Group();var baseGroup = new THREE.Group();let loader = new THREE.GLTFLoader();loader.load('./assets/models/gltf-wlii/bujiadi.glb',function (obj) {var objChildren = obj.scene.children;for(var i=0; i<objChildren.length;i++){var floorName = objChildren[i].name;addGroup(floorName)}function addGroup(floorName){var r1 = /floar1/g;var r2 = /floar2/g;var r3 = /floar3/g;var r4 = /floar4/g;var s = /stairs/g;if(r1.test(floorName) !=false){groupFloor1.children.push(objChildren[i]);}else if(r2.test(floorName) !=false){groupFloor2.children.push(objChildren[i]);}else if(r3.test(floorName) !=false){groupFloor3.children.push(objChildren[i]);}else if(r4.test(floorName) !=false){groupFloor4.children.push(objChildren[i]);}else if(s.test(floorName) !=false){stairs.children.push(objChildren[i]);}else{baseGroup.children.push(objChildren[i]);}}this.scene.add(groupFloor1);this.scene.add(groupFloor2);this.scene.add(groupFloor3);this.scene.add(groupFloor4);this.scene.add(baseGroup);this.scene.add(stairs);console.log(scene)document.getElementById('loading').style.display = 'none';},function (xhr) {console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' ); },function (error) {console.log('load error!'+error.getWebGLErrorMessage());})}// 更新控件function update() {stats.update();}// 初始化function init() {initScene();initCamera();initRenderer();initLight();initControls();//干扰第一人称视角gltfLoader();console.log(scene)}//声明raycaster和mouse变量var raycaster = new THREE.Raycaster();var mouse = new THREE.Vector2(), INTERSECTED;function onMouseClick( event ) {mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;raycaster.setFromCamera( mouse, camera );//var intersects = raycaster.intersectObjects(child);var intersects = raycaster.intersectObjects( scene.children,true);if ( intersects.length >0){if ( INTERSECTED != intersects[ 0 ].object ) {if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );INTERSECTED = intersects[ 0 ].object;if(INTERSECTED.name != '平面'){INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();INTERSECTED.material.emissive.setHex( 0xff0000 );}}} else {if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );INTERSECTED = null;}}document.addEventListener( 'click', onMouseClick, false );// 窗口变动触发的方法function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {//camControls.update(clock.getDelta());requestAnimationFrame(animate);renderer.render(scene, camera);update();}init();animate();</script></body>
</html>
本文主要是对Three.jsWeb3D+Blender建模渲染+web前端+可视化的事件和应用,为下步深入更深入的交互做经验积累
需要出视频的话,大家给我留言,可以出视频教程分享给大家的。
布加迪奇龙Blender雕刻、shading,并导入Three.js ,3DWEB模型【Three.js+Blender建模+web前端+可视化】相关推荐
- 数据库性能测试---前阿里数据库团队资深DBA杨奇龙
杨奇龙 前阿里数据库团队资深DBA 主要负责淘宝业务线,经历多次11.11,有海量业务访问DB架构设计经验. 目前就职于有赞科技DBA,负责数据库运维工作,熟悉MySQL 性能优化,故障诊断,性能压测 ...
- [Unity][blender]在blender中新建标准两足人形骨骼模型动作导入到Unity中
为了解决 标准两足人形骨骼动作 不够的问题,用于拓展自己想要的 动作. 在blender中新建标准两足人形骨骼模型动作导入到Unity中 主要用于Unity 标准两足人形模型动作 的动作拓展 主要是参 ...
- 奇龙公关解析危机公关为何这般重要?
奇龙公关解析危机公关为何这般重要? 什么是危机公关:危机公关是指应对危机的有关机制.根据公共关系学创始人爱德华·伯尼斯(Edward Bernays)的定义,公共关系是一项管理功能,制定政策及程序来获 ...
- 【品牌营销推广公司】奇龙十三哥分析如何做好品牌推广运营
[品牌营销推广公司]奇龙十三哥分析如何做好品牌推广运营 互联网时代这么多年了,网络已经越来越多的融入人们的生活了,在覆盖程度上绝对不亚于任何一个传统媒体.网络整合营销更强调以目标受众为中心,效果跟传统 ...
- 【品牌推广公司】品牌营销,奇龙十三哥浅谈如何进行有效的口碑传播
[品牌推广公司]品牌营销,奇龙十三哥浅谈如何进行有效的口碑传播 说到营销,很多人都会想到饥饿营销,病毒营销,内容营销.这里要提到口碑营销.其实理论很多,也万变不离其宗.而这个最重要的核心点,就是口碑. ...
- Blender Apps?2023年最值得期待的 9 个 Blender 开发项目抢先看!
2023 年对 Blender 来说将会是很有趣的一年,除了努力保持核心功能稳定和不断迭代之外,几个可能会在今年实现且备受关注的功能开发项目已经开始!赶紧跟着跟着小编一起来看看Blender官方网站发 ...
- 《守望先锋》模型提取之Blender中查看模型(二)
<守望先锋>模型提取之Blender查看模型(二) 插件安装 1.将io_scene_owm.rar文件解压后放入blender工具目录中的addons目录下![在这里插入图片描述](ht ...
- Blender从头到尾创建低多边形角色学习教程 Low Poly Characters – Blender Bitesize Course
从头到尾创建低多边形角色. 你会学到: Blender界面的基础. 基本建模技术. 如何遵循字符引用? 如何创造和塑造自己的角色(不同风格.发型和服装). 纹理字符. 索具和动画介绍(用于你的游戏引擎 ...
- Blender程序性纹理学习教程大师班 Creative Shrimp – Procedural Texturing Blender Master Class
标题:创意虾-程序纹理Blender大师班 信息: 什么是程序纹理? 程序纹理将简单的数学转换为无限的真实感着色器,具有无限的多样性和分辨率. 超越看起来像一团像素特写的图像纹理,运用程序纹理的力量, ...
- 不可能的工作:在FBX模型导入脚本中生成模型的预置体
不可能的工作:在FBX模型导入脚本中生成模型的预置体 #if UNITY_EDITOR using System.Collections; using System.Collections.Gener ...
最新文章
- Android安全加密:非对称加密
- 把Eclipse项目转换成Maven项目
- Unity3D脚本中文系列教程(五)
- linux网络基础设置
- Vmware提示:the operation was canceled by the user
- 990. 等式方程的可满足性
- C 语言基础——程序运行时间的计算
- bzoj 2820: YY的GCD(莫比乌斯反演)
- exchange2013 OWA界面使用公有计算机或私有计算机选项
- Nokia Imaging SDK滤镜使用入门
- Java基础--序列化和反序列化
- 论文笔记_SLAM_Visual SLAM and Structure from Motion in Dynamic Environments A Survey
- 阿里巴巴2021年java研发工程师暑期实习一面及二面面经
- i5 13600KF参数 酷睿i53600KF什么水平i5 13600KF核显相当于什么显卡
- [转]我的FLASH情结2010——浅谈FLASH WEB GAME与创业(下)
- Foxmail 7.2数据迁移,导入旧数据
- ubuntu14.04的自带的拼音输入法问题
- HEXO启动,初始化,本地页面成功启动,(Win 7 64 bit)可以在浏览器打开http://localhost:4000
- 赵长鹏的“Build”,会是柏拉图式元宇宙吗?
- simplify-path