如何在three.js中画3D圆弧及半圆弧组成圆

在three.js中画圆弧以及画圆,首先会想到的是ArcCurve,这个曲线API,经过使用发现,他是一个二维平面的,也就是说只在X-Y轴组成的平面可以使用,三维坐标使用的时候不生效,比如说:我期望的圆弧是平行于X-Z这个平面,可能有时候会想到让他沿着某一个轴旋转不就好了么。经过测试发现,首先数据是XYZ的三维坐标,在XY这个平行平面绘制圆弧是二维坐标,因此一开始的位置偏移量就很大,即使计算出需要旋转的角度以及旋转轴,跟预期的效果也是不一样的。

最后经过AI辅助,选择了CatmullRomCurve3 进行圆弧的绘制。首先获取的数据是CAD之类的建模软件导出的,这类的数据画圆弧以及画圆,就和小学的时候算圆柱体表面积类似,只不过,圆柱变面积计算是把柱体部分看成是一个长方体,而这一类的是分为对称的两个,因此拿到的起止点两两一组组成的圆弧面。

这个API中需要传入的是三维坐标数组,首先在获取到的数据有两个点是起止点,通过方法

 function getFullCirclePointsFromArc(centre, start, end, segments) {// 计算半圆的半径let radius = Math.sqrt(Math.pow(start.x - centre.x, 2) + Math.pow(start.y - centre.y, 2));// 计算半圆的起始角度和结束角度let startAngle = Math.atan2(start.y - centre.y, start.x - centre.x);let endAngle = Math.atan2(end.y - centre.y, end.x - centre.x);// 确保角度是顺时针方向if (startAngle > endAngle) {[startAngle, endAngle] = [endAngle, startAngle];}// 计算完整圆的起始角度和结束角度// 如果半圆是顺时针方向,则完整圆也是顺时针方向let fullCircleStartAngle = startAngle;let fullCircleEndAngle = endAngle + Math.PI; // 半圆到完整圆需要增加180度let points = [];for (let i = 0; i <= segments; i++) {let angle = fullCircleStartAngle + (i / segments) * (fullCircleEndAngle - fullCircleStartAngle);let x = centre.x + radius * Math.cos(angle);let y = centre.y + radius * Math.sin(angle);let z = centre.z; // 假设完整圆在同一个平面points.push(new THREE.Vector3(x, y, z));}return points;}

计算出半径  起止角度 以及这两个点之间需要渲染的等分数 组成一个点数组。然后

            const segments = 50; // 曲线分段数pointsA[i] = getFullCirclePointsFromArc(linex[i].centre, linex[i].start,linex[i].end, segments);curveA[i] = new THREE.CatmullRomCurve3(pointsA[i]);curvePointsA[i] =  curveA[i].getSpacedPoints(segments);for (let j = 0; j <  curvePointsA[i].length-1; j++) {const distance =  curvePointsA[i][j].distanceTo(curvePointsA[i][j+1]);// 创建矩形几何体boxGeometryA[j] = new THREE.BoxGeometry(1, 1, distance);boxMeshA[j] = new THREE.Mesh(boxGeometryA[j], material);// 设置矩形的位置和旋转boxMeshA[j].position.copy(curvePointsA[i][j]);boxMeshA[j].lookAt(curvePointsA[i][j+1]); // 调整矩形的方向boxMeshA[j].name = "line_";blinkMaterial(material);// 将矩形网格添加到场景中scene.add(boxMeshA[j]);}

将得到的点每一个都创建一个几何体并将他们连接到一起 就绘制出了三维的圆弧 。

以上代码存在一定的BUG,画圆的时候的endAngle只正对了给出的坐标是半圆弧,其实这里应该是Math.PI*2 这样下面分割的点就不会因为平面的原因不展示了。

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

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

相关文章

巴特沃斯滤波原理及代码实现(matlab详细过程版)

目录 一、算法原理1、原理概述2、参考文献 二、代码实现三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 巴特沃斯滤波器&#xff08;Butterworth filt…

SSH功能及其在网络通信中的应用

SSH功能及其在网络通信中的应用 摘要&#xff1a; SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于在不安全的网络中提供加密的远程登录和其他网络服务。本文将详细介绍SSH的基本概念、工作原理、常用功能以及在网络通信中的应用。通过阅读本文&#…

SQLite运行时可加载扩展(三十五)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite轻量级会话扩展&#xff08;三十四&#xff09; 下一篇:SQLite的DBSTAT 虚拟表&#xff08;三十六) 1. 概述 SQLite 能够在运行时加载扩展&#xff08;包括新的应用程序定义的 SQL 函数、整理序列、虚拟表和 VFS&…

商城数据库88张表结构(十三)

DDL 49.订单ID表 CREATE TABLE wang_orderids (id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,rnd float(16,2) NOT NULL COMMENT 毫秒数,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT王——订单ID表; 50.订单表 CREATE TABLE wang_orders (orde…

Mysql-主从复制理解

环境&#xff1a;mysql&#xff0c;主从复制&#xff0c;必须有2个mysql实例&#xff0c;也就是说可以在一台电脑上安装2个msyql&#xff0c;或者2台服务器&#xff0c;一个主服务器&#xff0c;一个从服务器 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的…

Tomcat安装和配置以及多实例部署(附脚本)

TOMCAT详细部署 Tomcat服务器简介核心组件Tomcat 各组件及关系工作流程 Tomcat server.xml 配置详解serverserviceConnectorEngineHostContextValve 阀门 Tomcat部署与安装部署脚本主要目录说明 Tomcat多实例部署扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数 Tomcat服…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源&#xff08;踩坑记录版&#xff09; 此篇仅为踩坑记录&#xff0c;并未成功更换高速镜像源&#xff0c;实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

K8s容器部署maven项目

最近在整一整套devops自动化持续集成的东西&#xff0c;一开始就做好了踩坑的准备。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题&#xff0c;看了一圈首次搭建k8s的都是高频出现的问题…

Leetcode 347:前K个高频元素

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] import java.util.HashMap; import java.util.Map; impo…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集&#xff0c;非常适合刚入门的小伙伴进行学习&#xff01; 泰坦尼克号轮船的…

Redis分布式锁学习

一、单体应用&#xff0c;使用JUC包中提供的锁 问题&#xff1a;单一应用无法应对高并发场景。如果对服务进行横向扩展&#xff0c;即增加应用节点&#xff0c;然后nginx配置负载均衡的方式&#xff0c;那么单个进程里的锁无法对其他进程中的线程生效。 解决方案:基于redis的s…

基于LM Studio + LLaMA3 建立本地化的ChatGPT

4月19日&#xff0c;Facebook母公司Meta重磅推出了Llama3。即便大家现在对于大厂和巨头频繁迭代AI模型的行为已经见怪不怪&#xff0c;Meta的Llama3仍旧显得与众不同&#xff0c;因为这是迄今最强大的开源AI模型。LLaMA模型通常采用了类似于GPT&#xff08;由OpenAI开发&#x…

【Qt】error LNK2001: 无法解析的外部符号

参考&#xff1a;Qt/VS LNK2019/LNK2001&#xff1a;无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

pnpm install报错 Value of “this“ must be of type URLSearchParams

执行pnpm install的时候就报错Value of “this” must be of type URLSearchParams 由于之前执行没有出现过这个问题&#xff0c;最近在使用vue3所以使用了高版本的node&#xff0c;怀疑是node版本的问题。 解决&#xff1a; 检查node版本 node -v当前使用的是20.11.0的 修改…

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第3节(事件驱动编程)

10.3 事件驱动编程 ​ 在基于组件的程序库中&#xff08;在许多其他情况下也是如此&#xff09;&#xff0c;您编写的代码不仅仅是一连串平顺的动作序列&#xff0c;而主要是反应的集合。这意味着你应该定义应用程序在发生某些事情时做出“反应”。这里“某些事情”可以是用户…

《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录

往期 《ESP8266通信指南》6-创建TCP服务器&#xff08;AT指令&#xff09;-CSDN博客 《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客 《ESP8266通信指南》4-以Client进行TCP通信&#xff08;AT指令&#xff09;-CSDN博客 《ESP8266通信指南》3-常用AT指令详解-826…

junit组件的使用

JUnit 是一个广泛使用的 Java 单元测试框架&#xff0c;它帮助开发者编写可重复运行的测试用例来验证代码的正确性。下面是使用 JUnit 进行单元测试的基本步骤和一些关键概念&#xff1a; 安装与配置 依赖管理&#xff1a;如果你使用的是 Maven 或 Gradle 等构建工具&#xff…

OneFlow概念清单

OneFlow概念清单 摘要&#xff1a; OneFlow是一个开源的深度学习框架&#xff0c;旨在为科研人员和开发者提供一个易于使用、高效且灵活的平台。本文将详细介绍OneFlow的核心概念&#xff0c;包括其架构、特性以及在深度学习领域的应用。通过阅读本文&#xff0c;读者将能够全…

elasticsearch 常用语法汇总

文章目录 前言elasticsearch 常用语法汇总1. 创建索引2. 检索索引信息3. 删除索引4. 文档操作4.1. 对blog_new索引指定文档ID新增4.2. 对blog_new索引不指定文档ID新增&#xff0c;随机文档ID:4.3. 获取文档4.4. 更新文档4.5. 删除文档 5. 查询5.1. 匹配查询5.2. 范围查询5.3. …

HackMyVM-Vulny

目录 信息收集 arp nmap nikto WEB信息收集 主页信息收集 gobuster RCE漏洞 反弹shell 提权 系统信息收集 横向渗透 flock提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…