8.2 定义形体(Adding a Geometry Class)
我们现在已经明确的知道需要些什么去构建冰球及球棍;为了构建冰球,我们使用triangle fan命令构建冰球的顶部,再使用triangle strip构建冰球的边缘;为了构建球棍,我们需要使用两个triangle fan及两个triangle strip;为了使得构建这些形体变得更容易,我们将会增加一个定义基本形体的Geometry类,并使用ObjectBuilder执行实际的构建命令。
tips: 为什么不使用第三方库?
确实存在几十个用于Android的3D库,比如libgdx、Unity3D,这些库可以提高你的效率,但是这是只有你理解OpenGL的一些基础、3D渲染以及这些机制是如何在底层完成工作之后;否则的话使用起来也没那么容易;举个例子:框架Spring及Hibernate可以使得java开发更有效率,但是如果你直接使用它的话你将不会理解Java是如何运作的。
学习这些库也可以让你了解如何构建你自己的组件,Java3D 及jMonkeyEngine在桌面应用上面使用得比较多,由于相关文档比较容易获得所以他们都可以作为你学习的开始。
现在开始构建Geometry类,在com.airhockey.android.util.包下面创建类Geometry,并增加如下代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/util/Geometry.java
public static class Point {
public final float x, y, z;
public Point(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
public Point translateY(float distance) {
return new Point(x, y + distance, z);
}
}
我们定义了一个3D空间中的顶点以及一个可以沿y轴移动顶点的辅助方法,我们也需要定义一个圆,在Point类的后面增加如下代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/util/Geometry.java
public static class Circle {
public final Point center;
public final float radius;
public Circle(Point center, float radius) {
this.center = center;
this.radius = radius;
}
public Circle scale(float scale) {
return new Circle(center, radius * scale);
}
}
同时增加了一个可以缩放加的辅助方法,最后增加圆柱的定义,代码如下:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/util/Geometry.java
public static class Cylinder {
public final Point center;
public final float radius;
public final float height;
public Cylinder(Point center, float radius, float height) {
this.center = center;
this.radius = radius;
this.height = height;
}
}
圆柱就像是一个拉伸了的圆,因此我们定义了中心坐标、半径以及高度。
你可能已经注意到这里把Geometry类定义为immutable类型,当需要做些改变的时候,我们将会返回一个新的对象;这将会使得代码理容易使用及理解,但是当你需要考虑性能的时候你可能需要使用一个简单的float数组存储数据并提供改变他们的静态辅助方法。
下一节我们将会定义一个对象构建者(点击进入下一节)