29. Three.js案例-自定义平面图形

29. Three.js案例-自定义平面图形

实现效果

效果

知识点

WebGLRenderer

WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。

构造器

THREE.WebGLRenderer(parameters : object)

参数类型描述
parametersobject可选参数对象,用于配置渲染器的各种属性。

常用参数:

  • antialias:布尔值,是否开启抗锯齿,默认为 false
  • alpha:布尔值,是否允许透明背景,默认为 false
  • preserveDrawingBuffer:布尔值,是否保留绘图缓冲区,默认为 false
方法
  • setSize(width : integer, height : integer): 设置渲染器的尺寸。
  • setClearColor(color : Color, alpha : float): 设置渲染器的背景颜色。

Scene

Scene 是 Three.js 中用于存储和管理所有 3D 对象的容器。

构造器

THREE.Scene()

PointLight

PointLight 是 Three.js 中的一种光源,模拟点光源的效果。

构造器

THREE.PointLight(color : Color, intensity : float, distance : float, decay : float)

参数类型描述
colorColor光源的颜色。
intensityfloat光源的强度,默认为 1
distancefloat光源影响的最大距离,默认为 0,表示无限远。
decayfloat光源衰减系数,默认为 1

PerspectiveCamera

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

构造器

THREE.PerspectiveCamera(fov : float, aspect : float, near : float, far : float)

参数类型描述
fovfloat视野角度,单位为度。
aspectfloat相机的宽高比。
nearfloat近裁剪面距离。
farfloat远裁剪面距离。

Shape

Shape 是 Three.js 中用于创建自定义平面图形的类。

构造器

THREE.Shape(points : Array)

参数类型描述
pointsArray一系列 Vector2 对象,表示图形的路径点。
方法
  • moveTo(x : float, y : float): 移动到指定的起始点。
  • lineTo(x : float, y : float): 从当前点绘制直线到指定点。
  • bezierCurveTo(cp1x : float, cp1y : float, cp2x : float, cp2y : float, x : float, y : float): 绘制三次贝塞尔曲线。
  • quadraticCurveTo(cpx : float, cpy : float, x : float, y : float): 绘制二次贝塞尔曲线。
  • splineThru(pts : Array): 绘制通过指定点的样条曲线。
  • absarc(x : float, y : float, radius : float, startAngle : float, endAngle : float, clockwise : boolean): 绘制椭圆或圆弧。

Path

Path 是 Three.js 中用于创建路径的类,常用于绘制复杂的图形。

构造器

THREE.Path(points : Array)

参数类型描述
pointsArray一系列 Vector2 对象,表示路径的点。
方法

absellipse(x : float, y : float, xRadius : float, yRadius : float, startAngle : float, endAngle : float, anticlockwise : boolean):
绘制椭圆。

ExtrudeGeometry

ExtrudeGeometry 是 Three.js 中用于创建拉伸几何体的类。

构造器

THREE.ExtrudeGeometry(shapes : Shape or Array, options : object)

参数类型描述
shapesShape or Array一个或多个 Shape 对象。
optionsobject配置选项对象。

常用选项:

  • depth: 拉伸深度,默认为 100
  • bevelEnabled: 是否启用倒角,默认为 true
  • bevelThickness: 倒角厚度,默认为 6
  • bevelSize: 倒角大小,默认为 2
  • bevelOffset: 倒角偏移,默认为 0
  • bevelSegments: 倒角段数,默认为 3
  • extrudePath: 拉伸路径,可以是一个 Curve 对象。

Mesh

Mesh 是 Three.js 中用于创建网格对象的类,通常由几何体和材质组成。

构造器

THREE.Mesh(geometry : Geometry, material : Material)

参数类型描述
geometryGeometry几何体对象。
materialMaterial材质对象。
方法
  • translateX(amount : float): 沿 X 轴移动指定距离。
  • translateY(amount : float): 沿 Y 轴移动指定距离。
  • translateZ(amount : float): 沿 Z 轴移动指定距离。
  • scale(x : float, y : float, z : float): 缩放对象。

OrbitControls

OrbitControls 是 Three.js 中用于控制相机旋转、缩放和平移的控件。

