【Three】前端从零开始学习 threejs:创建第一个 threejs3D 页面

课程和学习大纲

对应的课程在这里:Threejs教程、2023最新最全最详细Threejs教程、零基础Threejs最详细教程(已完结)

学习知识要点思维导图:
在这里插入图片描述

官网和文档的使用

three.js 官网
在这里插入图片描述
如果无法访问,可以下载国内大佬的镜像跑起来就行 threejs-code-public
在这里插入图片描述
npm i 下载依赖后启动 npm run start 启动就可以啦!

在这里插入图片描述

官方编辑器直接点击,后续拿来做测试使用。
在这里插入图片描述

创建第一个 threejs3D 页面

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>My first three.js app</title>
    <style>
      body {
        margin: 0;
      }
    </style>
  </head>
  <body>
    <script type="module">
      import * as THREE from 'https://unpkg.com/three/build/three.module.js';

      // Our Javascript will go here.
      // 创建场景:场景是所有物体的容器
      const scene = new THREE.Scene();
      // 创建相机:相机是用户眼睛
      const camera = new THREE.PerspectiveCamera(); // 透视相机
      // 调整相机位置
      camera.position.z = 10; // 将相机向后移动10个单位
      camera.position.y = 5; // 将相机向上移动5个单位

      // 创建一个立方体:BoxGeometry 是一个立方体的几何体
      const geometry = new THREE.BoxGeometry();
      // 创建一个材质:MeshBasicMaterial是一种简单的材质,不受光照影响
      const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

      // 创建一个立方体网格:Mesh是一个物体,它由几何体和材质组成
      const cube = new THREE.Mesh(geometry, material);
      cube.position.set(0, 3, 0);
      // 将立方体网格添加到场景中
      scene.add(cube);

      // 创建渲染器:渲染器将场景和相机渲染到画布上
      const renderer = new THREE.WebGLRenderer();
      // 在页面中添加渲染器
      document.body.appendChild(renderer.domElement);
      // 设置渲染器的大小
      renderer.setSize(window.innerWidth, window.innerHeight);

      // 添加网格地面
      const gridHelper = new THREE.GridHelper(10, 10);
      scene.add(gridHelper);

      // 调用渲染
      renderer.render(scene, camera);

      // 创建一个动画
      function animate() {
        requestAnimationFrame(animate); // requestAnimationFrame: 浏览器会在下一次重绘之前调用指定的回调函数
        // 使立方体网格旋转
        // cube.rotation.x += 0.01;
        cube.rotation.y += 0.01;
        // 调用渲染
        renderer.render(scene, camera);
      }
      animate();
    </script>
  </body>
</html>

