Three.js基础-简单几何体

本文介绍了如何使用Three.js库创建3D几何体,包括球体和立方体,并通过WebGL进行渲染。文章详细展示了从创建场景、几何对象、材质到网格模型的构建过程,同时设置了光照和相机,使3D模型在网页中得以展示。此外,还添加了动态旋转效果,增强了视觉体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Three.js简单应用

Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。

相关链接:
github链接:https://github.com/mrdoob/three.js
Three.js官网:https://threejs.org/

以下为简单几何体实现:
主要步骤:
1.创建场景对象
2.创建几何对象
3.创建网格模型对象
3.创建材质对象
4.将材质对象和几个对象添加到网格模型对象
5.将网格模型对象添加到场景
6.渲染

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="http://www.yanhuangxueyuan.com/3D/example/three.js"></script>
    <script src="http://www.yanhuangxueyuan.com/3D/example/three.min.js"></script>
  </head>
  <body>
    <script>
      /**
       * 创建场景对象Scene
       */
      var scene = new THREE.Scene();
      /**
       * 创建网格模型
       */
      var geometry = new THREE.SphereGeometry(60, 40, 40); //创建一个球体几何对象
      var material = new THREE.MeshLambertMaterial({
        color: 0x0000ff,
        opacity: 0.5,
        transparent: true,
      }); //材质对象Material
      
      var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
      mesh.translateX(100);  //几何体位置
      scene.add(mesh); //网格模型添加到场景中

      var geometry1 = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
      var mesh1 = new THREE.Mesh(geometry1, material); //网格模型对象Mesh
      mesh1.translateX(-100);  //几何体位置
      scene.add(mesh1); //网格模型添加到场景中
      
      /**
       * 光源设置
       */
      //点光源
      var point = new THREE.PointLight(0xffffff);
      point.position.set(400, 500, 300); //点光源位置
      scene.add(point); //点光源添加到场景中
      //环境光
      var ambient = new THREE.AmbientLight(0x444444);
      scene.add(ambient);
      /**
       * 相机设置
       */
      var width = window.innerWidth; //窗口宽度
      var height = window.innerHeight; //窗口高度
      var k = width / height; //窗口宽高比
      var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大
      //创建相机对象
      var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
      camera.position.set(200, 300, 500); //设置相机位置
      camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
      
      /**
       * 创建渲染器对象
       */
      var renderer = new THREE.WebGLRenderer();
      renderer.setSize(width, height); //设置渲染区域尺寸
      renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
      document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
      //执行渲染操作   指定场景、相机作为参数
      // renderer.render(scene, camera);

      let T0 = new Date(); //上次时间
      function render() {
        let T1 = new Date(); //本次时间
        let t = T1 - T0; //时间差
        T0 = T1; //把本次时间赋值给上次时间
        requestAnimationFrame(render);
        renderer.render(scene, camera); //执行渲染操作
        mesh.rotateY(0.001 * t); //旋转角速度0.001弧度每毫秒
        mesh1.rotateY(0.001 * t); //旋转角速度0.001弧度每毫秒
      }
      render();
    </script>
  </body>
</html>

在这里插入图片描述

