java鱼雷3的几何_Three.js几何计算Line3、Triangle、Ray、Plane

Three.js几何计算Line3、Triangle、Ray、Plane

Threejs封装了一些和几何计算相关的API,比如线段Line3、三角形Triangle、射线Ray、平面Plane...

线段Line3

通过起始点定义一条线段。

// 创建一个线段对象Line3

var line3 = new THREE.Line3();

// 线段起点坐标

line3.start = new THREE.Vector3(0, 0, 0);

// 线段终点坐标

line3.end = new THREE.Vector3(10, 10, 10);

计算线段中点,或者说计算两点的中点

// 创建一个三维向量对象表示线段中点

var center = new THREE.Vector3();

// 执行getCenter方法计算线段中点,结果保存到参数

line3.getCenter(center)

console.log('查看线段中点', center);

计算线段的距离,或者说计算两点之间的距离

// 计算线段长度

var L = line3.distance();

console.log('查看线段距离', L);

// 计算线段长度平方

var L2 = line3.distanceSq();

console.log('查看线段距离平方', L2);

可以通过向量对象Vector3的.distanceTo()方法计算两点之间距离

// 线段起点坐标

var p1 = new THREE.Vector3(0, 0, 0);

// 线段终点坐标

var p2 = new THREE.Vector3(10, 10, 10);

// Vector3的方法distanceTo()计算两点之间距离

var length = p1.distanceTo(p2)

console.log('两点之间距离', length);

射线Ray

// 创建射线对象Ray

var ray = new THREE.Ray()

// 设置射线起点

ray.origin = new THREE.Vector3(1,0,3);

// 设置射线方向

ray.direction = new THREE.Vector3(1,1,1).normalize();

通过射线Ray的.intersectTriangle()方法判断射线和一个三角形区域是否相交,如果相交返回交点坐标,不相交返回null。

// 三角形三个点坐标

var p1 = new THREE.Vector3(20, 0, 0);

var p2 = new THREE.Vector3(0, 0, 10);

var p3 = new THREE.Vector3(0, 30, 0);

// 相交返回交点,不相交返回null

var result = ray.intersectTriangle(p1,p2,p3)

console.log('查看是否相交', result);

通过射线Ray的.intersectsBox(Box3)方法判断射线和一个包围盒Box3是否相交,通过射线Ray的.intersectsSphere(Sphere)方法判断射线和一个包围球Sphere是否相交...

三角形Triangle

// 创建一个三角形对象

var Triangle = new THREE.Triangle()

// 三角形顶点1

Triangle.a = new THREE.Vector3(20, 0, 0);

// 三角形顶点2

Triangle.b = new THREE.Vector3(0, 0, 10);

// 三角形顶点3

Triangle.c = new THREE.Vector3(0, 30, 0);

通过三角形对象Triangle的.getArea()方法可以计算一个三角形区域的面积,如果你想计算一个网格模型的表面,就可以遍历网格模型对应几何体所有的三角形区域计算面积然后累加。

// .getArea()方法返回三角形面积

var S = Triangle.getArea();

console.log('三角形面积', S);

通过三角形对象Triangle的.getMidpoint()方法计算三角形重心,封装的算法就是三个顶点坐标的算术平均值。

var Midpoint = new THREE.Vector3();

// 计算三角形重心,结果保存在参数Midpoint

Triangle.getMidpoint(Midpoint);

console.log('三角形重心', Midpoint);

通过三角形对象Triangle的.getNormal()方法计算三角形法线方向,封装的算法简单说就是两条边构成的向量叉乘后获得垂直三角形面的向量。

var normal = new THREE.Vector3();

// 计算三角形法线方向,结果保存在参数normal

Triangle.getNormal(normal);

console.log('三角形法线', normal);

平面Plane

通过平面法线方向.normal和平面到坐标原点距离.constant来定义一个平面对象Plane

// 创建一个平面对象Plane

var plane = new THREE.Plane();

// 设置平面法线方向

plane.normal = new THREE.Vector3(0, 1, 0);

// 坐标原点到平面的距离,区分正负

plane.constant = 30;

执行平面对象方法.setFromCoplanarPoints(a,b,c)通过三个顶点坐标来设置一个平面对象Plane,三个点按照逆时针顺序来确定平面对象的法向量normal方向。

// 创建一个平面对象Plane

var plane = new THREE.Plane();

// 三个点坐标

var p1 = new THREE.Vector3(20, 0, 0);

var p2 = new THREE.Vector3(0, 0, 10);

var p3 = new THREE.Vector3(0, 30, 0);

// 通过三个点定义一个平面

plane.setFromCoplanarPoints(p1,p2,p3);

console.log('plane.normal', plane.normal);

console.log('plane.constant', plane.constant);

通过平面对象的.distanceToPoint(point)方法计算点到平面的垂线距离。

var point = new THREE.Vector3(20, 100, 330);

// 计算空间中一点到平面的垂直距离

var L = plane.distanceToPoint(point);

console.log('点到平面距离', L);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我之前的回答有误。Open3D的PointCloud对象确实没有`triangulate`方法。为了将点云三角化,可以使用以下代码: ```python import rospy import moveit_msgs.msg as moveit_msgs import open3d as o3d import numpy as np def point_cloud_to_scene(point_cloud_topic, camera_frame_id, scene_publisher): # Subscribe to point cloud topic point_cloud = rospy.wait_for_message(point_cloud_topic, sensor_msgs.msg.PointCloud2) # Convert point cloud to numpy array points = np.array(list(pc2.read_points(point_cloud, skip_nans=True))) # Convert numpy array to Open3D point cloud pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points) # Triangulate point cloud tri = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha=0.03) # Convert Open3D triangle mesh to MoveIt scene vertices = np.asarray(tri.vertices) triangles = np.asarray(tri.triangles) scene_msg = moveit_msgs.PlanningScene() scene_msg.is_diff = True object_msg = moveit_msgs.PlanningSceneWorld() object_msg.collision_objects.append(moveit_msgs.CollisionObject()) object_msg.collision_objects[0].id = "point_cloud" object_msg.collision_objects[0].header.frame_id = camera_frame_id object_msg.collision_objects[0].meshes.append(moveit_msgs.Mesh()) object_msg.collision_objects[0].meshes[0].vertices = [moveit_msgs.Vertex(x=vertices[i][0], y=vertices[i][1], z=vertices[i][2]) for i in range(vertices.shape[0])] object_msg.collision_objects[0].meshes[0].triangles = [moveit_msgs.Triangle(mesh.vertices[i][0], mesh.vertices[i][1], mesh.vertices[i][2]) for i in range(triangles.shape[0])] scene_msg.world.collision_objects = object_msg.collision_objects scene_publisher.publish(scene_msg) ``` 这个函数会将点云转换为Open3D的PointCloud对象,然后使用`create_from_point_cloud_alpha_shape`函数进行三角化,生成Open3D的TriangleMesh对象。接下来,将TriangleMesh对象转换为MoveIt环境scene,并发布到MoveIt Planning Scene的话题上。 请注意,这个函数需要安装Open3D库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值