今天郭先生说一说cannon.js物理引擎之Heightfield高度场,学过场论的朋友都知道物理学中把某个物理量在空间的一个区域内的分布称为场,高度场就是与高度相关的场,而cannon.js物理引擎的Heightfield的高度就是关于两个变量的函数,可以表达为HEIGHT(i,j)。当然知不知道场论不耽误我们学习Heightfield,下面就是一个由Heightfield生成的高度场,在线案例请点击博客原文。我们来说一说它的用法。

1. Heightfield的用法

说用法之前我们不妨看看他的API,文档对于它的说明是 – “高度数据以数组形式给出。这些数据点以给定的距离均匀分布”。构造函数如下。

Heightfield ( data , options )

data是一个Y值数组,将用于构建地形。options是一个配置项,有三个可配置参数。minValue是数据数组中数据点的最小值。如果未给出,将自动计算。maxValue最大值。elementSize是X方向上数据点之间的世界间距。他还有一些属性和方法请大家自行观看,我就不多说了。

高度场Heightfield本质和cannon.js一样还是一种数据的表达形式,想要把它应用到three中仍然需要对应的图形来表达(就像CANNON.Box数据需要THREE.BoxBuferGeometry几何体一样),对应的几何体就是ParametricBufferGeometry,下面我们以一个案例来实际操作一下。

2. Heightfield案例

可以点击案例来观看,下面我们直接上代码。

initCannon() {
//这里是生成高度场的代码
var matrix = [];//创建构造高度场的数组
for (var i = 0; i < size; i++) {
matrix.push([]);
for (var j = 0; j < size; j++) {
//高度由两个余弦函数叠加形成
var height = Math.cos(i / size * Math.PI * 8) * Math.cos(j / size * Math.PI * 8);
matrix[i].push(height)
}
}
var hfShape = new CANNON.Heightfield(matrix, {
elementSize: 1 //数据点的距离设置为1
});
var hfBody = new CANNON.Body({ mass: 0, material: physicsMaterial});
var q = new CANNON.Quaternion();
q.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), - Math.PI / 2);
hfBody.addShape(hfShape, new CANNON.Vec3(-size / 2, 0, size / 2), q);//由于这个高度场是XOY平面第一象限上,所以需要旋转和平移,addShape方法为我们提供了这个功能。
world.addBody(hfBody);
},
initThree() {
//使用ParametricBufferGeometry配合Heightfield形成网格
var groundGeom = new THREE.ParametricBufferGeometry((u,v,target) => {
var height = Math.cos(u * Math.PI * 8) * Math.cos(v * Math.PI * 8);//这里的方法和生成高度场的方法是一样的,不了解ParametricBufferGeometry几何体的可以参考我之前发的博客。
target.set(u * size - size / 2, height, v * size - size / 2);
}, size, size)
let groundMate = new THREE.MeshPhongMaterial({color: 0x666666, side: THREE.DoubleSide});
groundMesh = new THREE.Mesh(groundGeom, groundMate);
scene.add(groundMesh);
},

Heightfield学习起来还是很简单的,我们后面的案例可能会用到这个高度场作为地面,作为预备知识先了解一下。下一节我们讲一下RaycastVehicle类。

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

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

  1. three.js cannon.js物理引擎之ConvexPolyhedron多边形

    年后第一天上班,郭先生来说一说cannon.js的ConvexPolyhedron(多边形),cannon.js是一个物理引擎,内部通过连续的计算得到各个时间点的数据的状态,three.js的模型可以 ...

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

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

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

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

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

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

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

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

  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. metinfo小于v6.2.0版本通杀SQL盲注漏洞分析

    0x01 此漏洞是由于未将decode解码后的数据过滤,而直接带入SQL语句中,从而导致SQL盲注漏洞. 0x02 漏洞分析:此处复现为metinfo6.1.3版本,漏洞最初产生为:/app/syst ...

  2. 开发你的第一个NCS(Zephyr)应用程序

    Nordic有2套并存的SDK:老的nRF5 SDK和新的NCS SDK,两套SDK相互独立,大家选择其中一套进行开发即可.一般而言,如果你选择的芯片是nRF51或者nRF52系列,那么推荐使用nRF ...

  3. Redis 6.0 多线程性能测试结果及分析

      单线程的Redis一向以简洁高效著称,但也有其阿喀琉斯之踵:阻塞!单个线程在最容易产生瓶颈的网络读写(Redis大key)请求完成之前,其他所有请求都将会被阻塞,严重影响其效率,因此Redis的多 ...

  4. 如何在visual studio中,更改删除团队资源管理器的tfs地址 不能弹出来

    C:\Users\Administrator\AppData\Roaming\Microsoft\VisualStudio\16.0_8c6724b7\Team Explorer 进入文件夹:AppD ...

  5. CentOS7离线安装mysql5.6

    下载mysql5.6,系统选择redhat,版本选择RHEL7,下载RPM Bundle后得到一个tar文件.这里得到文件MySQL-5.6.44-1.el7.x86_64.rpm-bundle.ta ...

  6. ArrayList的删除姿势你都知道了吗

    引言 前几天有个读者由于看了<ArrayList哪种遍历效率最好,你真的弄明白了吗?>问了个问题普通for循环ArrayList为什么不能删除连续重复的两个元素?其实这个描述是不正确的.正 ...

  7. Spring Boot 自动配置之@Conditional的使用

    Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_ ...

  8. 伯俊BOS2.0关于订金单的处理方案

    订金单功能调整设计 一.     功能确认 BPOS关于订金的使用对应的是"预收单",原"预收单"设置有商品明细,根据客户对订金的需求,取消原有"商品 ...

  9. Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)

    一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...

  10. NC65在日常开发中常用的代码写法

    标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...