<think>我们正在使用Three.js处理一个不规则几何体,并希望计算其半径。在Three.js中,几何体通常由顶点和面组成。对于一个不规则几何体,半径可以有多种定义方式,例如: 1. 包围球半径:能够完全包围几何体的最小球体的半径。 2. 平均半径:从几何体中心到所有顶点的距离的平均值。 3. 最大半径:从几何体中心到最远顶点的距离。 这里我们主要关注包围球半径(bounding sphere radius)和最大半径(即从中心到最远点的距离)。Three.js的`Geometry`类(在r125版本之前)和`BufferGeometry`类(当前版本)都提供了计算边界框(bounding box)和包围球(bounding sphere)的方法。 ### 步骤 1. **创建几何体**:首先,你需要有一个几何体对象(例如`THREE.BufferGeometry`)。 2. **计算包围球**:使用`computeBoundingSphere()`方法计算包围球,然后访问包围球的半径。 3. **计算最大距离(可选)**:如果你想计算从中心到最远点的距离(即最大半径),可以遍历所有顶点计算距离并取最大值。 ### 示例代码 假设我们有一个几何体`geometry`,我们可以这样计算: ```javascript // 确保几何体有顶点数据 if (!geometry.attributes.position) { console.error('Geometry has no position data.'); return; } // 方法1:使用包围球 geometry.computeBoundingSphere(); const boundingSphereRadius = geometry.boundingSphere.radius; console.log('Bounding Sphere Radius:', boundingSphereRadius); // 方法2:计算最大半径(从中心到最远点的距离) // 首先计算几何体的中心(可以使用包围球的中心,或者自己计算) // 这里我们使用包围球的中心作为参考点 const center = geometry.boundingSphere.center; const positions = geometry.attributes.position.array; let maxDistance = 0; for (let i = 0; i < positions.length; i += 3) { const x = positions[i]; const y = positions[i + 1]; const z = positions[i + 2]; const dx = x - center.x; const dy = y - center.y; const dz = z - center.z; const distance = Math.sqrt(dx * dx + dy * dy + dz * dz); if (distance > maxDistance) { maxDistance = distance; } } console.log('Maximum Radius (from center):', maxDistance); ``` ### 注意 - `computeBoundingSphere()`方法会计算一个包围球,其中心可能不是几何体的质心,而是算法确定的包围球中心。这个包围球是能够包含所有顶点的最小球体。 - 如果你需要几何体的质心(centroid),Three.js没有直接提供,但你可以通过计算所有顶点的平均值得到。 -Three.js中,通常使用包围球来快速进行视锥体裁剪等操作。 ### 相关问题 1. 如何计算不规则几何体的质心(centroid)? 2.Three.js中,除了包围球,还有哪些边界体积(bounding volume)可以使用? 3. 如何优化计算大量几何体的包围球?</think>在 Three.js 中计算不规则几何体的半径,通常需要根据具体需求选择不同的计算方式。以下是几种常见方法和实现代码: ### 1. 包围球半径(最小外接球) 这是最常用的方式,表示能完全包围几何体的最小球体半径: ```javascript const geometry = new THREE.BufferGeometry(); // 你的几何体 geometry.computeBoundingSphere(); // 计算包围球 const radius = geometry.boundingSphere.radius; console.log("包围球半径:", radius); ``` ### 2. 最大顶点距离(从中心到最远点) 适用于需要知道几何体实际最大延伸范围的情况: ```javascript geometry.computeBoundingBox(); const center = new THREE.Vector3(); geometry.boundingBox.getCenter(center); // 获取几何中心 let maxDistance = 0; const positionAttribute = geometry.getAttribute('position'); for (let i = 0; i < positionAttribute.count; i++) { const vertex = new THREE.Vector3(); vertex.fromBufferAttribute(positionAttribute, i); const distance = vertex.distanceTo(center); if (distance > maxDistance) maxDistance = distance; } console.log("最大顶点距离:", maxDistance); ``` ### 3. 平均半径 计算所有顶点到中心距离的平均值: ```javascript let totalDistance = 0; const center = new THREE.Vector3(); geometry.boundingBox.getCenter(center); for (let i = 0; i < positionAttribute.count; i++) { const vertex = new THREE.Vector3(); vertex.fromBufferAttribute(positionAttribute, i); totalDistance += vertex.distanceTo(center); } const avgRadius = totalDistance / positionAttribute.count; console.log("平均半径:", avgRadius); ``` ### 4. 自定义方向半径 当需要特定方向的半径时(如高度方向): ```javascript function getAxisRadius(geometry, axis = 'y') { geometry.computeBoundingBox(); const min = geometry.boundingBox.min; const max = geometry.boundingBox.max; return (max[axis] - min[axis]) / 2; // 返回指定轴方向的半径 } console.log("Y轴半径:", getAxisRadius(geometry, 'y')); ``` ### 注意事项 1. 对于复杂几何体,建议先调用 `geometry.computeBoundingBox()` 和 `geometry.computeBoundingSphere()` 确保边界数据已计算 2. 内存优化:处理大型几何体时,使用临时变量而非创建新对象 3. 精度:不规则几何体的 "半径" 是相对概念,需明确具体需求 4. 动态几何体:若顶点数据变化,需重新计算边界框/球 ### 性能建议 - 静态几何体:预计算并存储结果 - 动态几何体:使用 `boundingSphere.needsUpdate = true` 标记更新 - 大型网格:采用分块计算或近似算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大兵的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值