Three.js给定空间两点坐标,在两坐标间做出圆柱体

写在前面:

本人南京邮电大学计算机学院大三菜鸟一枚,下面写出的方法,是自己查阅各种文档摸索出来的,记录在此。各位专业大佬多多包涵!

最近项目组有一个需求,需要在一根电线周围用圆柱体包裹作为警示区,结合自己对Three.js仅有的那么一丁点了解,我有了最开始的思路。
运用 CylinderGeometry 几何体做圆柱体,属性如下:
在这里插入图片描述
前两个参数是半径,这个可以自己定,第三个是圆柱体高度,自然就是两点间距离呗,有了这几个参数,圆柱体也就确定下来了。
接下来,就要确定圆柱体的位置。
Three.js中的几何体都是以几何中心来确定位置的,再加上一个旋转角度,通过一系列的计算(高中数学,我还去恶补了一下。。。),最终得到了想要的效果。
在这里插入图片描述在这里插入图片描述

但是,我在查看文档的时候,又发现里另外一种途径,也可以实现同样的效果。

线向量到圆柱

这个方法主要运用到了
new THREE.Vector3().subVectors( pointY, pointX );

参考:
Find specific point between 2 points - three.js
Three.js 线向量到圆柱
ThreeJS两个点作为起始坐标画一个立方体

最后附上代码:

 // 高程越界
 addSkycheck(new THREE.Vector3(0, 0, 20), new THREE.Vector3(8, 8, 15));
 
 //添加圆柱体
      function addSkycheck(start, end) {
        console.log(start);
        // 计算长度
        let dx = Math.abs(start.x - end.x);
        let dy = Math.abs(start.y - end.y);
        let dz = Math.abs(start.z - end.z);
        let width = Math.sqrt(
          Math.pow(dx, 2) + Math.pow(dy, 2) + Math.pow(dz, 2)
        );
        console.log(width);
        var cylinder = createCylinderByTwoPoints(start, end);
        scene.add(cylinder);

        //画一条直线方便观察
        var geometry3 = new THREE.Geometry();
        geometry3.vertices.push(start);
        geometry3.vertices.push(end);
        var line = new THREE.Line(
          geometry3,
          new THREE.LineBasicMaterial({
            color: "black",
          }),
          THREE.LineSegments
        );
        scene.add(line);

        // 球体
        let sphereGeometry_2_1 = new THREE.SphereGeometry(1, 100, 100);
        let sphereGeometry_2_2 = new THREE.SphereGeometry(1, 100, 100);
        let lineSegments_2_1 = new THREE.Mesh(
          sphereGeometry_2_1,
          new THREE.MeshBasicMaterial({
            color: "red",
            side: THREE.DoubleSide,
            transparent: true,
            opacity: 0.2,
          })
        );
        let lineSegments_2_2 = new THREE.Mesh(
          sphereGeometry_2_2,
          new THREE.MeshBasicMaterial({
            color: "red",
            side: THREE.DoubleSide,
            transparent: true,
            opacity: 0.2,
          })
        );

        objects.push(lineSegments_2_1);
        lineSegments_2_1.position.x = start.x;
        lineSegments_2_1.position.y = start.y;
        lineSegments_2_1.position.z = start.z;
        scene.add(lineSegments_2_1);
        objects.push(lineSegments_2_2);
        lineSegments_2_2.position.x = end.x;
        lineSegments_2_2.position.y = end.y;
        lineSegments_2_2.position.z = end.z;
        scene.add(lineSegments_2_2);
      }

      // 根据两点画圆柱
      function createCylinderByTwoPoints(pointX, pointY) {
        var direction = new THREE.Vector3().subVectors(pointY, pointX);
        var orientation = new THREE.Matrix4();
        orientation.lookAt(pointX, pointY, new THREE.Object3D().up);
        orientation.multiply(
          new THREE.Matrix4().set(
            1,0,0, 0,
            0, 0, 1, 0,
            0, -1, 0, 0,
            0, 0, 0, 1
          )
        );
        var edgeGeometry = new THREE.CylinderGeometry(
          1, 1, direction.length(), 100, 100
        );
        var material = new THREE.MeshLambertMaterial({
          color: "red",
          side: THREE.DoubleSide,
          transparent: true,
          opacity: 0.2,
        });
        var edge = new THREE.Mesh(edgeGeometry, material);
        edge.applyMatrix4(orientation);
        //两个点的中心点 position based on midpoints - there may be a better solution than this
        edge.position.x = (pointY.x + pointX.x) / 2;
        edge.position.y = (pointY.y + pointX.y) / 2;
        edge.position.z = (pointY.z + pointX.z) / 2;
        return edge;
      }

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NJR10byh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值