vue+threeJs 绘制3D圆形

        嗨,我是小路。今天主要和大家分享的主题是“vue+threeJs 绘制圆形”。        

今天找到一个用three.js绘制图形的项目,主要是用来绘制各种形状。

项目案例示意图

1.THREE.ShapeGeometry

定义:是 Three.js 中用于从 2D 路径形状(Shape)生成 3D 几何体的类。它非常适合用来创建复杂的 2.5D 或拉伸形状的几何体

2.启用 Wireframe

定义:"wireframe" 是一种渲染模式,以线框的形式显示几何体的边,而不是填充面。这在可视化模型结构、调试复杂几何体或创建特定视觉效果时非常有用。

3.THREE.ExtrudeGeometry

定义:用于将 2D 形状 挤压成 3D 几何体。原来的二位图如下:

参数说明

steps

分层数

depth

拉伸深度

bevelEnabled

是否倒角

bevelThickness

控制倒角的厚度

bevelSize

0 无倒角  0.5 小倒角  1 标准倒角  2.0+ 强烈倒角

bevelSegments

倒角细分段数

二、实例代码

<!--绘制各种图形-->
<template><div class="pageBox"><div class="leftBox" ref="leftRef"></div></div></template>
<script setup>
import { onMounted, onUnmounted, reactive, ref } from 'vue';
import * as THREE from 'three';
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { getRandomColor, createLight } from '../utils/commonThree';
const leftRef = ref();
// 定义相机输出画布的尺寸(单位:像素px)
let width = window.innerWidth; //宽度
let height = window.innerHeight; //高度
// 创建3D场景对象Scene
const scene = new THREE.Scene();
//设置背景色
scene.background = new THREE.Color(0x646d59);const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
//三角形缩放过大时,会形成多种三角形形成的背景图
camera.position.z = 100;// 创建渲染器对象
const renderer = new THREE.WebGLRenderer();let material;const createCircle = (color = 0xff0000, x = 0, y = 0, z = 0, rx = 0, ry = 0, rz = 0, s = 1) => {const circleRadius = 50;const shape = new THREE.Shape();shape.moveTo(0, circleRadius);shape.quadraticCurveTo(circleRadius, circleRadius, circleRadius, 0);shape.quadraticCurveTo(circleRadius, -circleRadius, 0, -circleRadius);shape.quadraticCurveTo(-circleRadius, -circleRadius, -circleRadius, 0);shape.quadraticCurveTo(-circleRadius, circleRadius, 0, circleRadius);// const geometry = new THREE.ShapeGeometry(shape,10000);const extrudeSettings = {steps: 2,           // 分层数depth: 10,           // 拉伸深度bevelEnabled: true,// 是否倒角bevelThickness: 1,//控制倒角的厚度bevelSize: 0.5,//0 无倒角  0.5 小倒角  1 标准倒角  2.0+ 强烈倒角bevelSegments: 3 //倒角细分段数};const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);material = new THREE.MeshPhongMaterial({ color: color, side: THREE.DoubleSide, wireframe: true });// material = new THREE.MeshStandardMaterial({ color: color, side: THREE.DoubleSide, wireframe: true })const circle = new THREE.Mesh(geometry, material);circle.scale.set(s, s, s);return circle;
}onMounted(() => {initData()//添加相机空间const controls = new OrbitControls(camera, renderer.domElement);controls.enableDamping = true; // 开启阻尼controls.dampingFactor = 0.02; // 设置阻尼系数controls.autoRotate = true; // 开启自动旋转// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景controls.addEventListener('change', function () {renderer.render(scene, camera); //执行渲染操作});//监听鼠标、键盘事件renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px)//将innerHTML置空,避免append重复添加渲染leftRef.value.innerHTML = ''leftRef.value.append(renderer.domElement);})const initData = () => {createLight(scene);const circle = createCircle(0x00f000, 120, 250, 0, 0, 0, 0, 1);scene.add(circle);render();
}
function render() {requestAnimationFrame(render);renderer.render(scene, camera);
}
onUnmounted(() => {//释放内存renderer.dispose();
})</script>
<style scoped lang="less">
.pageBox {width: 100%;height: 100vh;padding: 0;margin: 0;position: fixed;top: 0;left: 0;display: flex;justify-content: space-between;align-items: center;.rightBox {width: 100%;height: 100%;}
}
</style>

三、总结

       持续的刻意练习,感觉每天都有新的收获!不仅学会了如何绘制圆形,还初步掌握,如何将2D图形拉伸成3D效果。

都看到这里了,记得【点赞】+【关注】哟。

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

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

相关文章

macOS烧录stm32程序初步成功

完整总结&#xff1a;STM32H7 项目编译与烧录流程&#xff08;macOS OpenOCD/GDB&#xff09; 1️⃣ 编译工程 在项目目录下执行 make&#xff0c;生成 ELF 文件&#xff08;如 Blink.elf&#xff09;&#xff1a; cd /Users/code/Stm32code/Blink/build make clean # 可选…

正则表达式的修饰符

修饰符 修饰符不写在正则表达式里&#xff0c;标记位于表达式之外 /正则表达式/修饰符gglobal - 全局匹配 查找所有的匹配项。 i i (ignore case) - 忽略大小写 示例&#xff1a;/abc/i 可以匹配 "abc", "Abc", "ABC" 等

JS浮点数精度问题

在JavaScript开发中&#xff0c;浮点数精度问题是一个常见的陷阱。本文将深入探讨JavaScript中浮点数精度问题的原因、影响以及解决方案。 一、浮点数精度常见问题 &#xff08;一&#xff09;加法运算 console.log(0.1 0.2); // 0.30000000000000004 console.log(0.7 0.1…

本地Markdown开源知识库选型指南

本地Markdown开源知识库选型指南 以下是几款优秀的本地Markdown开源知识库解决方案&#xff0c;适合不同需求场景&#xff1a; 1. Obsidian (非完全开源但免费) 特点&#xff1a;基于Markdown的本地优先知识管理&#xff0c;丰富的插件生态优势&#xff1a;双向链接、图形视…

苏州SAP代理公司排名:工业园区企业推荐的服务商

目录 一、SAP实施商选择标准体系 1、行业经验维度 2、实施方法论维度 3、资质认证维度 4、团队实力维度 二、SAP苏州实施商工博科技 1、SAP双重认证&#xff0c;高等院校支持 2、以SAP ERP为核心&#xff0c;助力企业数字化转型 三、苏州使用SAP的企业 苏州是中国工业…

springboot项目下面的单元测试注入的RedisConnectionFactory类redisConnectionFactory值为什么为空呢?

你遇到的问题是&#xff1a; RedisConnectionFactory redisConnectionFactory 在单元测试中为 null 这是 Spring Boot 单元测试中非常常见的问题&#xff0c;根本原因是你的测试类没有启用 Spring 容器上下文&#xff0c;导致 Resource 注解无法注入 Bean。 ✅ 正确做法&…

光电学、计算机科学及算法国际会议(OCSA 2025)征稿启事​

在科技浪潮奔涌向前的当下&#xff0c;光电学、计算机科学及算法领域的创新成果不断涌现&#xff0c;持续重塑着各个行业的格局&#xff0c;深刻影响着我们的生活。为了进一步促进该领域的学术交流与合作&#xff0c;汇聚全球智慧&#xff0c;光电学、计算机科学及算法国际会议…

小样本分类新突破:QPT技术详解

问题导向式提示调优(QPT) 这篇论文主要讲了一个针对小样本(数据量少)文本分类问题的新方法,叫问题导向式提示调优(QPT)。 核心思路是让预训练语言模型(比如BERT的升级版RoBERTa)在少量标注数据下,通过设计特定的“提问式模板”和“标签词扩展技术”来提升分类效果。…

Oracle EBS 12.1 处理ISG 发布的wsdl 被请求时遇到500错误

Oracle 12.1.3 通过ISG 发布了一个服务&#xff0c;该服务在被频繁调用的时候&#xff0c;出现500 错误&#xff0c;临时解决方案是可以通过重启oafm组件解决&#xff0c;但是需要定位原因。 排查日志路径 $INST_TOP/logs/ora/10.1.3/opmn/default_group~oafm~default_group~1…

shadcn/ui

文章目录 前言✅ 核心特点&#x1f4e6; 支持组件&#xff08;常用&#xff09;&#x1f680; 安装使用&#xff08;框架支持&#xff09;初始化&#xff08;Next.js 项目为例&#xff09;添加一个组件 &#x1f9e0; 对比其他组件库&#x1f4d8; 官方资源✅ 总结✅ 功能特性&…

力扣每日一题——找到离给定两个节点最近的节点

目录 题目链接&#xff1a;2359. 找到离给定两个节点最近的节点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;双指针路径交汇法​ 基本思路 关键步骤 为什么这样可行呢我请问了&#xff1f; 举个例子 特殊情况 Java写法&#xff1a; C写法&a…

Termux可用中间人网络测试工具Xerosploit

Termux可用中间人网络测试工具Xerosploit。 Xerosploit 是一款基于 MITM 的本地网络渗透测试工具包。 食用方法&#xff1a; git clone https://github.com/LionSec/xerosploit cd xerosploit sudo python3 install.py 运行&#xff1a; sudo xerosploit 使用备注&#xff1…

vue3 导出excel

需求&#xff1a;导出自带格式的excel表格 1.自定义二维数组格式 导出 全部代码&#xff1a; <el-button click"exportExcel">导出</el-button> const exportExcel () > {const data [[商品, 单价, 数量, 总价],[A, 100, 1.55, { t: n, f: B2*C2…

【SQL】关键字

ORDER BY ORDER BY(排序) 语句可以按照一个或多个列的值进行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 MAX / MIN MAX() 函数返回一组值中的最大值。这个函数常用于数字字段&#xff0c;但也可以用于文本字段来找出按字典顺序最后的元素。 …

深度学习篇---OC-SORT实际应用效果

OC-SORT 算法在实际应用中的效果可从准确性、鲁棒性、效率三个核心维度评估,其表现与传统多目标跟踪算法(如 SORT、DeepSORT)相比有显著提升,尤其在复杂场景中优势突出。以下是具体分析: 一、准确性:目标关联更可靠 1. 遮挡场景下的 ID 保持能力 优势表现: 传统算法(…

处理知识库文件_编写powershell脚本文件_批量转换其他格式文件到pdf文件---人工智能工作笔记0249

最近在做部门知识库&#xff0c;选用的dify&#xff0c;作为rag的工具&#xff0c;但是经过多个对比&#xff0c;最后发现&#xff0c; 比较好用的是&#xff0c;纳米搜索&#xff0c;但是可惜纳米搜索无法在内网使用&#xff0c;无法把知识库放到本地&#xff0c;导致 有信息…

NSSCTF [NISACTF 2022]ezheap

2058.[NISACTF 2022]ezheap(堆溢出) [NISACTF 2022]ezheap 1.准备 2.ida分析 main函数 int __cdecl main(int argc, const char **argv, const char **envp) {char *command; // [esp8h] [ebp-10h]char *s; // [espCh] [ebp-Ch]setbuf(stdin, 0);setbuf(stdout, 0);s (cha…

微信小店推客系统达人用户管理的数据支持和便利

达人粉丝画像关联&#xff1a;系统通过技术手段&#xff0c;一定程度上获取达人粉丝的画像数据&#xff0c;如年龄分布、性别比例、地域分布、消费偏好等。运营者可以根据这些粉丝画像&#xff0c;为达人匹配更符合其粉丝需求的商品。例如&#xff0c;若某达人的粉丝以年轻女性…

LeetCode 215:数组中的第K个最大元素 - 两种高效解法详解

文章目录 问题描述解法一&#xff1a;快速选择算法&#xff08;QuickSelect&#xff09;算法思想算法步骤Java实现复杂度分析算法特点 解法二&#xff1a;最小堆&#xff08;优先队列&#xff09;算法思想算法步骤Java实现复杂度分析算法特点 两种解法比较测试示例总结 在算法面…

视频压制(Video Encoding/Compression)

视频压制是指通过特定的算法和技术&#xff0c;将原始视频文件转换为更小体积或更适合传播的格式的过程。其核心目的是在尽量保持画质的前提下&#xff0c;减少视频的文件大小&#xff0c;或适配不同播放设备、网络环境的需求。 --- ### **关键概念解析** 1. **为什么需要压制…