当前位置: 首页 > news >正文

长沙优化网站推广株洲网站建设技术公司

长沙优化网站推广,株洲网站建设技术公司,邢台地区网站建设服务周到,深圳企业排行榜目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统#xff1a;win11rust版本#xff1a;rustc 1.77.0-nightlybevy版本#xff1a;0.12 问题提出 在three.js中#xff0c;可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeo… 目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统win11rust版本rustc 1.77.0-nightlybevy版本0.12 问题提出 在three.js中可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeometry } from three/addons/geometries/ConvexGeometry.js;例如 const geometry new ConvexGeometry( points ); const material new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); const mesh new THREE.Mesh( geometry, material ); scene.add( mesh );但是在bevy中如何实现呢 Rapier 在当前bevy的版本中并没有类似的实现目前支持的shape也比three.js少 BoxCapsuleCircleCubeCylinderIcospherePlaneQuadRegularPolygonTorusUVSphere 所以如果要构造ConvexHull只能借助第三方库或者自己实现可以参考three.js实现这里我们借助一个物理库rapier来实现关于rapier 这里 具体实现 首先我们通过点集构造ConvexHullrapier可以直接完成这一步 let collider Collider::convex_hull(points);但是该方法构造的是一个Collider实际上是无法直接当成Mesh使用的 然后我们将其转换成ConvexPolyhedron let convex c.as_convex_polyhedron().unwrap();该结构中包含一个凸包的所有属性例如点、边、面等事实上它提供了一个方法能够直接转换成TriangleMesh所需要的数据 impl ConvexPolyhedron {/// Discretize the boundary of this convex polyhedron as a triangle-mesh.pub fn to_trimesh(self) - (VecPoint3Real, Vec[u32; 3]) {let mut indices Vec::new();for face in self.faces() {let i1 face.first_vertex_or_edge;let i2 i1 face.num_vertices_or_edges;let first_id self.vertices_adj_to_face()[i1 as usize] as u32;for idx in self.vertices_adj_to_face()[i1 as usize 1..i2 as usize].windows(2) {indices.push([first_id, idx[0] as u32, idx[1] as u32]);}}(self.points().to_vec(), indices)} }但是不包含normal数据导致光照对其没有作用 所以我们需要自己实现一个相似的方法首先我们来看看测试数据实际上它有20个点共12个面每个面是一个正五边形所以使用TriangleMesh来表达的话一共是36个三角形 再让我们来看看bevy中构造一个TriangleMesh需要哪些数据 fn create_simple_parallelogram() - Mesh {// Create a new mesh using a triangle list topology, where each set of 3 vertices composes a triangle.Mesh::new(PrimitiveTopology::TriangleList)// 顶点数据.with_inserted_attribute(Mesh::ATTRIBUTE_POSITION,vec![[0.0, 0.0, 0.0], [1.0, 2.0, 0.0], [2.0, 2.0, 0.0], [1.0, 0.0, 0.0]])// uv数据 在本文中我们并不需要.with_inserted_attribute(Mesh::ATTRIBUTE_UV_0,vec![[0.0, 1.0], [0.5, 0.0], [1.0, 0.0], [0.5, 1.0]])// 法线.with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL,vec![[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]])// 三角形的顶点索引.with_indices(Some(Indices::U32(vec![0, 3, 1,1, 3, 2]))) }对比我们需要的数据以及to_trimesh方法发现我们少了normal数据不过这个数据在face中就有那么所有条件就具备了 完整代码 let plist: Vecf32 vec![0., 3.568220853805542, 9.341723442077637, 5.773502826690674, 5.773502826690674, 5.773502826690674, -5.773502826690674, 5.773502826690674, 5.773502826690674, 3.568220853805542, 9.341723442077637, 0., -3.568220853805542, 9.341723442077637, 0., 9.341723442077637, 0., 3.568220853805542, 9.341723442077637, 0., -3.568220853805542, 5.773502826690674, 5.773502826690674, -5.773502826690674, 5.773502826690674, -5.773502826690674, -5.773502826690674, 0., -3.568220853805542, -9.341723442077637, 0., 3.568220853805542, -9.341723442077637, -5.773502826690674, -5.773502826690674, -5.773502826690674, -9.341723442077637, 0., -3.568220853805542, -5.773502826690674, 5.773502826690674, -5.773502826690674, -3.568220853805542, -9.341723442077637, 0., -5.773502826690674, -5.773502826690674, 5.773502826690674, -9.341723442077637, 0., 3.568220853805542, 0., -3.568220853805542, 9.341723442077637, 3.568220853805542, -9.341723442077637, 0., 5.773502826690674, -5.773502826690674, 5.773502826690674]; let points: VecVec3 plist.array_chunks().into_iter().map(|v: [f32; 3]| Vec3::from_array(v)).collect(); // 通过点集构造convex hull let collider Collider::convex_hull(points); if let Some(c) collider {let convex c.as_convex_polyhedron().unwrap();// 取convex hull的所有面let faces convex.raw.faces();// 取点集let points convex.raw.points();// 取映射关系let face_to_vertices convex.raw.vertices_adj_to_face();let mut positions Vec::new();// 法向量 用于处理光照let mut normals Vec::new();let mut indices Vec::new();// 遍历所有的面for face in faces {let i1 face.first_vertex_or_edge;let i2 i1 face.num_vertices_or_edges;for idx in i1..i2 {let point points[face_to_vertices[idx as usize] as usize];// 重新构造点集 points是原始点集positions.push([point.x, point.y, point.z]);// 面上的所有点的朝向与面相同normals.push([face.normal.x, face.normal.y, face.normal.z]);}for idx in i1 1..i2 - 1 {// 构造顶点索引indices.push([i1, idx as u32, idx 1 as u32]);}}// 构造Meshlet mesh Mesh::new(PrimitiveTopology::TriangleList).with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions).with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals).with_indices(Some(Indices::U32(indices.concat())));commands.spawn(PbrBundle {mesh: meshes.add(mesh),material: materials.add(Color::rgb_u8(124, 144, 255).into()),transform: Transform::from_xyz(0.0, 1., 0.0).with_scale(Vec3::new(0.1, 0.1, 0.1)),..default()}); }结果(gif) 参考 ConvexGeometry
http://www.pierceye.com/news/920240/

