首页 > 其他分享 >three.js教程_01认识基本元素

three.js教程_01认识基本元素

时间:2024-12-04 17:59:14浏览次数:6  
标签:01 const THREE three window new js 3D

视野角度示例:使用 Three.js 创建 3D 场景

在这篇文章中,我们将通过使用 Three.js 库来创建一个简单的 3D 场景,演示如何通过相机的视野角度设置、3D 对象的旋转、以及交互式操作来展示 3D 图形。Three.js 是一个非常流行的 3D 图形渲染库,它利用 WebGL 技术使得在浏览器中渲染 3D 图形成为可能。

目录

  1. 引言
  2. 功能演示
  3. 代码实现
  4. 代码解析
  5. 参考资源

引言

本文展示了如何使用 Three.js 创建一个简单的 3D 场景,并在场景中加入立方体对象,同时通过设置不同的视野角度来控制摄像机的视角。通过 OrbitControls,我们还可以使得用户与场景进行交互,实时调整视角。

功能演示

在该示例中,我们实现了以下功能:

  • 创建一个 3D 场景,并加入一个立方体。
  • 使用相机的视野角度(FOV,Field of View)来控制视野范围。
  • 在场景中添加坐标轴和文本标签,标明 X、Y、Z 轴。
  • 使用 OrbitControls 控制器允许用户通过拖动鼠标来旋转视图。

代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>视野角度示例</title>
    <style>
        body {
            margin: 0;
        }
        canvas {
            display: block; /* 去除 canvas 的默认边距 */
        }
    </style>
</head>
<body>
<script type="importmap">
    {
        "imports": {
            "three": "../build/three.module.js",
            "three/addons/": "./jsm/"
        }
    }
</script>
<script type="module">
    import * as THREE from 'three';
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

    // 场景、相机、渲染器
    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // 立方体与坐标轴
    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    cube.position.set(5, 3, 1);
    scene.add(cube);
    const axesHelper = new THREE.AxesHelper(5);
    scene.add(axesHelper);

    // 创建文本标签
    function createTextLabel(text, position) {
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        context.font = '32px Arial';
        context.fillStyle = 'white';
        context.fillText(text, 0, 32);
        const texture = new THREE.CanvasTexture(canvas);
        const spriteMaterial = new THREE.SpriteMaterial({ map: texture });
        const sprite = new THREE.Sprite(spriteMaterial);
        sprite.position.copy(position);
        return sprite;
    }

    const xLabel = createTextLabel('X', new THREE.Vector3(5.5, 0, 0));
    const yLabel = createTextLabel('Y', new THREE.Vector3(0, 5.5, 0));
    const zLabel = createTextLabel('Z', new THREE.Vector3(0, 0, 5.5));
    scene.add(xLabel);
    scene.add(yLabel);
    scene.add(zLabel);

    // OrbitControls 控制器
    const controls = new OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true;
    controls.dampingFactor = 0.25;
    controls.screenSpacePanning = false;

    // 动画循环
    function animate() {
        requestAnimationFrame(animate);
        controls.update();
        cube.rotation.x += 0.01;
        cube.rotation.y += 0.01;
        renderer.render(scene, camera);
    }
    animate();

    // 自适应窗口大小
    window.addEventListener('resize', () => {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
    });
</script>
</body>
</html>

代码解析

1. 创建场景与相机

场景 (Scene):const scene = new THREE.Scene(); 用来存放和管理所有的 3D 对象、光源等。
相机 (PerspectiveCamera):const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); 这里设置了相机的视野角度为 75,视角越大,视野越宽。纵横比由 window.innerWidth / window.innerHeight 控制,确保浏览器窗口的比例。

2. 渲染器设置

渲染器 (WebGLRenderer):const renderer = new THREE.WebGLRenderer(); 渲染器将 3D 场景转换为 2D 图像,并显示在页面上。renderer.setSize(window.innerWidth, window.innerHeight) 设置了渲染器的大小,以适应整个浏览器窗口。

3. 立方体与坐标轴

通过 THREE.BoxGeometry 创建一个立方体,并用 MeshBasicMaterial 为其上色。scene.add(cube) 将立方体加入场景。
使用 THREE.AxesHelper 创建一个简单的坐标轴,帮助用户直观了解 3D 场景中的方向。

4. 文本标签

createTextLabel 函数通过绘制文本到 canvas 上,再用 CanvasTexture 将其转化为材质,最终生成带有标签的 3D 精灵对象,显示在 X、Y、Z 坐标轴上。

5. 动画与交互

