22. Three.js案例-创建旋转的圆环面

news2025/2/27 16:15:52

22. Three.js案例-创建旋转的圆环面

实现效果

效果

知识点

WebGLRenderer (WebGL渲染器)

THREE.WebGLRenderer 是Three.js中最常用的渲染器,用于将场景渲染到WebGL画布上。

构造器

new THREE.WebGLRenderer(parameters)

参数类型描述
parametersObject可选参数对象,用于配置渲染器。

常用参数:

  • antialias:布尔值,是否开启抗锯齿,默认为 false
  • canvas:HTMLCanvasElement,指定渲染器使用的画布,默认为自动创建。
  • context:WebGLRenderingContext,指定渲染器使用的WebGL上下文,默认为自动创建。
  • precision:字符串,指定着色器精度,可选值为 "low", "mediump", "highp",默认为 "mediump"
  • alpha:布尔值,是否透明,默认为 false
  • premultipliedAlpha:布尔值,是否使用预乘Alpha,默认为 true
  • preserveDrawingBuffer:布尔值,是否保留绘制缓冲区,默认为 false
  • depth:布尔值,是否启用深度测试,默认为 true
  • stencil:布尔值,是否启用模板测试,默认为 true
  • logarithmicDepthBuffer:布尔值,是否启用对数深度缓冲,默认为 false
  • failIfMajorPerformanceCaveat:布尔值,如果性能不佳则失败,默认为 false
方法
  • setSize(width, height, updateStyle):设置渲染器的尺寸。
  • setClearColor(color, alpha):设置渲染器的背景颜色。
  • render(scene, camera):渲染场景。

PerspectiveCamera (透视相机)

THREE.PerspectiveCamera 是Three.js中常用的透视相机,用于模拟人眼的透视效果。

构造器

new THREE.PerspectiveCamera(fov, aspect, near, far)

参数类型描述
fovNumber视野角度,以度为单位。
aspectNumber相机的宽高比。
nearNumber近裁剪面距离。
farNumber远裁剪面距离。
方法
  • position.set(x, y, z):设置相机的位置。
  • lookAt(vector):使相机看向指定的点。

Scene (场景)

THREE.Scene 是Three.js中的场景对象,用于存储所有的物体、光源和相机。

构造器

new THREE.Scene()

方法
  • add(object):将物体添加到场景中。
  • remove(object):从场景中移除物体。

AmbientLight (环境光)

THREE.AmbientLight 是Three.js中的环境光源,用于模拟环境光。

构造器

new THREE.AmbientLight(color, intensity)

参数类型描述
colorColor光源颜色。
intensityNumber光源强度,默认为 1

DirectionalLight (方向光)

THREE.DirectionalLight 是Three.js中的方向光源,用于模拟太阳光。

构造器

new THREE.DirectionalLight(color, intensity)

参数类型描述
colorColor光源颜色。
intensityNumber光源强度,默认为 1
方法
  • position.set(x, y, z):设置光源的位置。

TextureLoader (纹理加载器)

THREE.TextureLoader 用于加载纹理贴图。

构造器

new THREE.TextureLoader(manager)

参数类型描述
managerLoadingManager加载管理器,默认为 DefaultLoadingManager
方法
  • load(url, onLoad, onProgress, onError):加载纹理贴图。
  • setCrossOrigin(value):设置跨域请求标志。

MeshLambertMaterial (网格Lambert材质)

THREE.MeshLambertMaterial 是一种简单的漫反射材质,适用于不带镜面反射的表面。

构造器

new THREE.MeshLambertMaterial(parameters)

参数类型描述
parametersObject可选参数对象,用于配置材质。

常用参数:

  • color:材质颜色。
  • map:纹理贴图。
  • side:渲染面,默认为 THREE.FrontSide,可选值为 THREE.BackSideTHREE.DoubleSide

RingGeometry (圆环几何体)

THREE.RingGeometry 用于创建一个圆环几何体。

