Skip to content

Commit

Permalink
[M]merge
Browse files Browse the repository at this point in the history
  • Loading branch information
闫茂源 committed Jul 12, 2024
2 parents 994b540 + bc61514 commit 160515e
Show file tree
Hide file tree
Showing 55 changed files with 74 additions and 93 deletions.
28 changes: 14 additions & 14 deletions appendix-2-3d-game-terminology.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

#### 多边形,网格,顶点

![模型(例如此处的海豚)由多边形网格组成](http://bbs.jmecn.net/uploads/default/original/1X/bc97a93e8c8168db86c9ad50dc739f9e18969be1.png)
![模型(例如此处的海豚)由多边形网格组成](/content/images/2016/08/dolphin_mesh.png)

3D场景里大部分的可见物体都是由多边形网格组成的——角色、地形、建筑等等。网格(Mesh)是一种可以表达复杂形状的网状结构。网格的优点是,从数学角度讲足够简单,可以实时处理形状变化,细节上也足够辨认该物体。

Expand Down Expand Up @@ -81,7 +81,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理
* 你可以用不同的颜色来制造特殊的反射效果,比如金属色泽或彩虹炫色。
* 无光泽物体的高光颜色是黑色的。

!["tanlglow2"](http://bbs/jmecn/net/uploads/default/original/1X/ddc58328366226903989e4b2e3eb31391881a8e1.png)
!["tanlglow2"](/content/images/2016/08/tanlglow2.png)

### 材质:纹理

Expand All @@ -95,7 +95,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

##### 颜色贴图/漫反射贴图

![tank_diffuse.jpg](http://bbs.jmecn.net/uploads/default/original/1X/1f42ac46d04c422c024743e9f6763eef4492c404.jpg)
![tank_diffuse.jpg](/content/images/2016/08/tank_diffuse.jpg)

* 是一个纯图片文件或程序纹理,用来描述物体可见的表面外观。
* 该图片可以有Alpha透明通道。
Expand All @@ -109,7 +109,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理
* 用法线贴图(Normal Map)为细微之处塑模,比如墙壁裂纹、锈迹、皮肤纹理,或者帆布的编织纹理。([更多关于凸凹贴图](http://en.wikipedia.org/wiki/bump_mapping))
* 用高度图(Height Map)为打过莫地形塑模,包括深谷和山脉。

![mountains512.png](http://bbs.jmecn.net/uploads/default/original/1X/ecd306264b3ab11304a4eda8f2a3b858636bf49b.png)
![mountains512.png](/content/images/2016/08/mountains512.png)

###### 高度图

Expand All @@ -119,7 +119,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

###### 法线贴图

![tank_normals.png](http://bbs.jmecn.net/uploads/default/original/1X/1278d052ccfefed303b0da7ba8daeacbbbb8781f.png)
![tank_normals.png](/content/images/2016/08/tank_normals.png)

* 做得好的法线贴图会让物体轮廓显得更精致——勿需再浪费精力给网格增加多边形。法线贴图里包含细微变化信息,让物体看起来更光滑,纹理更细密。

Expand All @@ -129,7 +129,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

##### 高光贴图(Specular Map)

![tank_specular.jpg](http://bbs.jmecn.net/uploads/default/original/1X/1e3da68cf28bf91d018554626ca1114e0c4d427c.jpg)
![tank_specular.jpg](/content/images/2016/08/tank_specular.jpg)

* 高光贴图可以进一步改善物体表面真实感:它包含亮度的额外信息,使物体光照效果看起来更加逼真。

Expand All @@ -139,7 +139,7 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

#### 无缝拼接纹理

![BrickWall.jpg](http://bbs.jmecn.net/uploads/default/original/1X/863786d6524c7c970971bf6a8d6a574469021018.jpg)
![BrickWall.jpg](/content/images/2016/08/BrickWall.jpg)

拼接纹理(Tiles)是一种简单常用的纹理类型。为一大片区域(如墙壁、地板)构造纹理的时候,不需要做大幅的纹理图片,而是做一小片纹理然后不断拼接直到填满整个区域。

Expand All @@ -149,15 +149,15 @@ jME环境(Context)为JME3游戏提供了所需的一切,包括:配置管理

#### UV贴图 / 纹理贴图集

![Car.jpg](http://bbs.jmecn.net/uploads/default/original/1X/4036e8279eb3f3ae8c823e4bb940bf67fc00bc12.jpg)
![Car.jpg](/content/images/2016/08/Car.jpg)

给立方体形状贴纹理容易——但是如果是角色,有面部和肢体,怎么办呢?对形状更复杂的物体,其纹理设计参照平面缝纫模式:即一个图形文件里包含物体前面、后面和侧面轮廓信息,一个接着一个。将指定的平面纹理区域(UV坐标表示)贴到3D模型(XYZ坐标表示)的指定区域,称为UV映射。使用UV映射(也叫纹理图集)的方法,一个模型的每个面都可以有不同的纹理。你可以为每种纹理建立一个相关UV映射。

精确地找到接缝然后正确拼接显得十分重要:你必须需要某种图形工具(比如Blender)来创建UV贴图(纹理图集),还要依序保存坐标。值得花点功夫学习这方面技能,UV贴图模型看起来专业多啦。

#### 环境映像

![glass-teapot1.png](http://jmonkeyengine.org/wp-content/uploads/2010/10/glass-teapot1.png)
![glass-teapot1.png](/content/images/2016/08/glass-teapot1.png)

环境映像,或者说反射映像,用来模拟实时反射和折射效果。这种方法比离线渲染程序中使用的射线追踪方法速度快,但是精确度低。

Expand All @@ -173,9 +173,9 @@ MIP是拉丁文 "multum in parvo",英文Many in one,意为多对一。

#### 程序纹理

程序纹理的制作方法是不断重复一个小图片,外加一些伪随机和梯度变化(称作Perlin噪声)。程序纹理比静态矩形纹理看起来更自然,球面失真度小。对大型网格物体,这种重复纹理看起来比无缝凭借纹理更自然。程序纹理若用于不规则大面积结构物体,效果更为立项,比如草地,土壤,石块,锈迹,还有围墙。可用jMonkeyEngine的 [Neo Texture插件](http://jmonkeyengine.github.io/wiki/sdk/neotexture.html) 来制作程序纹理。
程序纹理的制作方法是不断重复一个小图片,外加一些伪随机和梯度变化(称作Perlin噪声)。程序纹理比静态矩形纹理看起来更自然,球面失真度小。对大型网格物体,这种重复纹理看起来比无缝凭借纹理更自然。程序纹理若用于不规则大面积结构物体,效果更为立项,比如草地,土壤,石块,锈迹,还有围墙。可用jMonkeyEngine的 [Neo Texture插件](http://wiki.jmonkeyengine.org/sdk/neotexture.html) 来制作程序纹理。

![neotexture-2.jpg](http://jmonkeyengine.org/wp-content/uploads/2010/10/neotexture-2.jpg)
![neotexture-2.jpg](/content/images/2016/08/neotexture-2.jpg)

还可以参见:[用Blender创建材质](http://www.blender.org/education-help/tutorials/materials/), [Blender: 人类已知的各种材质](http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Every_Material_Known_to_Man)

Expand All @@ -187,7 +187,7 @@ MIP是拉丁文 "multum in parvo",英文Many in one,意为多对一。

#### 装配和蒙皮

![blenderswordsman.png](http://pub.admc.com/misc/jme/blenderjmetut/blenderswordsman.png)
![blenderswordsman.png](/content/images/2016/08/blenderswordsman.png)

动画角色是有支架的:内里的骨骼(骨头)和外部表面(皮肤)。皮肤是角色的可见外表,此处所谓的皮肤也包括衣服。骨头肉眼不可见,它用来对皮肤的图像渐变做插值(计算)。

Expand Down Expand Up @@ -254,7 +254,7 @@ JME3游戏引擎只能加载、显示录制好的动画,因此,你必须使

### 数学

![笛卡尔坐标系](http://bbs.jmecn.net/uploads/default/original/1X/7c68ac3778607127effff0592d0d5f6fdaff6ed8.png)
![笛卡尔坐标系](/content/images/2016/08/coordinate-system.png)

#### 坐标

Expand Down Expand Up @@ -296,7 +296,7 @@ JME3游戏引擎只能加载、显示录制好的动画,因此,你必须使

##### 表面法线

![300px-surface_normal.png](http://bbs.jmecn.net/uploads/default/original/1X/a869c0b6ed8a9b948867068e9dd81e7fd0a9f394.png)
![300px-surface_normal.png](/content/images/2016/08/300px-surface_normal.png)

表面法线就是垂直于(正交于)某平面的向量。要计算表面法线,可以做叉乘(向量积)运算。

Expand Down
2 changes: 1 addition & 1 deletion chapter-12-animation.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jME3游戏引擎只能加载、播放录制好的动画。因此,你必须使

> Jaime是jME3核心开发者`Nehon`使用Blender制作的3D动画模型,它现在是jme3-testdata模块中的一部分。模型的加载路径为:[Models/Jaime/Jaime.j3o](https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-testdata/src/main/resources/Models/Jaime)
> Jaime的原始文件为blender格式,保存在googlecode.com上。我在github上保留了一个备份文件,下载:[Jaime.blend](https://github.com/jmecn/jME3Tutorials/blob/master/jME3Tutorials/src/main/resources/Models/Jaime/Jaime.blend?raw=true)(9.5MB)。
> Jaime的原始文件为blender格式,保存在googlecode.com上。我在github上保留了一个备份文件,下载:[Jaime.blend](https://github.com/jmecn/jME3Tutorials/blob/master/src/main/resources/Models/Jaime/Jaime.blend?raw=true)(9.5MB)。
### 设计

Expand Down
2 changes: 1 addition & 1 deletion chapter-13-controlling-game-logic.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ SimpleApplication在后台做了很多事情,我们曾在本教程第二章“
* 在 initialize() 方法的最后,会执行我们重载的 `simpleInitApp()` 方法。
* 由于 initialize() 方法已经把该准备的东西都准备好了,所以我们在 simpleInitApp() 方法中才可以直接使用assetManager、inputManager等重要对象。
* 循环执行 `update(float tpf)` 方法
* 1-响应用户输入,执行所有事件监听器中的代码。见[第九章:用户交互](http://www.jmecn.net/tutorial-for-beginners/chapter-9-user-interaction/)
* 1-响应用户输入,执行所有事件监听器中的代码。见[第九章:用户交互](http://www.jmecn.net/tutorial-for-beginners/chapter-9-user-interaction)
* 2-更新游戏状态
* 2-1 更新全局游戏状态(执行所有 AppState#update() 方法);
* 2-2 更新用户自定义游戏逻辑(执行 simpleUpdate() 方法);
Expand Down
40 changes: 20 additions & 20 deletions chapter-14-special-effects.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@

水下

![水下](content/images/2017/06/under_water.png)
![水下](/content/images/2017/06/under_water.png)

雾化

![雾化](content/images/2017/06/fog.png)
![雾化](/content/images/2017/06/fog.png)

### 滤镜的用法

Expand All @@ -56,7 +56,7 @@ Maven

jME3 SDK

![](content/images/2017/06/lib.png)
![](/content/images/2017/06/lib.png)

#### 使用方法

Expand Down Expand Up @@ -312,9 +312,9 @@ jME3 SDK

效果对比如下:

![](content/images/2017/06/no_fog.png)
![](/content/images/2017/06/no_fog.png)

![](content/images/2017/06/with_fog.png)
![](/content/images/2017/06/with_fog.png)

### 实例:多滤镜

Expand Down Expand Up @@ -657,7 +657,7 @@ jME3 SDK

结果,就是我们在本章开头看到的画面。

![](content/images/2017/06/depth_of_field.png)
![](/content/images/2017/06/depth_of_field.png)

### 自定义滤镜

Expand Down Expand Up @@ -779,7 +779,7 @@ Materials/GrayScale/GrayScale.j3md
把 GrayScaleFilter 对象加到 FilterPostProcessor 中即可。
效果如下:

![](content/images/2017/06/gray_scale.png)
![](/content/images/2017/06/gray_scale.png)

## 场景处理器

Expand Down Expand Up @@ -847,7 +847,7 @@ SceneProcessor 的背后也是着色器(Shader),你可以根据自己的

这类场景元素很难通过建模来实现,想要制作模型动画几乎是不可能的。在3D游戏中,我们使用粒子系统来模拟其它传统的渲染技术难以实现的抽象视觉效果。

![](content/images/2017/06/ParticleFire.png)
![](/content/images/2017/06/ParticleFire.png)

### 相关概念

Expand Down Expand Up @@ -930,7 +930,7 @@ jME3粒子为点状或片状,通过设置不同的材质和纹理,可以改

例如,“爆炸”的粒子特效是由闪光、火云、烟尘、碎片、冲击波等多种粒子组合而成的,通常还会伴随着瞬间的强光。

![](content/images/2017/06/explosion.jpg)
![](/content/images/2017/06/explosion.jpg)

创建一个发生器非常简单,构造参数为:发生器名称、粒子形状、粒子总数。

Expand Down Expand Up @@ -966,13 +966,13 @@ jME3粒子为点状或片状,通过设置不同的材质和纹理,可以改

点状很好理解,面状则是由2个三角形拼成的方形,大概是这个样子。

![](content/images/2017/06/type_triangle.png)
![](/content/images/2017/06/type_triangle.png)

#### 设置粒子的材质

粒子发射器有专用的材质 `Common/MatDefs/Misc/Particle.j3md`。使用不同的纹理贴图,可以让粒子呈现出不同的外形。你可以自己创建所需要的粒子贴图,从而获得碎石、烟雾、水滴、雪花等不同的粒子特效。

![flash](content/images/2017/06/flash.png)
![flash](/content/images/2017/06/flash.png)

上图是我们接下来要是用的“闪光”特效贴图,这个图片可以在 [jme3-testdata](https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-testdata/src/main/resources/Effects/Explosion) 中找到。

Expand Down Expand Up @@ -1200,13 +1200,13 @@ jME3粒子为点状或片状,通过设置不同的材质和纹理,可以改

运行结果如下:

![](content/images/2017/06/ParticleFire.png)
![](/content/images/2017/06/ParticleFire.png)

### t0neg0d粒子发射器

[t0neg0d](https://hub.jmonkeyengine.org/u/t0neg0d/summary)是曾经活跃于jME社区的一名开发者,主要活动时间是2011年到2015年。

![](content/images/2017/06/t0neg0d.png)
![](/content/images/2017/06/t0neg0d.png)

t0neg0d是一位相当富有创造力的图形工程师,在她活跃的这段时间,她持续推出了很多具有非常意义的jME3插件。不仅非常实用,而且效果炫酷。

Expand All @@ -1220,14 +1220,14 @@ t0neg0d就是怎么一个人,她觉得jME3自带的粒子系统不够酷炫,
3. SkyControl 炫丽的天穹
这个组件更是帅到没朋友。多层天球,多层云层,昼夜更替,光照变化,经纬度变化。。[SkyControl](https://github.com/jMonkeyEngine-Contributions/SkyControl) 基于着色器实现,在获得 t0neg0d 本人同意后,被Stephen Gold移植到他的[jme3-utilities](https://github.com/stephengold/jme3-utilities)项目中。

![](https://github.com/jmecn/tonegodemitter/raw/master/screenshots/fire.jpg)
![t0neg0d_fire.jpg](/content/images/2017/06/t0neg0d_fire.jpg)

![](https://github.com/jmecn/tonegodemitter/raw/master/screenshots/ice.jpg)
![t0neg0d_ice.jpg](/content/images/2017/06/t0neg0d_ice.jpg)

![](https://github.com/jmecn/tonegodemitter/raw/master/screenshots/spark.png)
![t0neg0d_spark.png](/content/images/2017/06/t0neg0d_spark.png)

![](content/images/2017/06/Sky.png)
![](content/images/2017/06/Sky2.png)
![](/content/images/2017/06/Sky.png)
![](/content/images/2017/06/Sky2.png)

## 性能问题

Expand All @@ -1239,8 +1239,8 @@ t0neg0d就是怎么一个人,她觉得jME3自带的粒子系统不够酷炫,

我先不解释这个复杂的术语是什么意思,请看下面两张图。这两张图分别是关闭、开启SSAO时的效果,请注意画面效果和刷新率(FPS)的区别。

![](content/images/2017/06/No_AO.png)
![](content/images/2017/06/SSAO.png)
![](/content/images/2017/06/No_AO.png)
![](/content/images/2017/06/SSAO.png)

在现实生活中,物体表面的光并不仅仅来自光源,还包括从很多其他物体表面多次反射的环境光。与直接光源相比,这些环境光称为间接光。当光线在房间中传播和反射时,有一些地方是不容易被照到的:角落、缝隙、褶皱等等。这导致了这些区域看起来比它们周围要暗一些。

Expand Down
18 changes: 1 addition & 17 deletions chapter-16-physics-engine.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,5 @@
# 物理引擎

## 牛顿的苹果

长久以来,哲学领域有一个争论不休的话题,就是这个世界有没有独立意志?

有一种观点认为世界是有意志的,但是它的意志与人的表现形式不同。天道无私,对世间万物并无任何偏爱。另一种观点认为世界是无意识的,它的背后并无一个主宰来决定应该怎么做,只是按照大道规则自然运转。事实上这是一个无法证伪的问题,因为具有独立意志,就意味着不需要任何外在来证明其存在。

这个问题只对思考它的人有意义,最终取决于人们如何与世界相处。世界孕育了各种生灵,其中人类天生便开启了灵智。如果我们有意识,那这个孕育了我们的世界呢?

汉语中有个话说得很有意思,叫做**“采天地之灵气,吸日月之精华”**。很多人幻想世界上有种看不见摸不着的“灵气”或“能量”,要在风水好的地方才能吸收到,吸收这种“灵气”可以达到改造体质的目的。这都是胡扯。**其实天地真正的精华是什么?是万物自然运行的规律。**成语**“仰观俯察”**出自《易经·系辞》,原文是**“仰以观于天文,俯以察于地理,是故知幽明之故。”**意思是把世界当做我们的老师。人类的诸多科技文明,都是从世界中学来的,代代积累传承至今。

还有一个很有趣的词,叫做**“天心”**。天有心吗?我不知道,我只知道人有心。所谓**体悟天心**,其实是以人心感悟天道。你到底悟没悟,悟出了什么,谁也看不出来。好在中国人从来都不太在意这些虚无缥缈的东西,我们只关心**天心神用**。什么叫“天心神用”?徐公子胜治曾在其小说[《神游》](http://book.qidian.com/info/65875)中描述了一番非常经典的问论:**何者为神?用者为神。何者为用?当者为用。**那么这句话翻译过来的意思就是:什么是神?就是为了用。就好比一瓶水,我要用的就是它能充润于我,我口渴的时候它能喝,我不渴的时候它也可有可无。这就是“用者为神”。它的实用就是滋养一个人,充润一个人。我口渴了,解渴只需要一瓶水就够。一滴水不够,一桶水太多,太多太少都不恰当,不恰当的那就是“祸”了。只有恰当才称得上是“用”,这就是“当者为用”。

一个人从诞生的那一刻起,就拥有了整个世界,并且无时无刻不在吸收天地的精华。无论你是否在意,天地都将这一切赋予了你。所以玩游戏时,如果你操纵的角色直接从平地上掉出了世界,你就会非常鄙视这款游戏的开发者,因为这违背了常识。到底什么是常识?常识就是道,大道常常隐藏在平凡的事物当中。每个人对世界的规律都有自己的认知,但是少有人能把它总结成规律。人人都知道苹果熟了会掉到地上,只有牛顿这样的人才会总掉落的苹果身上看到万有引力定律。

现在,你是游戏的开发者,**你正在创造一个世界。**这个世界有意志吗?游戏本身是没有意志的,但开发游戏的你有意志,将来玩这个游戏的人也有意志。你是这个游戏的主宰,可以让这个世界表现出更加接近现实世界的规律,或者只符合你定下的规则。无论如何,你需要一个规则来运转这个世界。我们用类和对象来抽象自己对世界的理解,并用代码逻辑来描述世界的规律,越是接近现实规律,程序就越是复杂。并不是每个人都能用代码实现苹果落地的过程,物理引擎将使你最好的帮手。

## 物理引擎概述

物理引擎是一种用于模拟真实物理现象的中间件,可以用来创建虚拟的物理环境,并在其中运行来自物理世界的规则。物理引擎应用的最多的地方就是动画和游戏行业,例如3D游戏开发常用的三大物理引擎:
Expand Down Expand Up @@ -2032,4 +2016,4 @@ Body的**物理属性**包括重力加速度(Gravity),线速度(Linear V

虽然我称其为一个“游戏”,但实质上它只是一个demo,用于进一步演示dyn4j在jME3中的应用。

如果你对dyn4j物理引擎感兴趣,建议去看看它官网提供的例子,前文中已经全部列出来了。
如果你对dyn4j物理引擎感兴趣,建议去看看它官网提供的例子,前文中已经全部列出来了。
Loading

0 comments on commit 160515e

Please sign in to comment.