学习threejs,THREE.LineDashedMaterial 虚线材质,基于gosper高斯帕曲线生成雪花动画

embedded/2024/10/18 2:15:12/

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • 1.1 ☘️THREE.LineDashedMaterial虚线材质概念和属性
  • 二、🍀THREE.LineDashedMaterial虚线材质,基于gosper高斯帕曲线生成雪花动画效果
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中实现THREE.LineBasicMaterial虚线材质,基于gosper高斯帕曲线生成雪花动画,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️THREE.LineDashedMaterial虚线材质概念和属性

THREE.LineDashedMaterial 的材质类型,用于创建虚线线条效果。THREE.LineDashedMaterial 是 Three.js 为了简化创建虚线线条而提供的一个方便的材质类型,它允许用户通过简单的属性配置来实现虚线效果,而不需要手动编写着色器。
常用属性:
THREE.LineDashedMaterial 继承自 THREE.Material,并具有以下一些特定的属性,可以用来控制材质的虚线效果:

color:线条的颜色,默认为白色(0xffffff)。可以是一个整数,表示十六进制颜色值。
linewidth:线条宽度,默认为 1。注意,实际的线条宽度可能会受到浏览器和硬件的支持限制。
scale:虚线的比例,默认为 1。可以用来缩放虚线的大小。
dashSize:虚线段的长度,默认为 3。这是虚线中实线部分的长度。
gapSize:虚线间隙的长度,默认为 1。这是虚线中空白部分的长度。
vertexColors:是否启用顶点颜色,默认为 THREE.NoColors。可以设置为 THREE.VertexBasicColors、THREE.VertexColors 或 THREE.FaceColors。
transparent:是否开启透明模式,默认为 false。如果设置为 true,则需要设置 opacity 或者使用 alphaMap。
opacity:材质的全局透明度,默认为 1(不透明)。
side:指定材质在哪一面渲染,可以是 THREE.FrontSide(正面)、THREE.BackSide(背面)或 THREE.DoubleSide(双面)。
depthTest:是否进行深度测试,默认为 true。
depthWrite:是否写入深度缓冲区,默认为 true。
blending:混合模式,默认为 THREE.NormalBlending。可以设置为 THREE.AdditiveBlending、THREE.SubtractiveBlending 等。
wireframe:是否启用线框模式,默认为 false。
visible:是否渲染该材质,默认为 true。

二、🍀THREE.LineDashedMaterial虚线材质,基于gosper高斯帕曲线生成雪花动画效果

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.SpotLight聚焦光源,设置聚焦光源位置,设置聚焦光源投影,scene添加聚焦光源。
  • 5、加载几何模型:创建THREE.Line线几何体(使用gosper高斯帕曲线生成的雪花数据),THREE.Line线几何体使用THREE.LineDashedMaterial 虚线材质,Scene场景加入生成的THREE.Line线几何体。
  • 6、创建旋转动画,执行旋转动画,加入stats监控器,监控帧数信息。

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>learn21(THREE.LineBasicMaterial线性几何体)</title><script src="lib/threejs/91/three.js"></script><!--<script src="https://johnson2heng.github.io/three.js-demo/lib/three.js"></script>--><script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script>
</head>
<style>body {margin: 0;}canvas {width: 100%;height: 100%;display: block;}
</style>
<body onload="draw()">
</body>
<script>// color	该属性设置材质的颜色,如果设置了vertexColors,这是属性将被忽略// linewidth	设置线的宽度,默认值为1.0// linecap	这个属性定义了线框模式下顶点间线段的端点如何显示。可选的值包括butt(平)、round(圆)和square(方)。默认值为round。在实际使用中,这个属性的修改结果很难看出来。WebGLRenderer对象不支持该属性// linejoin	这个属性定义了线段的连接点如何显示。可选的值有round(圆)、bevel(斜角)和miter(尖角)。默认值为round。如果你在一个使用低透明度和很大wireframeLinewidth值的例子里靠近观察,就可以看到这个属性的效果。WebGLRenderer对象不支持该属性// vertexColors	将这个属性设置成THREE.VertexColors值,就可以给每个顶点指定一种颜色// fog	该属性指定当前材质是否受全局雾化效果设置的影响var renderervar initRender = () => {renderer = new THREE.WebGLRenderer({antialias: true})renderer.shadowMap.enabled = truerenderer.shadowMap.type = THREE.PCFSoftShadowMaprenderer.setSize(window.innerWidth, window.innerHeight)document.body.appendChild(renderer.domElement)}var scenevar initScene = () => {scene = new THREE.Scene()}var cameravar initCamera = () => {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)camera.position.set(0, 50, 100)camera.lookAt(new THREE.Vector3(0, 0, 0))}var ambientLight, spotLightvar initLight = () => {ambientLight = new THREE.AmbientLight(0x0c0c0c)scene.add(ambientLight)spotLight = new THREE.SpotLight(0xffffff)spotLight.position.set(-40, 60, -10)spotLight.castShadow = truescene.add(spotLight)}var linevar initModel = () => {var points = gosper(3, 60)var geometry = new THREE.Geometry()var colors = []for (var i = 0,len = points.length; i < len; i++) {var e = points[i]geometry.vertices.push(new THREE.Vector3(e.x, e.y, e.z))colors[i] = new THREE.Color(0xffffff)colors[i].setHSL(e.x / 100 + 0.5, (  e.y * 20 ) / 300, 0.8)}geometry.colors = colors// var material = new THREE.LineBasicMaterial({//   opacity: 1.0, //设置透明度//   linewidth: 1, //设置线的宽度//   vertexColors: THREE.VertexColors //设置这个可以给每个顶点指定一种颜色// })// geometry.computeLineDistances()var material = new THREE.LineDashedMaterial({vertexColors: true,color: 0xffffff,dashSize: 2,gapSize: 2,scale: 5})line = new THREE.Line(geometry, material)line.computeLineDistances()line.position.set(0, 0, -60)scene.add(line)}var statsvar initStats = () => {stats = new Stats()document.body.appendChild(stats.dom)}var step = 0var render = () => {line.rotation.z = step += 0.01;line.rotation.y = step += 0.01;renderer.render(scene, camera)}var onWindowResize = () => {camera.aspect = window.innerWidth / window.innerHeightcamera.updateProjectionMatrix()render()renderer.setSize(window.innerWidth, window.innerHeight)}var animate = () => {render()stats.update()requestAnimationFrame(animate)}var draw = () => {initRender()initScene()initCamera()initLight()initModel()initStats()animate()window.onresize = onWindowResize}//高斯帕曲线生成函数gosper(密度, 大小),也被称为flowsnake(一首音误的雪花),是一种空间填充曲线。它是一个与龙曲线和希尔伯特曲线相似的分形物体。function gosper(a, b) {var turtle = [0, 0, 0];var points = [];var count = 0;rg(a, b, turtle);return points;function rt(x) {turtle[2] += x;}function lt(x) {turtle[2] -= x;}function fd(dist) {
//    ctx.beginPath();points.push({x: turtle[0], y: turtle[1], z: Math.sin(count) * 5});
//    ctx.moveTo(turtle[0], turtle[1]);var dir = turtle[2] * (Math.PI / 180);turtle[0] += Math.cos(dir) * dist;turtle[1] += Math.sin(dir) * dist;points.push({x: turtle[0], y: turtle[1], z: Math.sin(count) * 5});
//    ctx.lineTo(turtle[0], turtle[1]);
//    ctx.stroke();}function rg(st, ln, turtle) {st--;ln = ln / 2.6457;if (st > 0) {
//      ctx.strokeStyle = '#111';rg(st, ln, turtle);rt(60);gl(st, ln, turtle);rt(120);gl(st, ln, turtle);lt(60);rg(st, ln, turtle);lt(120);rg(st, ln, turtle);rg(st, ln, turtle);lt(60);gl(st, ln, turtle);rt(60);}if (st == 0) {fd(ln);rt(60);fd(ln);rt(120);fd(ln);lt(60);fd(ln);lt(120);fd(ln);fd(ln);lt(60);fd(ln);rt(60)}}function gl(st, ln, turtle) {st--;ln = ln / 2.6457;if (st > 0) {
//      ctx.strokeStyle = '#555';lt(60);rg(st, ln, turtle);rt(60);gl(st, ln, turtle);gl(st, ln, turtle);rt(120);gl(st, ln, turtle);rt(60);rg(st, ln, turtle);lt(120);rg(st, ln, turtle);lt(60);gl(st, ln, turtle);}if (st == 0) {lt(60);fd(ln);rt(60);fd(ln);fd(ln);rt(120);fd(ln);rt(60);fd(ln);lt(120);fd(ln);lt(60);fd(ln);}}}
</script>
</html>