构造器

new THREE.RingGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength)

参数类型描述
innerRadiusNumber内半径。
outerRadiusNumber外半径。
thetaSegmentsNumber圆周上的分段数。
phiSegmentsNumber半径上的分段数。
thetaStartNumber开始角度,以弧度为单位。
thetaLengthNumber扇形的角度,以弧度为单位。

Mesh (网格)

THREE.Mesh 是Three.js中的网格对象,用于将几何体和材质组合在一起。

构造器

new THREE.Mesh(geometry, material)

参数类型描述
geometryGeometry几何体。
materialMaterial材质。
方法
  • position.set(x, y, z):设置网格的位置。
  • rotation.set(x, y, z):设置网格的旋转角度。

动画

requestAnimationFrame 用于请求浏览器在下一次重绘之前调用指定的函数。

方法
  • requestAnimationFrame(callback):请求浏览器在下一次重绘之前调用指定的函数。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="ThreeJS/three.js"></script>
    <script src="ThreeJS/jquery.js"></script>
</head>
<body>
<center id="myContainer"></center>
<script>
    // 创建渲染器
    var myRenderer = new THREE.WebGLRenderer({antialias: true});
    myRenderer.setSize(window.innerWidth, window.innerHeight);
    myRenderer.setClearColor('white', 1.0);
    $("#myContainer").append(myRenderer.domElement);

    // 创建相机
    var myCamera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);

    // 创建场景
    var myScene = new THREE.Scene();

    // 添加环境光
    myScene.add(new THREE.AmbientLight('yellow'));

    // 添加方向光
    var myLight = new THREE.DirectionalLight('white');
    myLight.position.set(0, 1, 0);
    myScene.add(myLight);

    // 加载纹理贴图
    var myMap = new THREE.TextureLoader().load("images/img006.jpg");
    myMap.wrapS = myMap.wrapT = THREE.RepeatWrapping;
    myMap.anisotropy = 16;

    // 创建材质
    var myMaterial = new THREE.MeshLambertMaterial({
        map: myMap,
        side: THREE.DoubleSide
    });

    // 创建圆环几何体
    var myGeometry = new THREE.RingGeometry(40, 180, 1000);

    // 创建网格
    var myMesh = new THREE.Mesh(myGeometry, myMaterial);
    myMesh.position.set(0, 0, 0);
    myScene.add(myMesh);

    // 渲染圆环面
    animate();

    function animate() {
        requestAnimationFrame(animate);
        var myTimer = Date.now() * 0.0001;
        myCamera.position.x = Math.cos(myTimer) * 400;
        myCamera.position.y = Math.cos(myTimer) * 400;
        myCamera.position.z = Math.sin(myTimer) * 400;
        myCamera.lookAt(myScene.position);
        myMesh.rotation.x = myTimer * 5;
        myMesh.rotation.y = myTimer * 3;
        myMesh.rotation.z = myTimer * 2;
        myRenderer.render(myScene, myCamera);
    }
</script>
</body>
</html>

演示链接

示例链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Burp(5)web网页端抓包与app渗透测试

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要&#xff1a;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日&#xff0c;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

java类静态初始化死锁问题

问题 前端时间帮同事分析了一个IO线程阻塞问题&#xff0c;该问题导致服务端无法处理任何请求&#xff0c;只能进行重启解决&#xff1b;事发时运维dump了下栈信息&#xff0c;堆栈信息如下图&#xff1a; 从上面可以看到io线程都阻塞于Object.wait()&#xff0c;具体是执行Cl…

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起&#xff0c;抖音电商平台迅速崛起&#xff0c;成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中&#xff0c;如何抓住机遇、实现销售增长&#xff0c;成为了每个企业面临的挑战。厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

在Windows和Ubuntu上安装SDKMAN

