今天将要介绍的是 CylinderGeometry 几何体。这也是一种非常简单的三维几何体,你甚至不需要指定任何参数就能创建出一个圆柱体。下面给出了常用的几个属性:

属性 描述
radiusTop 可选。此属性定义圆柱体顶部圆半径。默认值是 20
radiusBottom 可选。此属性定义圆柱体底部圆半径。默认值是 20
height 可选。此属性定义圆柱体的高度。默认值是 100
radiusSegments 可选。此属性定义圆柱体的上下部的圆截面分成多少段。默认值是 8
heightSegments 可选。此属性定义圆柱体竖直方向上分成多少段。默认值是 1
openEnded 可选。此属性定义圆柱体的顶部和底部是否为打开。默认值是 false

对于上表中提到的相关参数,想必不用多说,你也应该很清楚他们的含义和用法了,下面给出完整示例,代码如下:

<!DOCTYPE html>
<html>
<head><title>示例 05.06 - CylinderGeometry</title><script src="../build/three.js"></script><script src="../build/js/controls/OrbitControls.js"></script><script src="../build/js/libs/stats.min.js"></script><script src="../build/js/libs/dat.gui.min.js"></script><script src="../jquery/jquery-3.2.1.min.js"></script><style>body {/* 设置 margin 为 0,并且 overflow 为 hidden,来完成页面样式 */margin: 0;overflow: hidden;}/* 统计对象的样式 */#Stats-output {position: absolute;left: 0px;top: 0px;}</style>
</head>
<body><!-- 用于 WebGL 输出的 Div -->
<div id="webgl-output"></div>
<!-- 用于统计 FPS 输出的 Div -->
<div id="stats-output"></div><!-- 运行 Three.js 示例的 Javascript 代码 -->
<script type="text/javascript">var scene;var camera;var render;var webglRender;//var canvasRender;var controls;var stats;var guiParams;var ground;//var box;//var sphere;var cylinder;//var plane;var meshMaterial;var ambientLight;var spotLight;//var cameraHelper;$(function() {stats = initStats();scene = new THREE.Scene();webglRender = new THREE.WebGLRenderer( {antialias: true, alpha: true} ); // antialias 抗锯齿webglRender.setSize(window.innerWidth, window.innerHeight);webglRender.setClearColor(0xeeeeee, 1.0);webglRender.shadowMap.enabled = true; // 允许阴影投射render = webglRender;camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 1000); // 2147483647camera.position.set(-45.5, 68.2, 90.9);var target = new THREE.Vector3(10, 0 , 0);controls = new THREE.OrbitControls(camera, render.domElement);controls.target = target;camera.lookAt(target);$('#webgl-output')[0].appendChild(render.domElement);window.addEventListener('resize', onWindowResize, false);ambientLight = new THREE.AmbientLight(0x0c0c0c);scene.add(ambientLight);spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(0, 60, 30);spotLight.shadow.mapSize.width = 5120; // 必须是 2的幂,默认值为 512spotLight.shadow.mapSize.height = 5120; // 必须是 2的幂,默认值为 512spotLight.castShadow = true;scene.add(spotLight);//cameraHelper = new THREE.CameraHelper(spotLight.shadow.camera);//scene.add(cameraHelper);// 加入一个地面var groundGeometry = new THREE.PlaneGeometry(100, 100, 4, 4);var groundMaterial = new THREE.MeshLambertMaterial({color: 0x777777}); // MeshBasicMaterial 材质不能接收阴影ground = new THREE.Mesh(groundGeometry, groundMaterial);ground.rotation.set(-0.5 * Math.PI, 0, 0); // 沿着 X轴旋转-90°ground.receiveShadow = true;scene.add(ground);// 材质meshMaterial = [new THREE.MeshNormalMaterial({side: THREE.DoubleSide}),new THREE.MeshBasicMaterial({wireframe: true})];/** 用来保存那些需要修改的变量 */guiParams = new function() {this.rotationSpeed = 0.02;this.radiusTop = 10;this.radiusBottom = 10;this.height = 20;this.radiusSegments = 16;this.heightSegments = 4;this.openEnded = true;this.thetaStart = 0;this.thetaLength = 2 * Math.PI;}/** 定义 dat.GUI 对象,并绑定 guiParams 的几个属性 */var gui = new dat.GUI();gui.add(guiParams, 'radiusTop', -10, 50, 1).onChange(function(e){updateMesh()});gui.add(guiParams, 'radiusBottom', -10, 50, 1).onChange(function(e){updateMesh()});gui.add(guiParams, 'height', 1, 50, 1).onChange(function(e){updateMesh()});gui.add(guiParams, 'radiusSegments', 2, 20, 1).onChange(function(e){updateMesh()});gui.add(guiParams, 'heightSegments', 1, 20, 1).onChange(function(e){updateMesh()});gui.add(guiParams, 'openEnded').onChange(function(e){updateMesh()});gui.add(guiParams, 'thetaStart', 0, Math.PI, 0.01).onChange(function(e){updateMesh()});gui.add(guiParams, 'thetaLength', 0, 2 * Math.PI, 0.01).onChange(function(e){updateMesh()});updateMesh();renderScene();});/** 渲染场景 */function renderScene() {stats.update();rotateMesh(); // 旋转物体requestAnimationFrame(renderScene);render.render(scene, camera);}/** 初始化 stats 统计对象 */function initStats() {stats = new Stats();stats.setMode(0); // 0 为监测 FPS;1 为监测渲染时间$('#stats-output').append(stats.domElement);return stats;}/** 当浏览器窗口大小变化时触发 */function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();render.setSize(window.innerWidth, window.innerHeight);}/** 旋转物体 */var step = 0;function rotateMesh() {step += guiParams.rotationSpeed;scene.traverse(function(mesh) {if ((mesh instanceof THREE.Mesh || mesh instanceof THREE.Line) && mesh != ground) {//mesh.rotation.x = step;mesh.rotation.y = step;//mesh.rotation.z = step;}});}function updateMesh() {scene.remove(cylinder);// 定义 cylindervar cylinderGeometry = new THREE.CylinderGeometry(guiParams.radiusTop, guiParams.radiusBottom, guiParams.height, guiParams.radiusSegments, guiParams.heightSegments, guiParams.openEnded, guiParams.thetaStart, guiParams.thetaLength);cylinder = new THREE.SceneUtils.createMultiMaterialObject(cylinderGeometry, meshMaterial);cylinder.children[1].castShadow = true; // cylinder.children[0] 的材质是 MeshNormalMaterial,不能投射阴影cylinder.position.set(0, guiParams.height / 2 + 3, 0);scene.add(cylinder);}</script>
</body>
</html>