在这里插入图片描述

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用three.js创建3D饼图并为每个扇区添加标签和引导线,需要进行以下步骤: 1. 创建一个圆形几何体,并将其细分为所需的扇区数。可以使用Three.js的THREE.CircleGeometry类来创建这个几何体。 2. 根据每个扇区的数值计算它在饼图中的角度,并将几何体的顶点转换为3D坐标。 3. 为每个扇区创建一个材质,并设置不同的颜色。 4. 将几何体和材质组合成一个网格,并将其添加到场景中。 5. 为每个扇区创建一个标签和引导线。可以使用Three.js的THREE.TextGeometry类创建标签文本,然后将其转换为网格并添加到场景中。可以使用THREE.Line类创建引导线,并将其添加到场景中。 6. 将标签和引导线的位置设置为与饼图扇区的中心点相同,并旋转它们以使它们与扇区对齐。 7. 将场景渲染到画布上。 这是一份简单的示例代码,可以用作参考: ```javascript //创建一个圆形几何体 var geometry = new THREE.CircleGeometry(5, 32); //根据数值计算扇区角度 var angles = [30, 50, 80]; //示例数据 var totalAngle = angles.reduce(function(a, b) { return a + b; }, 0); var angleOffset = -Math.PI / 2; //使0度方向指向右侧 for (var i = 0; i < angles.length; i++) { var angle = angles[i] / totalAngle * Math.PI * 2; for (var j = 0; j <= 32; j++) { var vertexIndex = i * 33 + j; var x = Math.cos(angleOffset + angle * j / 32) * 5; //半径为5 var y = Math.sin(angleOffset + angle * j / 32) * 5; geometry.vertices[vertexIndex].x = x; geometry.vertices[vertexIndex].y = y; } } //创建材质 var material1 = new THREE.MeshBasicMaterial({ color: 0xff0000 }); var material2 = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); var material3 = new THREE.MeshBasicMaterial({ color: 0x0000ff }); //将几何体和材质组合成网格 var mesh1 = new THREE.Mesh(geometry, material1); var mesh2 = new THREE.Mesh(geometry, material2); var mesh3 = new THREE.Mesh(geometry, material3); scene.add(mesh1); scene.add(mesh2); scene.add(mesh3); //创建标签 var fontLoader = new THREE.FontLoader(); fontLoader.load('fonts/helvetiker_regular.typeface.json', function(font) { var label1 = createLabel('Label 1', font); var label2 = createLabel('Label 2', font); var label3 = createLabel('Label 3', font); scene.add(label1); scene.add(label2); scene.add(label3); //将标签位置设置为与饼图扇区中心点相同 label1.position.x = Math.cos(angleOffset + angles[0] / 2 / totalAngle * Math.PI * 2) * 5; label1.position.y = Math.sin(angleOffset + angles[0] / 2 / totalAngle * Math.PI * 2) * 5; label2.position.x = Math.cos(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / 2 / totalAngle * Math.PI * 2) * 5; label2.position.y = Math.sin(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / 2 / totalAngle * Math.PI * 2) * 5; label3.position.x = Math.cos(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 + angles[2] / 2 / totalAngle * Math.PI * 2) * 5; label3.position.y = Math.sin(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 + angles[2] / 2 / totalAngle * Math.PI * 2) * 5; //旋转标签使其与扇区对齐 label1.rotation.z = angleOffset + angles[0] / totalAngle * Math.PI * 2 / 2; label2.rotation.z = angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 / 2; label3.rotation.z = angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 + angles[2] / totalAngle * Math.PI * 2 / 2; }); //创建引导线 var lineMaterial = new THREE.LineBasicMaterial({ color: 0xffffff }); var line1 = new THREE.Line(new THREE.Geometry(), lineMaterial); var line2 = new THREE.Line(new THREE.Geometry(), lineMaterial); var line3 = new THREE.Line(new THREE.Geometry(), lineMaterial); scene.add(line1); scene.add(line2); scene.add(line3); //设置引导线顶点位置 line1.geometry.vertices.push(new THREE.Vector3(0, 0, 0)); line1.geometry.vertices.push(new THREE.Vector3(Math.cos(angleOffset + angles[0] / 2 / totalAngle * Math.PI * 2) * 5, Math.sin(angleOffset + angles[0] / 2 / totalAngle * Math.PI * 2) * 5, 0)); line2.geometry.vertices.push(new THREE.Vector3(0, 0, 0)); line2.geometry.vertices.push(new THREE.Vector3(Math.cos(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / 2 / totalAngle * Math.PI * 2) * 5, Math.sin(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / 2 / totalAngle * Math.PI * 2) * 5, 0)); line3.geometry.vertices.push(new THREE.Vector3(0, 0, 0)); line3.geometry.vertices.push(new THREE.Vector3(Math.cos(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 + angles[2] / 2 / totalAngle * Math.PI * 2) * 5, Math.sin(angleOffset + angles[0] / totalAngle * Math.PI * 2 + angles[1] / totalAngle * Math.PI * 2 + angles[2] / 2 / totalAngle * Math.PI * 2) * 5, 0)); ``` 其中,createLabel()函数可以用来创建标签网格。它接受一个字符串和字体对象作为参数,并返回一个THREE.Mesh对象。例如: ```javascript function createLabel(text, font) { var geometry = new THREE.TextGeometry(text, { font: font, size: 0.5, height: 0.1 }); var material = new THREE.MeshBasicMaterial({ color: 0xffffff }); var mesh = new THREE.Mesh(geometry, material); mesh.rotation.x = -Math.PI / 2; //使其垂直于屏幕 return mesh; } ``` 这只是一个非常基础的示例,你需要根据自己的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值