博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
傻瓜开发——three.js 粒子组成字体
阅读量:6830 次
发布时间:2019-06-26

本文共 3899 字,大约阅读时间需要 12 分钟。

一、不废话,先上图。目标效果:使用亮的点,组成字。(完整代码,请滑到最后)

二、核心思路

①用THREE.Points画点。

②用THREE.TextGeometry加载字体文件(不用渲染),然后获取它的vertices属性获取组成字体的点集。

二、实现。

引入核心代码

//核心js插件//控制器(鼠标键盘交互的控制)//性能监测//动画复制代码

加载场景、相机、光、控制器、性能监测器等3d基础环境

//渲染器    function initRender() {        renderer = new THREE.WebGLRenderer({antialias: true});        renderer.setPixelRatio(window.devicePixelRatio);        renderer.setSize(window.innerWidth, window.innerHeight);        renderer.setClearColor(0xeeeeee);        renderer.shadowMap.enabled = true;        //告诉渲染器需要阴影效果        document.body.appendChild(renderer.domElement);    }    //初始化相机    function initCamera() {        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);        camera.position.set(0, 20, 80 );    }    //初始化场景    function initScene() {        scene = new THREE.Scene();        scene.background = new THREE.Color( 0xa0a0a0 );        scene.fog = new THREE.Fog( 0xa0a0a0, 5, 250 );    }    //初始化性能插件    function initStats() {        stats = new Stats();        document.body.appendChild(stats.dom);    }    //初始换控制器    function initControls() {        controls = new THREE.OrbitControls(camera, renderer.domElement);        //设置控制器的中心点        controls.target.set( 0, 5, 0 );        // 如果使用animate方法时,将此函数删除        //controls.addEventListener( 'change', render );        // 使动画循环使用时阻尼或自转 意思是否有惯性        controls.enableDamping = true;        //动态阻尼系数 就是鼠标拖拽旋转灵敏度        //controls.dampingFactor = 0.25;        //是否可以缩放        controls.enableZoom = true;        //是否自动旋转        controls.autoRotate = false;        controls.autoRotateSpeed = 0.5;        //设置相机距离原点的最远距离        controls.minDistance = 1;        //设置相机距离原点的最远距离        controls.maxDistance = 2000;        //是否开启右键拖拽        controls.enablePan = true;    }    //窗口变动触发的函数    function onWindowResize() {        camera.aspect = window.innerWidth / window.innerHeight;        camera.updateProjectionMatrix();        renderer.setSize(window.innerWidth, window.innerHeight);    }    function render() {        controls.update();        //更新性能插件        stats.update();         //更新动画       // TWEEN.update();         renderer.render(scene, camera);    }        //循环渲染    function animate() {        //更新控制器        render();       		          requestAnimationFrame(animate);    }    //整体初始化的函数    function draw() {        initRender();        initScene();        initCamera();        initLight();        //具体的物体       // initModel();        initControls();        initStats();        animate();        window.onresize = onWindowResize;    }③复制代码

③加入具体的展示物体(基础平面及点集)

var  geo_ver;function initModel() {        //辅助工具        var helper = new THREE.AxesHelper(50);        scene.add(helper);        // 地板        var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 400, 400 ), new THREE.MeshPhongMaterial( { color: 0xffffff, depthWrite: false } ) );        mesh.rotation.x = - Math.PI / 2;        mesh.receiveShadow = true;        scene.add( mesh );        //添加地板割线        var grid = new THREE.GridHelper( 400, 50, 0x000000, 0x000000 );        grid.material.opacity = 0.2;        grid.material.transparent = true;        scene.add( grid );        //获取点集	getFontPoints('白狗',-23,0,0);						//用点画字	pointsMaterial = new THREE.PointsMaterial({	    color:0xffffff,	    size:0.5,	    transparent:true,//使材质透明	    blending:THREE.AdditiveBlending,	    depthTest:false,//深度测试关闭,不消去场景的不可见面	    map:createLightMateria()//刚刚创建的粒子贴图就在这里用上	   });			var originGeo = new THREE.Geometry();	for (var i = 0; i 

三、整体代码(包括,粒子切换动画)(代码可能比较杂乱)

    
粒子字体
白狗
复制代码

四、注意事项:

    (1)自己下载.ttf字体文件。通过https://gero3.github.io/facetype.js/工具可以转化成.json文件。

    (2)字体文件一般很大,性能不好。(建议存在后端,然后发请求。或者前期先使用工具裁剪字体文件)。(我用的wqfontcreator,但是你们可能找不到,真的要要,@我)

    (3)以上代码没有做过多优化。(各位将就着看···)(见谅)

    (4)以上代码不能直接用,需要起个服务,因为请求.json文件的问题

转载于:https://juejin.im/post/5c8763e2e51d4539d9565d91

你可能感兴趣的文章
Oracle 分析函数
查看>>
SpringBoot基础教程1.1.1 项目搭建
查看>>
Jenkins打包记录导至服务磁盘空间不够
查看>>
设计模式C++实现(2)——策略模式
查看>>
微信小程序五-列表渲染多层嵌套循环及wx:key的使用
查看>>
查看centos中的用户和用户组和设置用户权限
查看>>
JDK安装
查看>>
centos6.4 nginx php mysql 编译安装一些补充事项
查看>>
uliweb的chatroom聊天室测试程序
查看>>
layui中laydate动态赋值最大、最小值
查看>>
deepin15.7 更新升级之后,sogou 浏览器chrome,firfox 中无法使用中文输入
查看>>
Quartz集群原理及配置应用
查看>>
路由网关转发配置
查看>>
java读取配置文件的几种方法
查看>>
Hadoop上路_03-伪分布式集群配置
查看>>
1.3 top 动态查看负载
查看>>
基于CentOS 5.6的应用服务器精简定制版出来了,ISO文件下载
查看>>
centos7 添加阿里云源
查看>>
SyntaxHighlighter行号显示错误及代码太长无法换行解决办法
查看>>
HTML5 canvas drawImage() 方法
查看>>