动画:使用 requestAnimationFrame(animate) 来创建一个动画循环,确保每次渲染更新立方体的旋转。
交互控制:通过 OrbitControls 来实现用户用鼠标控制视角,启用惯性和平滑拖动。

6. 响应式布局

监听 resize 事件,确保在窗口大小变化时,相机和渲染器能够自动调整,以保持合适的视图比例。
总结
本文通过一个完整的示例,展示了如何使用 Three.js 创建一个简单的 3D 场景。在此基础上,你可以尝试添加更多复杂的几何体、光源或纹理,进一步探索 WebGL 的强大功能。

参考资源

Three.js 官方文档
WebGL 学习资源
Three.js 示例

标签:01,const,THREE,three,window,new,js,3D
From: https://blog.csdn.net/w131552/article/details/144245919

相关文章

  • ASR6601 是完整意义的 LPWAN SOC 无线通信 LORA 射频收发器芯片
    ASR6601是完整意义的LPWANSOC无线通信芯片,该芯片集成了LORA射频收发器、调制解调器和32位RISCMCU。MUC采用cortexM4,频率48mhz。LORA射频收发器从150MHz到960MHz连续频率覆盖。调制解调器支持LPWAN用例的LoRa调制和传统的(G)FSK调制。调制解调器还支持在发......
  • MVC Angularjs Vue Javascript 显示图片
    以前写随笔,均是一篇一篇来分享,这篇现算是集结。在MVC,angularjs,Vue.js或者Javascript显示用户上传的图片。本月份以来,Insus.NET有写过,C#mvc+axios+webapi+javascripthttps://www.cnblogs.com/insus/p/18577591asp.netmvc视图传递数据至另一页的视图https://www.cnblogs.......
  • js.重排链表
    链接:143.重排链表-力扣(LeetCode)题目:给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例......
  • Nodejs Express.js 快速入门(详细流程)
    一、简介安装nodejs,推荐使用nvm管理安装。二、创建项目(方式一:空项目手动创建)新建项目文件夹express-demo,cd进入文件夹后,使用命令创建package.json文件:#进入项目文件夹执行下面初始化命令,二选一即可,反正创建了可以后期调整的$cdexpress-demo#方式一:需要......
  • Three.js入门-相机控制器
    Three.js入门-相机控制器概念介绍在开始前,我们先看一下效果,我在场景中创建了一个立方体,当我们点击鼠标左键并拖动时,可以旋转相机视角,滚动鼠标滚轮可以缩放相机视角。相信看了动图效果,大家对相机控件有了一个直观的认识。它是Three.js中用于控制相机的工具,可以帮助用户在3......
  • Task 05&拓展 01
    拓展01代码风格与规范01.1代码风格各类标识符在Python中,标识符(identifier)是⽤于命名变量、函数、类、模块或其他对象的名称。选择合适的标识符名称有助于提⾼代码的可读性和可维护性。命名规则:必须以字⺟(a-z,A-Z)或下划线(_)开头只允许出现英⽂字⺟、数字、下划线对⼤......
  • AT_jsc2019_qual_c Cell Inversion
    算法场上也是把所有需要的性质全部都推出来了,但是计数类型的底子太差,直接也是没把答案式子表示出来啊容易的,我们可以知道,对于一个长度为\(n\)的序列,其中每一个\([l_i,r_i]\)确定,那么不管怎样排列,最终都是合法的我们还可以知道,如果每一个点,作为左端点还......
  • Windows11中安装SQL Server 2019
    介绍MicrosoftSQLServer是一种关系数据库管理系统(RDBMS)。应用程序和工具连接到SQLServer实例或数据库,并使用Transact-SQL(T-SQL)进行通信。SQLServerManagementStudio(SSMS)是一种集成环境,用于管理任何SQL基础结构。使用SSMS访问、配置、管理和开发SQL......
  • Task 01&02
    Task01pyinstallation安装Python3.12环境变量的配置创建并激活conda环境教程Datawhale芝士一个管理py环境的工具,可以创建一个虚拟环境个人方法:在thu开源镜像站下滑找到最近Anaconda安装包并下载,根据教程完成安装配置。Task02GettingStartedpython学习准备和......
  • 松下机器人示教器AUR01062触摸无反维修
        Panasonic松下机器人示教器AUR01062触摸无反应解决方案松下机器人示教器现象:触摸屏幕时鼠标箭头无任何动作,没有发生位置改变。原因:造成此现象产生的原因很多,下面就松下机器人维修中示教器触摸无反应原因逐个说明:①表面声波触摸屏四周边上的声波反射条纹......