构造器

THREE.OrbitControls(object : Camera, domElement : HTMLElement)

参数类型描述
objectCamera控制的相机对象。
domElementHTMLElement控件绑定的 DOM 元素。

动画

requestAnimationFrame 是浏览器提供的用于请求动画帧的方法,常用于实现平滑的动画效果。

方法
  • requestAnimationFrame(callback : function): 请求下一个动画帧。

代码

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><script src="ThreeJS/three.js"></script><script src="ThreeJS/jquery.js"></script><script src="ThreeJS/OrbitControls.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 myScene = new THREE.Scene();// 创建点光源var myPointLight = new THREE.PointLight('white');myPointLight.position.set(320, 200, 400);myScene.add(myPointLight);// 创建相机var myCamera = new THREE.PerspectiveCamera(45, 1, 1, 1000);myCamera.position.set(200, 200, 200);myCamera.up.x = -1;myCamera.up.y = 1;myCamera.up.z = -1;myCamera.lookAt({x: 0, y: 0, z: 0});// 绘制自定义平面图形var myShape = new THREE.Shape();myShape.moveTo(20, 10);myShape.lineTo(20, 40);myShape.bezierCurveTo(15, 25, -5, 25, -30, 40);myShape.splineThru([new THREE.Vector2(-22, 30), new THREE.Vector2(-18, 20), new THREE.Vector2(-20, 10)]);myShape.quadraticCurveTo(0, -15, 20, 10);// 绘制椭圆(眼睛)var myAbsellipse1 = new THREE.Path();myAbsellipse1.absellipse(6, 20, 2, 3, 0, Math.PI * 2, true);myShape.holes.push(myAbsellipse1);var myAbsellipse2 = new THREE.Path();myAbsellipse2.absellipse(-10, 20, 2, 3, 0, Math.PI * 2, true);myShape.holes.push(myAbsellipse2);// 绘制半圆弧(嘴巴)var myAbsarc = new THREE.Path();myAbsarc.absarc(0, 5, 2, 0, Math.PI, true);myShape.holes.push(myAbsarc);// 设置在 y 轴方向拉伸图形var myCurve = new THREE.CatmullRomCurve3([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 1, 0)]);// 创建拉伸之后的平面图形var myGeometry = new THREE.ExtrudeGeometry(myShape, {extrudePath: myCurve});var myMaterial = new THREE.MeshPhongMaterial({color: 'cyan'});var myMesh = new THREE.Mesh(myGeometry, myMaterial);myMesh.translateX(-50);myMesh.translateZ(-200);myMesh.translateY(-150);myMesh.scale.y = 6;myMesh.scale.x = 6;myMesh.scale.z = 6;myScene.add(myMesh);// 渲染自定义平面图形animate();function animate() {myRenderer.render(myScene, myCamera);requestAnimationFrame(animate);}// 创建轨道控制器var myOrbitControls = new THREE.OrbitControls(myCamera);
</script>
</body>
</html>

演示链接

示例链接

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

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

相关文章

大模型运用-Prompt Engineering(提示工程)

什么是提示工程 提示工程 提示工程也叫指令工程&#xff0c;涉及到如何设计、优化和管理这些Prompt&#xff0c;以确保AI模型能够准确、高效地执行用户的指令&#xff0c;如&#xff1a;讲个笑话、java写个排序算法等 使用目的 1.获得具体问题的具体结果。&#xff08;如&…

MTK Android12 更换开机LOGO和开机动画

1、路径&#xff1a; &#xff08;1&#xff09;device/mediatek/system/common/device.mk &#xff08;2&#xff09;vendor/audio-logo/animation/bootanimation.zip &#xff08;3&#xff09;vendor/audio-logo/products/resource-copy.mk &#xff08;4&#xff09;vendo…

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于ALSA驱动框架过于复杂&#xff0c;实现音频编解码芯片的驱动不是一个人能完成的&#xf…

learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)

1.父子组件u-search &#xff08;1&#xff09;父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…

计算机进制的介绍

