<
>

使用three.js实现炫酷的酸性风格3D页面效果

2022-04-15 07:34:09 来源:易采站长站 作者:

通过鼠标点的位置和当前相机的矩阵计算出raycaster raycaster.setFromCamera(mouse, camera); // 获取raycaster直线和所有模型相交的数组集合 let intersects = raycaster.intersectObjects(scene.children); if (intersects.length > 0) { alert('HELLO WORLD') // 可以通过遍历实现点击不同mesh触发不同交互,如: let selectedObj = intersects[0].object; if (selectedObj.name === 'car') { alert('汽车🚗') } }}window.addEventListener('click', onMouseClick, false);

添加3D文字

使用 TextGeometry(text : String, parameters : Object) 添加 3D文字,以下是可设置属性的说明:

size:字号大小,一般为大写字母的高度。 height:文字的厚度。weight:值为 normalbold,表示是否加粗。 font:字体,默认是 helvetiker,需对应引用的字体文件。 style:值为 normalitalics,表示是否斜体 bevelThickness:倒角厚度。 bevelSize:倒角宽度。 curveSegments:弧线分段数,使得文字的曲线更加光滑。 bevelEnabled:布尔值,是否使用倒角,意为在边缘处斜切。
var loader = new THREE.FontLoader();loader.load('gentilis_regular.typeface.json', function (font) {  var textGeo = new THREE.TextGeometry('HELLO WORLD', {    font: font,    size: .8,    height: .8,    curveSegments: .05,    bevelThickness: .05,    bevelSize: .05,    bevelEnabled: true  });  var textMaterial = new THREE.MeshPhongMaterial({ color: 0x03c03c });  var mesh = new THREE.Mesh(textGeo, textMaterial);  mesh.position.set(0, 3.8, 0);  scene.add(mesh);});

使用three.js实现炫酷的酸性风格3D页面效果

优化

现在模型加载已经基本完成了,但是 3D 模型的体积一般比较大,部署之后我发现网页加载非常慢,影响用户体验,减小模型体积是十分必要的,在网上找了很久压缩工具,发现在不需要安装大型 3D建模软件 的情况下,使用 obj2gltf 可以将体积较大的 OBJ 格式模型转化为 gltf 模型,有效优化模型体积,提升网页加载速度。

安装

npm install obj2gltf --save

将obj模型复制到以下目录中

node_modulesobj2gltfbin

执行转码指令

node obj2gltf.js -i demo.obj -o demo.gltf

如图出现类似上述内容,转码完成,对比转化前后的文件体积,本例中 kas.obj 初始文件大小为 9.7M 转化后的文件 kas.gltf 只有 4.6M,体积缩小一半,此时将转化后的模型加载到页面上,肉眼几乎看不出模型效果的变化,同时页面加载速度得到明显提升。

使用three.js实现炫酷的酸性风格3D页面效果

obj2gltf 也可以作为库使用,通过 node服务 实时转化模型,感兴趣的同学可以通过文章末尾链接深入学习。
也可以是使用 3D 建模软件如 blender 等手动通过减少模型 面数缩小体积 等途径对模型压缩优化,这种优化效果更明显。

完整代码

var model = require('@/assets/models/kas.gltfimate () {      var clock = new THREE.Clock()      requestAnimationFrame(animate);      var delta = clock.getDelta();      scene.rotation.y -= 0.015;      renderer.render(scene, camera);      stats.update();    }    // 增加点击事件    //声明raycaster和mouse变量    var raycaster = new THREE.Raycaster();    var mouse = new THREE.Vector2();    function onMouseClick(event) {      // 通过鼠标点击位置计算出raycaster所需要点的位置,以屏幕中心为原点,值的范围为-1到1.      mouse.x = (event.clientX / window.innerWidth) * 2 - 1;      mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;      // 通过鼠标点的位置和当前相机的矩阵计算出raycaster      raycaster.setFromCamera(mouse, camera);      // 获取raycaster直线和所有模型相交的数组集合      var intersects = raycaster.intersectObjects(scene.children);      if (intersects.length > 0) {        alert('HELLO WORLD')      }    }    window.addEventListener('click', onMouseClick, false);  }}

其他设计元素

本文主要介绍 3D元素 的加载,由于文章篇幅以及时间有限(博主太懒😂)其他元素的实现不做详细讲解(可能后续有时间会总结整理 maybe)感兴趣的同学可以扩展阅读以下其他大神优秀的文章。

流体背景

静态 液态背景图可以通过 SVG filter 实现,可以阅读《Creating Patterns With SVG Filters》,实现 动态 流体背景,可以使用Three.js 结合原生GLSL实现,可参考《CodePen Shader Template》示例来实现。

使用three.js实现炫酷的酸性风格3D页面效果

金属、霓虹、故障效果等酸性效果字体可以阅读我的另一篇文章《仅用css几步实现赛博朋克2077风格视觉效果》,也可以使用设计生成,由于时间关系,本文项目中的金属效果文字以及本文banner头图中的文字都是使用在线艺术字体生成网站生成的,感兴趣的同学可以自行尝试设计。

未来进一步优化

#todo 酸性风格液态背景实现。 #todo 3D模型液态金属效果。

three.js 优秀案例推荐

最后给大家推荐几个非常惊艳的 three.js 项目来一起体验和学习,无论是页面交互、视觉设计还是性能优化都做到了极致,可以从中学到很多。

使用three.js实现炫酷的酸性风格3D页面效果

github首页:3D地球 实时显示全球热门仓库。

kodeclubs:低面数 3D城市 第三人称小游戏。

球鞋展示:720度 球鞋动态展示。

沙雕dance:沙雕动物舞者。

Zenly软件:Zenly App 中文主页。

参考资料

three.js: https://threejs.org

obj2gltf: https://github.com/CesiumGS/obj2gltf

200多页免费3d模型 https://www.turbosquid.com

免费3D雕像: https://threedscans.com

免费3D模型:https://free3d.com

艺术字体在线生成:https://cooltext.com

什么是酸性设计:https://www.shejipi.com/361258.html

作者:dragonir 本文地址:https://www.cnblogs.com/dragonir/p/15350537.html

暂时禁止评论

微信扫一扫

易采站长站微信账号