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


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

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

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

    1. function getFullCirclePointsFromArc(centre, start, end, segments) {
    2. // 计算半圆的半径
    3. let radius = Math.sqrt(Math.pow(start.x - centre.x, 2) + Math.pow(start.y - centre.y, 2));
    4. // 计算半圆的起始角度和结束角度
    5. let startAngle = Math.atan2(start.y - centre.y, start.x - centre.x);
    6. let endAngle = Math.atan2(end.y - centre.y, end.x - centre.x);
    7. // 确保角度是顺时针方向
    8. if (startAngle > endAngle) {
    9. [startAngle, endAngle] = [endAngle, startAngle];
    10. }
    11. // 计算完整圆的起始角度和结束角度
    12. // 如果半圆是顺时针方向,则完整圆也是顺时针方向
    13. let fullCircleStartAngle = startAngle;
    14. let fullCircleEndAngle = endAngle + Math.PI; // 半圆到完整圆需要增加180度
    15. let points = [];
    16. for (let i = 0; i <= segments; i++) {
    17. let angle = fullCircleStartAngle + (i / segments) * (fullCircleEndAngle - fullCircleStartAngle);
    18. let x = centre.x + radius * Math.cos(angle);
    19. let y = centre.y + radius * Math.sin(angle);
    20. let z = centre.z; // 假设完整圆在同一个平面
    21. points.push(new THREE.Vector3(x, y, z));
    22. }
    23. return points;
    24. }

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

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

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

  • 相关阅读:
    SELECT * from t_user where user_id = xxx,可以从那几个点去优化这句sql
    编程示例:蔡勒公式计算某一天是星期几 公式来源于1886年
    拜托,使用Three.js让二维图片具有3D效果超酷的好吗 💥
    重构技战术(一)——通用型重构技巧
    11.多进程与多线程
    GIS数据获取:气象数据免费下载网站
    wifi指纹室内定位系统 计算机竞赛
    【IoT NTN】3GPP R18中关于各类IoT设备在NTN中的增强和扩展
    【开发小记】vue项目打包可视化
    数据通信网络之IPv6以太网多层交换
  • 原文地址:https://blog.csdn.net/weixin_43666952/article/details/138144615