年后第一天上班,郭先生来说一说cannon.js的ConvexPolyhedron(多边形),cannon.js是一个物理引擎,内部通过连续的计算得到各个时间点的数据的状态,three.js的模型可以定时的应用这些状态来达到运动的效果,但是在应用的时候cannon数据模型和three模型一般都是不同的(而且多数情况下都是不一样的),因为更大的cannon数据模型会带来更多的性能问题,并且有的时候是没有必要的,比如说上一篇我们用圆柱来模拟保龄球瓶。但是有一些时候还是需要使用相对复杂的cannon多边形来对应three模型的,比如使用一个比较大的模型,那么它的细节就会很大程度的影响物理效果。那么我们来制作一个这样的场景,效果如下图,在线案例请点击博客原文

1. cannon.js物理引擎多边形ConvexPolyhedron的构造函数

ConvexPolyhedron ( points  faces )

构造函数一共需要两个参数,points是一个Vec3类型的数组,也就是包含所有点的数组,faces是一个组成每个小三角面的二维数组,这个就和THREE.Face3比较类似,比如说我们像制作出一个四面体,

var points = [
new CANNON.Vec3(0,0,0),
new CANNON.Vec3(2,0,0),
new CANNON.Vec3(0,2,0),
new CANNON.Vec3(0,0,2)
];
var faces = [
[0,3,2],
[0,1,3],
[0,2,1],
[1,2,3],
]
var convex = new CANNON.ConvexPolyhedron( points faces );

如果了解three.js,那么这个东西是很好理解的。

2. 实现一个使用ConvexPolyhedron(多边形)的场景

场景如上图,包括一个ParametricGeometry、一个TorusGeometry和一个TorusKnotGeometry一共三个几何体,首先我们用three.js先制作出来三个几何体,我们既可以使用几何体制作出网格,也可以制作出cannon.js多边形

1. 制作three几何体

parametricGeom = new THREE.ParametricGeometry(
(u, v, target) => {
let x = Math.sin(Math.PI * 2 * u) * 10 * Math.abs(Math.sin(Math.PI * v));
let y = v * 20 - 10;
let z = Math.cos(Math.PI * 2 * u) * 10 * Math.abs(Math.cos(Math.PI * v));
target.set(x, y, z);
},
30,
12
);
torusGeom = new THREE.TorusGeometry(5, 2, 16, 8);
torusKnotGeom = new THREE.TorusKnotGeometry(5, 1.5, 80, 8, 2, 3);
for(let i=0; i<parametricGeom.faces.length; i++) {
color.setHSL(Math.random(), 0.5, 0.5);
parametricGeom.faces[i].color.copy(color);
}
for(let i=0; i<torusGeom.faces.length; i++) {
color.setHSL(Math.random(), 0.5, 0.5);
torusGeom.faces[i].color.copy(color);
}
for(let i=0; i<torusKnotGeom.faces.length; i++) {
color.setHSL(Math.random(), 0.5, 0.5);
torusKnotGeom.faces[i].color.copy(color);
}

这里就制作出了三个几何体,并为每个小三角面上了色。

2. 用既有的three几何体制作cannon多边形

let parametricShape = this.createConvex(parametricGeom);
let torusShape = this.createConvex(torusGeom);
let torusKnotShape = this.createConvex(torusKnotGeom); parametricBody = new CANNON.Body({
mass: 0,
position: new CANNON.Vec3(-20, 6, 0),
material: new CANNON.Material({friction: 0, restitution: 1}),
shape: parametricShape
})
torusBody = new CANNON.Body({
mass: 0,
position: new CANNON.Vec3(0, 6, 0),
material: new CANNON.Material({friction: 0, restitution: 1}),
shape: torusShape
})
torusKnotBody = new CANNON.Body({
mass: 0,
position: new CANNON.Vec3(20, 6, 0),
material: new CANNON.Material({friction: 0, restitution: 1}),
shape: torusKnotShape
}) world.addBody(parametricBody);
world.addBody(torusBody);
world.addBody(torusKnotBody); createConvex(geometry) {
let vertices = [];
let faces = [];
for(let i=0; i<geometry.vertices.length; i++) {
vertices.push(new CANNON.Vec3(geometry.vertices[i].x, geometry.vertices[i].y, geometry.vertices[i].z));
}
for(let i=0; i<geometry.faces.length; i++) {
faces.push([geometry.faces[i].a, geometry.faces[i].b, geometry.faces[i].c]);
}
return new CANNON.ConvexPolyhedron(vertices, faces);
}

three的点和faces面存在geometry.vertices中和geometry.faces中,我们需要取出来并整理成我们想要的形式。然后下一步就是创建three.js网格,我们就不赘述了。

主要代码就是这么多。其实知道了cannon多边形的构造方法,我们很容易就制作出想要的多边形,这很大程度上丰富了物理世界。下一篇我们继续说一说cannon.js的约束

转载请注明地址:郭先生的博客

