简介

使用THREE.ParametricGeometry可以根据传入的公式,计算出相应的几何体。这是一个很具有扩展性的几何体。

简单实现

var geometry = new THREE.ParametricGeometry(function, slices, stacks);

通过上面的方法,就可以创建出一个THREE.ParametricGeometry的几何体。相关的参数为:

相关参数

属性 是否必需 描述
function 该属性为一个函数,该函数以u、v值作为参数定义每个顶点的位置。需要返回THREE.Vector3的值
slices 该属性定义u值应该分成多少份
stacks 该属性定义v值应该分成多少份

方法讲解

在我们设置好相关的属性值之后,THREE.ParametricGeometry会根据我们定义的slicesstacksuv生成的值传给function循环调用。uv的范围是0-1。
举个列子:如果我们要生成一个width为10,depth为10的平面图形,将slices设置为5,stacks设置为4。function的表达式为

    //创建平面模型的方法var plane = function (u, v) {var x = u*10;var y = 0;var z = v*10;return new THREE.Vector3(x, y, z);};

那么,在运算的时候,会生成的点就是:

u:0/5; v:0/4; return: THREE.Vector3(0, 0, 0);
u:1/5; v:0/4; return: THREE.Vector3(2, 0, 0);
u:2/5; v:0/4; return: THREE.Vector3(4, 0, 0);
u:3/5; v:0/4; return: THREE.Vector3(6, 0, 0);
u:4/5; v:0/4; return: THREE.Vector3(8, 0, 0);
u:5/5; v:0/4; return: THREE.Vector3(10, 0, 0);
u:0/5; v:1/4; return: THREE.Vector3(0, 0, 2.5);
u:1/5; v:1/4; return: THREE.Vector3(2, 0, 2.5);
u:2/5; v:1/4; return: THREE.Vector3(4, 0, 2.5);
...
u:3/5; v:4/4; return: THREE.Vector3(6, 0, 10);
u:4/5; v:4/4; return: THREE.Vector3(8, 0, 10);
u:5/5; v:4/4; return: THREE.Vector3(10, 0, 10);

然后,程序通过生成的这些一组一组的点,生成相应的面,再绘制出来。

案例代码

设置slicesstacks为120时,分的层次很多,所以生成的图形很平滑。



如果设置slicesstacks为12,分的层次少,则能够看出来点的关系。



通过上面我们可以看出来程序通过我们生成的点,绘制出来了,相应的图形。

案例查看地址:http://www.wjceo.com/blog/threejs/2018-02-12/49.html