文章目录 1. SDKMAN概述2. 安装与使用SDKMAN2.1 在Windows上安装SDKMAN2.1.1 安装Git for Windows2.1.2 安装SDKMAN 2.2 利用SDKMAN管理Java2.2.1 查看所有可用的OpenJDK发行版2.2.2 安装Java2.2.3 查看Java版本2.2.4 shell指定使用某个Java版本 2.3 在Ubuntu上安装SDKMAN2.3.1…

1210 作业

思维导图 作业 使用read和write函数拷贝文件&#xff0c;一半拷进一个文件&#xff0c;另一半拷进另一个文件 #include <myhead.h> int main(int argc, const char *argv[]) {int fd1 open("./z1.txt",O_RDONLY);if(fd1-1){perror("open");return…

牛客网热门Java面试题及答案整理(2024最新版)

当今互联网行业中&#xff0c;Java 作为一种广泛应用的编程语言&#xff0c;对于求职者来说仍是一项受欢迎的技能。然而&#xff0c;随着市场上的开发人员数量越来越多&#xff0c;Java 面试的竞争也愈加激烈。 目前 Java 面试有着以下现状&#xff1a; 面试难度加大与过去相…

【SSH+X11】VsCode使用Remote-SSH在远程服务器的docker中打开Rviz

&#x1f680;今天来分享一下通过VsCode的Remote-SSH插件在远程服务器的docker中打开Rviz进行可视化的方法。 具体流程如下图所示&#xff0c;在操作开始前&#xff0c;请先重启设备&#xff0c;排除之前运行配置的影响&#xff1a; ⭐️ 我这里是使用主机连接服务器&#xff…

iPhone 17 Air基本确认,3个大动作

近段时间&#xff0c;果粉圈都在讨论一个尚未发布的新品&#xff1a;iPhone 17 Air&#xff0c;苹果又要来整新活了。 从供应链消息来看&#xff0c;iPhone 17 Air本质上是Plus的替代品&#xff0c;主要是在维持“大屏”这一卖点的同时&#xff0c;增加了“轻薄”属性&#xff…

浅析OCR技术与大模型的深度融合—中安未来OCR产品优势及前景探索

OCR&#xff08;光学字符识别&#xff09;技术作为一种文本识别工具&#xff0c;已在文档管理、自动化办公和图书数字化等领域发挥了重要作用。然而&#xff0c;随着深度学习和大语言模型&#xff08;LLM&#xff09;的迅猛发展&#xff0c;OCR技术迎来了新的机遇和挑战。如今&…

Android四大组件——Activity(二)

一、Activity之间传递消息 在&#xff08;一&#xff09;中&#xff0c;我们把数据作为独立的键值对进行传递&#xff0c;那么现在把多条数据打包成一个对象进行传递&#xff1a; 1.假设有一个User类的对象&#xff0c;我们先使用putExtra进行传递 activity_demo06.xml <…

STM32G4系列MCU双ADC多通道数据转换的应用

目录 概述 1 STM32Cube配置项目 1.1 基本参数配置 1.1.1 ADC1参数配置 1.1.2 ADC2参数配置 1.2 项目软件架构 2 功能实现 2.1 ADC转换初始化 2.2 ADC数据组包 3 测试函数 3.1 Vofa数据接口 3.2 输入数据 4 测试 4.1 ADC1 通道测试 4.2 ADC2 通道测试 概述 本文…

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…

constexpr、const和 #define 的比较

constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义&#xff1a;constexpr用于定义在编译期可求值的常量表达式。示例&#xff1a;constexpr int x 5;这里&#xff0c;x的值在编译期就确定为5。 const 定义&#xff1a;const表示变量在运行期间不能被修改&…

BMS电池管理系统

一.项目简介 1.该项目是基于BQ7692003PWR STM32F103C8T6研发的一块锂电池控制板&#xff0c;本控制板可供五串18650锂电池&#xff08;目前软件仅支持三元锂类型&#xff0c;标称电压为4.2V&#xff09;串联使用&#xff0c;电芯均衡采用被动均衡方式 二.本项目功能 1.监控任…