three.js cannon.js物理引擎之ConvexPolyhedron多边形的更多相关文章

  1. three.js cannon.js物理引擎之齿轮动画

    郭先生今天继续说一说cannon.js物理引擎,并用之前已经学习过的知识实现一个小动画,知识点包括ConvexPolyhedron多边形.Shape几何体.Body刚体.HingeConstraint ...

  2. three.js cannon.js物理引擎地形生成器和使用指针锁定控件

    今天郭先生说一说使用cannon.js物理引擎绘制地形和使用指针锁定控件.效果如下图.线案例请点击博客原文. 这里面的生成地形的插件和指针锁定控件也是cannon.js的作者schteppe封装的,当 ...

  3. three.js cannon.js物理引擎之Heightfield

    今天郭先生说一说cannon.js物理引擎之Heightfield高度场,学过场论的朋友都知道物理学中把某个物理量在空间的一个区域内的分布称为场,高度场就是与高度相关的场,而cannon.js物理引擎 ...

  4. three.js cannon.js物理引擎之制作拥有物理特性的汽车

    今天郭先生说一说使用cannon.js的车辆辅助类让我们的汽车模型拥有物理特性.效果图如下,在线案例请点击博客原文. 下面我们说一下今天要使用的两个类,并简单的看看他们的物理意义 1. Raycast ...

  5. three.js cannon.js物理引擎制作一个保龄球游戏

    关于cannon.js我们已经学习了一些知识,今天郭先生就使用已学的cannon.js物理引擎的知识配合three基础知识来做一个保龄球小游戏,效果如下图,在线案例请点击博客原文. 我们需要掌握的技能 ...

  6. three.js cannon.js物理引擎之约束

    今天郭先生继续说cannon.js,主演内容就是点对点约束和2D坐标转3D坐标.仍然以一个案例为例,场景由一个地面.若干网格组成的约束体和一些拥有初速度的球体组成,如下图.线案例请点击博客原文. 下面 ...

  7. three.js cannon.js物理引擎之约束(二)

    今天郭先生继续讲cannon.js的物理约束,之前的一篇文章曾简单的提及过PointToPointConstraint约束,那么今天详细的说一说cannon.js的约束和使用方法.在线案例请点击博客原 ...

  8. three.js 之cannon.js物理引擎

    今天郭先生说的是一个物理引擎,它十分小巧并且操作简单,没错他就是cannon.js.这些优点都源自于他是基于js编写的,对于js使用者来说cannon.js拥有其他物理引擎没有的纯粹性.从学习成本来看 ...

  9. 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘

    计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...

随机推荐

  1. java实现hbase数据库的增删改查操作(新API)

    操作环境: java版本:    jdk 1.7以上 hbase 版本:1.2.x hadoop版本:2.6.0以上 实现功能: 1,创建指定表 2,删除指定表 3,根据表名,行键,列族,列描述符,值 ...

  2. 2019 Multi-University Training Contest 2 I.I Love Palindrome String(回文自动机+字符串hash)

    Problem Description You are given a string S=s1s2..s|S| containing only lowercase English letters. F ...

  3. BZOJ 3675: 序列分割 (斜率优化dp)

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  4. Codeforces Global Round 8 C. Even Picture(构造)

    题目链接:https://codeforces.com/contest/1368/problem/C 题意 构造一个只含有灰.白块的网格,要求: 所有灰块为一个连通块 每个灰块与偶数个灰块相邻 恰有 ...

  5. HTTP笔记2--简单的HTTP 协议

    HTTP概念 HTTP用于客户端和服务器之间的通信 客户端:请求访问文本或图像等资源的一端 服务器端而提供资源响应的一端 通过请求和响应的交换达成通信 HTTP 协议规定,请求从客户端发出,最后服务器 ...

  6. 弹性伸缩 AS(Auto Scaling)

    根据业务需求和策略设置伸缩规则,在业务需求增长时自动为您增加 ECS 实例以保证计算能力,在业务需求下降时自动减少 ECS 实例以节约成本,弹性伸缩不仅适合业务量不断波动的应用程序,同时也适合业务量稳 ...

  7. Xtrabackup 物理备份

    目录 Xtrabackup 安装 Xtrabackup 备份介绍 Xtrabackup全量备份 准备备份目录 全量备份 查看全量备份内容 Xtrabackup 全量备份恢复数据 删除所有数据库 停止数 ...

  8. C++的继承权限

    原文来自于:https://www.cnblogs.com/2018shawn/p/10648408.html 公式: 继承成员对外的访问属性 = Max{继承方式,父类成员访问级别}: ps;以下成 ...

  9. JDK下载安装与卸载详解

    JDK下载安装 1. 下载: 推荐版本:JDK 8 (7.8目前广泛应用) 官网地址:https://www.oracle.com/cn/java/technologies/javase/javase ...

  10. npm ip

    npm ip webpack $ ip address var ip = require('ip'); ip.address() // my ip address ip.isEqual('::1', ...