相关文章:

  • vps 网站上传做网站费用需要分摊吗
  • 建网站 考虑oou淘宝客图片wordpress模板
  • 玩具网站开发背景小说网站开发文档
  • 遵义网站设计公司制作网站需要
  • 做广告公司网站建设价格成都seo招聘
  • 网站建设与规划试卷友联互换
  • 宠物网站建设费用天元建设集团有限公司是国企吗
  • 南宁在百度上建网站网站设计怎么做链接
  • 多多进宝怎么做自己网站沈阳正规的男科医院
  • 做简历的网站叫什么软件外贸网站建设工作计划
  • 关键词搜索引擎网站公司要求做网站
  • 如何判断网站开发语言浙江省网站建设报价
  • 建设一个网站思路有关网站建设的网站
  • 网站文明建设工程包括做电影网站什么后果
  • 邯郸市有搞网站服服务的吗怎样免费建设免费网站
  • 衡水学校网站建设wordpress后台中文安装
  • 英文网站建站模板电子名片制作app
  • 沧州网站建设多少钱网站多域名
  • 自己做的网站怎么被搜录免费在线观看韩国电视剧网站推荐
  • 网站推广策划案格式及范文专业做网站排名多少钱
  • 做网站优化多少钱南京华典建设有限公司网站
  • 建网站是什么专业类别海洋高端的专业做网站
  • 网站建设评审标准asp网站安全吗
  • 网站服务器怎么维护网站建设讠金手指科杰
  • 网站关键词推广哪家好咸阳seo推广
  • 自己建设网站难不难门户网站建立流程
  • 制作梦核的网站做网站注意哪方面
  • 京东商城网站wordpress模板凡科网做的网站能直接用吗
  • 网站 位置导航网站备案查询系统php版
  • 网站安全检测平台做网站的怎么挣钱