👨⚕️ 主页: gis分享者
👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨⚕️ 收录于专栏:threejs gis工程师
文章目录
- 一、🍀前言
- 1.1 ☘️THREE.RingGeometry 圆环几何体
- 二、🍀创建THREE.RingGeometry 二维平面圆环几何体
- 1. ☘️实现思路
- 2. ☘️代码样例
一、🍀前言
本文详细介绍如何基于threejs在三维场景中创建THREE.RingGeometry 二维平面圆环几何体,亲测可用。希望能帮助到您。一起学习,加油!加油!
1.1 ☘️THREE.RingGeometry 圆环几何体
THREE.RingGeometry 一个用于生成二维圆环几何体的类。
构造函数:
RingGeometry(innerRadius : Float, outerRadius : Float, thetaSegments : Integer, phiSegments : Integer, thetaStart : Float, thetaLength : Float)
innerRadius — 内部半径,默认值为0.5。
outerRadius — 外部半径,默认值为1。
thetaSegments — 圆环的分段数。这个值越大,圆环就越圆。最小值为3,默认值为8。
phiSegments — 最小值为1,默认值为8。中心点往外的分段数。
thetaStart — 起始角度,默认值为0。
thetaLength — 圆心角,默认值为Math.PI * 2。
属性:
.parameters : Object
一个包含着构造函数中每个参数的对象。在对象实例化之后,对该属性的任何修改都不会改变这个几何体。
二、🍀创建THREE.RingGeometry 二维平面圆环几何体
1. ☘️实现思路
- 1、初始化renderer渲染器
- 2、初始化Scene三维场景scene。
- 3、初始化PerspectiveCamera透视相机camera,定义相机位置 camera.position,设置相机方向camera.lookAt。
- 4、加载几何模型:创建THREE.MeshNormalMaterial法向量材质meshMaterial,创建THREE.MeshBasicMaterial基础材质wireFrameMat,设置wireFrameMat基础材质的线框wireframe为true,通过THREE.SceneUtils.createMultiMaterialObject方法传入THREE.RingGeometry圆环几何体geom和meshMaterial、wireFrameMat材质等参数创建平面几何体网格组mesh,scene场景中添加mesh。具体代码参考代码样例。
- 5、加入gui控制,控制创建的圆环几何体半径、内径、分段数、中心对外分段数、起始角度、圆环扇区的中心角。加入stats监控器,监控帧数信息。
2. ☘️代码样例
<!DOCTYPE html>
<html>
<head><title>THREE.RingGeometry 二维平面圆环几何体</title><script type="text/javascript" src="../libs/three.js"></script><script type="text/javascript" src="../libs/stats.js"></script><script type="text/javascript" src="../libs/dat.gui.js"></script><style>body {/* set margin to 0 and overflow to hidden, to go fullscreen */margin: 0;overflow: hidden;}</style>
</head>
<body><div id="Stats-output">
</div>
<div id="WebGL-output">
</div><!-- Javascript code that runs our Three.js examples -->
<script type="text/javascript">// once everything is loaded, we run our Three.js stuff.function init() {var stats = initStats();// create a scene, that will hold all our elements such as objects, cameras and lights.var scene = new THREE.Scene();// create a camera, which defines where we're looking at.var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);// create a render and set the sizevar webGLRenderer = new THREE.WebGLRenderer();webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));webGLRenderer.setSize(window.innerWidth, window.innerHeight);webGLRenderer.shadowMapEnabled = true;var torus = createMesh(new THREE.RingGeometry());// add the sphere to the scenescene.add(torus);// position and point the camera to the center of the scenecamera.position.x = -30;camera.position.y = 40;camera.position.z = 50;camera.lookAt(new THREE.Vector3(10, 0, 0));// add the output of the renderer to the html elementdocument.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);// call the render functionvar step = 0;// setup the control guivar controls = new function () {// we need the first child, since it's a multimaterialthis.innerRadius = 0;this.outerRadius = 50;this.thetaSegments = 8;this.phiSegments = 8;this.thetaStart = 0;this.thetaLength = Math.PI * 2;this.redraw = function () {// remove the old planescene.remove(torus);// create a new onetorus = createMesh(new THREE.RingGeometry(controls.innerRadius, controls.outerRadius, controls.thetaSegments, controls.phiSegments, controls.thetaStart, controls.thetaLength));// add it to the scene.scene.add(torus);};};var gui = new dat.GUI();gui.add(controls, 'innerRadius', 0, 40).onChange(controls.redraw);gui.add(controls, 'outerRadius', 0, 100).onChange(controls.redraw);gui.add(controls, 'thetaSegments', 1, 40).step(1).onChange(controls.redraw);gui.add(controls, 'phiSegments', 1, 20).step(1).onChange(controls.redraw);gui.add(controls, 'thetaStart', 0, Math.PI * 2).onChange(controls.redraw);gui.add(controls, 'thetaLength', 0, Math.PI * 2).onChange(controls.redraw);render();function createMesh(geom) {// assign two materialsvar meshMaterial = new THREE.MeshNormalMaterial();meshMaterial.side = THREE.DoubleSide;var wireFrameMat = new THREE.MeshBasicMaterial();wireFrameMat.wireframe = true;// create a multimaterialvar mesh = THREE.SceneUtils.createMultiMaterialObject(geom, [meshMaterial, wireFrameMat]);return mesh;}function render() {stats.update();torus.rotation.y = step += 0.01;// render using requestAnimationFramerequestAnimationFrame(render);webGLRenderer.render(scene, camera);}function initStats() {var stats = new Stats();stats.setMode(0); // 0: fps, 1: msstats.domElement.style.position = 'absolute';stats.domElement.style.left = '0px';stats.domElement.style.top = '0px';document.getElementById("Stats-output").appendChild(stats.domElement);return stats;}}window.onload = init;
</script>
</body>
</html>
效果如下: