three.js cannon.js物理引擎之ConvexPolyhedron多边形
年后第一天上班,郭先生来说一说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多边形的更多相关文章
- three.js cannon.js物理引擎之齿轮动画
郭先生今天继续说一说cannon.js物理引擎,并用之前已经学习过的知识实现一个小动画,知识点包括ConvexPolyhedron多边形.Shape几何体.Body刚体.HingeConstraint ...
- three.js cannon.js物理引擎地形生成器和使用指针锁定控件
今天郭先生说一说使用cannon.js物理引擎绘制地形和使用指针锁定控件.效果如下图.线案例请点击博客原文. 这里面的生成地形的插件和指针锁定控件也是cannon.js的作者schteppe封装的,当 ...
- three.js cannon.js物理引擎之Heightfield
今天郭先生说一说cannon.js物理引擎之Heightfield高度场,学过场论的朋友都知道物理学中把某个物理量在空间的一个区域内的分布称为场,高度场就是与高度相关的场,而cannon.js物理引擎 ...
- three.js cannon.js物理引擎之制作拥有物理特性的汽车
今天郭先生说一说使用cannon.js的车辆辅助类让我们的汽车模型拥有物理特性.效果图如下,在线案例请点击博客原文. 下面我们说一下今天要使用的两个类,并简单的看看他们的物理意义 1. Raycast ...
- three.js cannon.js物理引擎制作一个保龄球游戏
关于cannon.js我们已经学习了一些知识,今天郭先生就使用已学的cannon.js物理引擎的知识配合three基础知识来做一个保龄球小游戏,效果如下图,在线案例请点击博客原文. 我们需要掌握的技能 ...
- three.js cannon.js物理引擎之约束
今天郭先生继续说cannon.js,主演内容就是点对点约束和2D坐标转3D坐标.仍然以一个案例为例,场景由一个地面.若干网格组成的约束体和一些拥有初速度的球体组成,如下图.线案例请点击博客原文. 下面 ...
- three.js cannon.js物理引擎之约束(二)
今天郭先生继续讲cannon.js的物理约束,之前的一篇文章曾简单的提及过PointToPointConstraint约束,那么今天详细的说一说cannon.js的约束和使用方法.在线案例请点击博客原 ...
- three.js 之cannon.js物理引擎
今天郭先生说的是一个物理引擎,它十分小巧并且操作简单,没错他就是cannon.js.这些优点都源自于他是基于js编写的,对于js使用者来说cannon.js拥有其他物理引擎没有的纯粹性.从学习成本来看 ...
- 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘
计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...
随机推荐
- linux环境变量 shell变量 command not found解决方法(转)
在Ubuntu.centos中有如下几个文件可以设置环境变量1./etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文 ...
- docker启动脚本
#!/bin/bash # 定义环境变量 export LANG="en_US.UTF-8" #统一格式化打印输出信息 printMsg(){ echo "$(date ...
- HDU5286 wyh2000 and sequence【分块 均摊复杂度】
HDU5286 wyh2000 and sequence 题意: 给出长为\(N\)的序列\(A_1,A_2,A_3,\cdots,A_n\),\(q\)次询问,每次询问给出区间\([L,R]\),假 ...
- cf 1305 E. Kuroni and the Score Distribution
题目传送门:E. Kuroni and the Score Distribution 题目大意:给n和m,输出n个数,这些数里必须要有m对a[i]+a[j]==a[k] ( i < j < ...
- poj2778 DNA Sequence(AC自动机+矩阵快速幂)
Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's ve ...
- Beautiful numbers CodeForces - 55D
题意: 找出区间[li,ri]内有多少数满足,这个数的每一个位的非0数都能把这个数整除 题解: 因为这个数每一位的值都可以把这个数整除,那也就是说这个数是它所有位数的公倍数,但是可能不是最小公倍数. ...
- VSCode配置Python开发环境
https://blog.csdn.net/vinkim/article/details/81546333 https://zhuanlan.zhihu.com/p/31417084
- Python小练习批量爬取下载歌曲
import requests import os headers={ 'Cookie': '_ga=GA1.2.701818100.1612092981; _gid=GA1.2.748589379. ...
- Kubernets二进制安装(7)之部署主控节点服务--apiserver二进制安装
kube-apiserver集群规划 主机名 角色 IP地址 mfyxw30.mfxyw.com kube-apiserver主 192.168.80.30 mfyxw40.mfyxw.com kub ...
- linux内核编程入门--系统调用监控文件访问
参考的资料: hello world https://www.cnblogs.com/bitor/p/9608725.html linux内核监控模块--系统调用的截获 https://www. ...