需要注意的是,圆柱体的顶部和底部半径可以设置为负数。如果这样设置的话,你就可以创建出一个类似沙漏的图形了。
未完待续···

three.js 05-06 之 CylinderGeometry 几何体相关推荐

  1. java中 将字符串时间 '2015-9-8 17:05:06' 转化为格式 '2015-09-08 17:05:06'

    /** * 将字符串时间'2015-9-8 17:05:06'转化为格式'2015-09-08 17:05:06' */ import java.text.SimpleDateFormat; publ ...

  2. 上周ASP.NET英文技术文章推荐[05/06 - 05/12]

    这是Dflying Chen 在上周推荐的英文文章,感觉很不错,可以一直没看完,记个笔记.别忘记了看. 本周ASP.NET英文技术文章推荐[05/06 - 05/12] 摘要 本期共有9篇文章: 强大 ...

  3. 菜鸟成长之路05/06/07

    2019/05/13 1,position的几种属性 2,height:100%失效问题 3, 如何实现单行文本省略,多行呢? 4,正则表达式去重 5,new 的过程中发生了什么? 6,restful ...

  4. 【cocos2d-x从c++到js】06:Google的继承写法解析

    cocos2d-x for js中集成了两套继承写法,一套是JR的,一套是google.公司同事使用过node.js,对google的继承方式比较赞同.我就看了一下Google的继承代码. 先贴代码: ...

  5. Three.JS提升学习4:几何体对象组合

    对象组合 sphere = createMesh(new THREE.SphereGeometry(5, 10, 10)); cube = createMesh(new THREE.BoxGeomet ...

  6. 程序员面试金典 - 面试题 05.06. 整数转换(位运算)

    1. 题目 整数转换.编写一个函数,确定需要改变几个位才能将整数A转成整数B. 示例1:输入:A = 29 (或者0b11101), B = 15(或者0b01111)输出:2示例2:输入:A = 1 ...

  7. 2016.05.06软件更新公告

    升级ComicEnhancerPro.ComicsViewer.FindStr.MyReader.PdgThumbViewer.Zip2Dir 最新软件下载地址:http://pan.baidu.co ...

  8. Go语言之禅 | Gopher Daily (2021.05.06) ʕ◔ϖ◔ʔ

    每日一谚:Go is about being a language that focuses on code being readable. Go技术生态 Go语言之禅 - https://mp.we ...

  9. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  10. Django练习 day04, 05, 06,07

    目录 Day04练习 day04文件夹 index Day05练习 Day04文件夹 index templates Day06练习 index templates Day07练习 day04文件夹 ...

最新文章

  1. Mysql VARCHAR(X) vs TEXT
  2. 两个表循环的复杂度分析 征集
  3. .net core 生成html,ASP.NET Core 中如何将 .cshtml 视图文件生成为 .cs 文件
  4. Alsa驱动分析(转)
  5. ueditor工具栏弹出html,UEditor工具栏上自定义按钮、图标、事件、窗口页面
  6. 多浏览器下,CSS截断功能。
  7. 聊一聊字节跳动的面试
  8. 解决wine中文显示为方框的方法
  9. EasyUI icon 小图标库,应有尽有(5000多个)打包下载
  10. 努力无用论?我不信。。。
  11. 域名解析中TTL是什么意思?
  12. python爬取qq音乐歌词风变编程_爬取QQ音乐歌词
  13. AUTOCAD——倒角命令、圆角命令
  14. 微信企业号回调模式 java_java微信企业号开发之开发模式的开启
  15. JC-1、python学习笔记
  16. 『英语杂谈』 [好文共赏]Heal the World(转载)
  17. PySide2学习总结(十二)打开文件对话框--FileDialog
  18. Linux/服务器中文件下载
  19. 【TensorFlow基础函数】tf.concat的用法
  20. 不怕有错误,就怕没错误(1)

热门文章

  1. java模拟刷百度排名无效_刷百度排名软件教程-软件设置问题
  2. 为什么红黑树查询快_为什么这么多关于红黑树的面试题呢?
  3. 计算机谈歌曲简单,计算机应用基础公开课制作一首简单的MP3歌曲.ppt
  4. linux环境蝉道搭建及关联钉钉
  5. java fup spring
  6. 计算机应用技术企业信息化,计算机应用技术对企业信息化作用
  7. 输入法 - 字母宽 窄 切换 - 全角 半角 的含义
  8. 异数OS 织梦师-Xnign(四)-- 挑战100倍速Nginx,脚踩F5硬件负载均衡
  9. 国产CPU 申威1621 异数OS基础组件理论性能测试报告
  10. numpy: np.asarray 函数