一.进制介绍 对于整数&#xff0c;有四种表示方式: 1&#xff09;二进制:0,1&#xff0c;满2进1。 在golang中&#xff0c;不能直接使用二进制来表示一个整数&#xff0c;它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

Transformers参数高效微调之LoRA

简介 LoRA: Low-Rank Adaptation of Large Language Models是微软研究人员为处理微调大语言模型的问题而引入的一项新技术。具有数十亿个参数的强大模型&#xff08;例如 GPT-3&#xff09;为了适应特定任务或领域而进行微调的成本非常高。LoRA 建议冻结预先训练的模型权重并注…

【原生js案例】如何让你的网页实现图片的按需加载

按需加载&#xff0c;这个词应该都不陌生了。我用到你的时候&#xff0c;你才出现就可以了。对于一个很多图片的网站&#xff0c;按需加载图片是优化网站性能的一个关键点。减少无效的http请求&#xff0c;提升网站加载速度。 感兴趣的可以关注下我的系列课程【webApp之h5端实…

博弈论1:拿走游戏(take-away game)

假设你和小红打赌&#xff0c;玩“拿走游戏”&#xff0c;输的人请对方吃饭.... 你们面前有21个筹码&#xff0c;放成一堆&#xff1b;每轮你或者小红可以从筹码堆中拿走1个/2个/3个&#xff1b;第一轮你先拿&#xff0c;第二轮小红拿&#xff0c;你们两个人交替进行;拿走筹码堆…

【论文阅读】IC-Light(ICLR 2025 满分论文)

Scaling In-the-Wild Training for Diffusion-based Illumination Harmonization and Editing by Imposing Consistent Light Transport 原始论文&#xff1a;https://openreview.net/pdf?idu1cQYxRI1H 补充材料&#xff1a;https://openreview.net/attachment?idu1cQYxRI1H&…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

记一个framebuffer显示混乱的低级错误

记一个framebuffer显示混乱的低级错误 由于framebuffer的基础知识不扎实&#xff0c;这个任务上我多卡了两天&#xff0c;差点把我搞死&#xff0c;于此记录为后鉴。 打算用awtk做一个多进程项目&#xff0c;计划把framebuffer的内容通过websocket输出到浏览器上去显示画面, …

常用的前端框架介绍

在前端开发中&#xff0c;有许多流行的框架能够帮助开发者更高效地构建用户界面和交互 1. React&#xff1a; • React是一个由Facebook开发的JavaScript库&#xff0c;用于构建用户界面。 • 它使用组件化的思想&#xff0c;将UI拆分成可复用的组件&#xff0c;每个组件都有自…

Kaggler日志-Day4

进度24/12/14 昨日复盘&#xff1a; Pandas课程完成 Intermediate Mechine Learning2/7 今日记录&#xff1a; Intermediate Mechine Learning之类型变量 读两篇讲解如何提问的文章&#xff0c;在提问区里发起一次提问 实战&#xff1a;自己从头到尾首先Housing Prices Compe…

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行&#xff0c;所以更新一旦开始&#xff0c;中途就无法中断。当层级很深时&#xff0c;递归更新时间超过了 16ms&#xff0c;用户交互就会卡顿。对于特别庞…

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口&#xff08;如Taobao.item_get&#xff09;允许开发者通过编程方式&#xff0c;以JSON格式实时获取淘宝商品的详细信息&#xff0c;包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

通过ajax的jsonp方式实现跨域访问,并处理响应

一、场景描述 现有一个项目A&#xff0c;需要请求项目B的某个接口&#xff0c;并根据B接口响应结果A处理后续逻辑。 二、具体实现 1、前端 前端项目A发送请求&#xff0c;这里通过jsonp的方式实现跨域访问。 $.ajax({ url:http://10.10.2.256:8280/ssoCheck, //请求的u…

Unity 沿圆周创建Sphere

思路 取圆上任意一点连接圆心即为半径&#xff0c;以此半径为斜边作直角三角形。当已知圆心位置与半径长度时&#xff0c;即可得该点与圆心在直角三角形两直角边方向上的位置偏移&#xff0c;从而得出该点的位置。 实现 核心代码 offsetX radius * Mathf.Cos(angle * Mathf…