效果如下:
在这里插入图片描述


http://www.ppmy.cn/embedded/128323.html

相关文章

python 中*的用处

自己经常混*的用处&#xff0c;为此特意总结记录。 在Python中&#xff0c;函数定义中的*&#xff08;星号&#xff09;用于指示位置参数的结束和关键字参数的开始。具体来说&#xff0c;*之后的参数必须以关键字参数的形式传递。 用在函数参数中 在我的例子中&#xff1a; …

Git 基本命令行操作

Git是一个开源的分布式版本控制系统&#xff0c;用于管理源代码和文档的版本。以下是Git的基本命令行操作&#xff1a; 一、配置 安装完成后&#xff0c;需要配置Git的用户名和邮箱&#xff0c;以便在提交记录时记录操作者的信息。 配置全局用户名&#xff1a;git config --g…

Windows的一些技巧

一、如何去掉桌面程序图标的小箭头 1、使用WIN + R 快捷键调出运行窗口 2、在运行 窗口输入 regedit,打开注册表编辑器 3、在注册表编辑器 中找到 HKEY_CLASSES_ROOT\lnkfile 4、在右侧窗格中找到 IsShortcut 项,右键 删除 二、WIN10如何打开图片查看器 1、使用WIN + R 快…

【力扣150Golang】除自身以外数组的乘积

题目&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;…

GESP CCF python三级编程等级考试认证真题 2024年9月

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 据有关资料&#xff0c;山东大学于1972年研制成功DJL-1计算机&#xff0c;并于1973年投入运行&#xff0c;其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的磁心存储元件由磁心颗粒组成…

用python的eval函数自定义行情指标公式

用python的eval函数自定义行情指标公式 先看效果实现步骤计算结果 先看效果 实现步骤 在前端配置规则和公式&#xff0c;不同的结果可以自定义背景颜色和字体颜色。 def _compute_rule(self, localdict):""":param localdict: dictionary containing the cur…

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时&#xff0c;全表查询会报错&#xff1a; 这时候如果有前面正常的rman备份&#xff0c;那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查&#xff1a; RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter

PyCharm 项目解释器切换指南&#xff1a;如何在项目中更换 Python Interpreter 文章目录 PyCharm 项目解释器切换指南&#xff1a;如何在项目中更换 Python Interpreter一 Settings 设置二 Project 选项三 Conda Environment四 更换 Environment 本文详细介绍了在 macOS 系统中…