以下是相关案例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();">
</body>
<script src="https://johnson2heng.github.io/three.js-demo/lib/three.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/dat.gui.min.js"></script>
<script>var renderer;function initRender() {renderer = new THREE.WebGLRenderer({antialias:true});//renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); //设置背景颜色renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);}var camera;function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000);camera.position.set(0, 0, 150);}var scene;function initScene() {scene = new THREE.Scene();}var light;function initLight() {scene.add(new THREE.AmbientLight(0x404040));light = new THREE.DirectionalLight(0xffffff);light.position.set(1,1,1);scene.add(light);}//创建平面模型的方法var plane = function (u, v) {var x = u*50;var y = 0;var z = v*50;return new THREE.Vector3(x, y, z);};//创建波浪图形的方法var radialWave = function (u, v) {var r = 50;var x = Math.sin(u) * r;var z = Math.sin(v / 2) * 2 * r;var y = (Math.sin(u * 4 * Math.PI) + Math.cos(v * 2 * Math.PI)) * 2.8;return new THREE.Vector3(x, y, z);};var klein = function (u, v) {u *= Math.PI;v *= 2 * Math.PI;u = u * 2;var x, y, z;if (u < Math.PI) {x = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(u) * Math.cos(v);z = -8 * Math.sin(u) - 2 * (1 - Math.cos(u) / 2) * Math.sin(u) * Math.cos(v);} else {x = 3 * Math.cos(u) * (1 + Math.sin(u)) + (2 * (1 - Math.cos(u) / 2)) * Math.cos(v + Math.PI);z = -8 * Math.sin(u);}y = -2 * (1 - Math.cos(u) / 2) * Math.sin(v);return new THREE.Vector3(x, y, z);};function initModel() {//轴辅助 (每一个轴的长度)object = new THREE.AxisHelper( 50 );scene.add( object );var mesh = createMesh(new THREE.ParametricGeometry(klein, 12, 12));scene.add(mesh);}//生成模型function createMesh(geom) {//设置当前的模型矩阵沿xy轴偏移,让图片处于显示中心geom.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0, 0));// 创建法向量纹理var meshMaterial = new THREE.MeshNormalMaterial({flatShading: THREE.FlatShading,transparent: true,opacity: 0.9});//  创建一个线框纹理var wireFrameMat = new THREE.MeshBasicMaterial();wireFrameMat.wireframe = true;// 创建模型var mesh = THREE.SceneUtils.createMultiMaterialObject(geom, [meshMaterial,wireFrameMat]);return mesh;}//初始化性能插件var stats;function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放var controls;function initControls() {controls = new THREE.OrbitControls( camera, renderer.domElement );// 如果使用animate方法时,将此函数删除//controls.addEventListener( 'change', render );// 使动画循环使用时阻尼或自转 意思是否有惯性controls.enableDamping = true;//动态阻尼系数 就是鼠标拖拽旋转灵敏度//controls.dampingFactor = 0.25;//是否可以缩放controls.enableZoom = true;//是否自动旋转controls.autoRotate = false;//设置相机距离原点的最远距离controls.minDistance  = 20;//设置相机距离原点的最远距离controls.maxDistance  = 10000;//是否开启右键拖拽controls.enablePan = true;}//生成gui设置配置项var gui;function initGui() {//声明一个保存需求修改的相关数据的对象gui = {};var datGui = new dat.GUI();//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)//调用生成一次图形gui.asGeom();}function render() {renderer.render( scene, camera );}//窗口变动触发的函数function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();render();renderer.setSize( window.innerWidth, window.innerHeight );}function animate() {//更新控制器controls.update();render();//更新性能插件stats.update();requestAnimationFrame(animate);}function draw() {initRender();initScene();initCamera();initLight();initModel();initControls();initStats();//initGui();animate();window.onresize = onWindowResize;}
</script>
</html>

47 Three.js使用THREE.ParametricGeometry生成平面图形、波浪图形、和克莱因瓶相关推荐

  1. html验证码功能如何实现原理,基于JS实现一个随机生成验证码功能

    效果展示 实现原理 1. html:一般就是一个div: 2. JS:1)将所有的验证码所用的字符放在一个字符串中 2)在这个字符串的字符个数以内,随机生成索引号 3)根据索引号查找对应字符,拼接成验 ...

  2. 使用JS创建条形码在线生成工具-toolfk.com

    本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果.Tool ...

  3. 使用gif.js根据视频片段生成GIF图

    使用gif.js根据视频片段生成GIF图 文件引入 具体实现 扩展阅读 文件引入 根据视频片段来生成GIF需要用到gif.js文件,不多说,在这里先提供下载链接: gif.js. 简单介绍一下,核心库 ...

  4. js将HTML导出生成word文档

    在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileS ...

  5. js版梅森旋转生成随机数

    用js实现, 梅森旋转生成随机数, 来代替Math.random(); 该文章参考自 梅森旋转算法--伪随机数(加密.身份信息ID号)_Touch_Dream的博客-CSDN博客 <!DOCTY ...

  6. js前端根据链接生成二维码并转成图片下载

    js前端根据链接生成二维码并转成图片下载 依赖于jquery.jquery.qrcode.min.js 1.html <div class="qrcode"></ ...

  7. Three.js通过不规则路径生成墙体

    Three.js通过不规则路径生成墙体 在一些3D场景的搭建中,经常会遇到图中通过墙体来分割内容的效果,目前Threejs提供的Geometry类型还无法直接处理一些不规则墙体的搭建 生成算法 通过B ...

  8. 学习使用js的 random() 方法生成随机数

    学习使用js的 random方法生成随机数 生成随机数1-100 Math.floor用法 Math.random()方法 生成随机数1-100 <!DOCTYPE html> <h ...

  9. AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac

    Burst Box for Mac是一款安装在ae中使用的一键快速生成MG爆炸图形动画插件,使用 BurstBox,可以在一秒钟内制作精美的爆裂动画!每个动画都很容易定制(颜色和样式). BurstB ...

最新文章

  1. Excel万年历的制作
  2. 第六十一天 how can I 坚持
  3. Sqoop_ 简单介绍
  4. mac远程连接centos安装mysql_centos安装Mysql并远程连接
  5. Swift之深入解析如何自定义操作符
  6. 模拟spring IOC、源码分析
  7. SAP Cloud Platform和S/4HANA的互联
  8. 猜1-10的数字python脚本
  9. sql语句lastupdate使用数据库库函数
  10. Angular Web App部署Linux Nginx Https
  11. 引入antd组件样式_个人作品:一个技术栈koa2+ mysql+react + antd的个人博客
  12. mysql oracle sqlserver分页,三种常用数据库(Oracle、MySQL、SQLServer)的分页之SQLServer分页...
  13. Spring Security使用数据库管理资源整理
  14. 中国 人民大学计算机考研分数线,中国人民大学2010年计算机考研复试分数线
  15. 命令行编译执行java文件
  16. java 利用同步工具类控制线程
  17. 计算机的网络测速,网速知识 - 专业网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测 - SpeedTest.cn...
  18. UserScript(用户脚本)在Firefox、Google Chrome、Opera、IE6-9等不同浏览器上的使用
  19. 【Python】从堆糖爬取图片Demo
  20. IIS部署ASP网站项目详细教程(内部含有子目录)

热门文章

  1. 【zabbix】自定义监控、邮件报警、企业微信报警、钉钉报警(详细)
  2. 正则表达式截取以什么开头和什么结尾_有些爱情故事可以猜到开头,没有猜到结尾,为什么?路遥性格分析...
  3. matlab求分段函数的值.,如何用MATLAB求分段函数的最小值和最大值?
  4. 如何快速搜索多个文件中内容是否有你需要的东西?
  5. 边缘计算(三)边缘计算与预测性维护
  6. Conflux迎来重大升级,引入EVM兼容空间及PoS链
  7. 日志瘦身骚操作:从5G优化到1G!
  8. PSEN ma1.3p-22PSEN ma1.3-12皮尔兹安全开关
  9. 为什么Linux系统没有病毒?原因竟是如此!
  10. 变基的风险以及如何用变基解决变基