【发布时间】:2016-03-13 18:19:39
【问题描述】:
我正在阅读 this 很棒的 Android 游戏入门书籍,我现在正在尝试自己实施一些测试。
我正在使用 OpenGL ES 1.0,我现在可以操作视锥体、投影、平移、旋转、缩放等。
我正在尝试做的事情:
a) 将火箭渲染到屏幕上,为其添加一些速度和加速度(使用欧拉积分 - 将加速度添加到速度,并将速度添加到位置)以模拟路径(抛物线)。 - 这已经完成,没有任何问题。
b) 旋转火箭,这样我们也可以模拟物体沿其路径的倾斜度。 - 这就是问题所在。
为了清楚起见,我在下面添加图片。
我不知道在一帧和下一帧之间添加到火箭的正确角度是多少。
我试图用一些几何图形来实现。
Obj Pos 1 是第 1 帧的火箭表示。
Obj Pos 2 是火箭表示,在下一帧(第 2 帧)。
V1 是保存 Obj Pos 1 的中心 X 和 Y 坐标的向量。
V2 i 包含 Obj Pos 2 的中心 X 和 Y 坐标的向量。
切线 1 是抛物线的切线,V1 指向的地方。
切线 2 是抛物线的切线,V2 指向的地方。
A1 是两个向量之间的角度。
A2 是两条切线之间的角度。
据我所知,适用于火箭的正确角度,从第 1 帧到第 2 帧是角度 A2。但是如何计算呢?
而且,这对于游戏目的是否正确?我的意思是,我们不需要精确的物理概念,我们只需要足够好来模拟动画并“欺骗”用户。
按照下面的代码:
public class PersonalTest008Rocket extends GLGame {
@Override
public Screen getStartScreen() {
return new RocketScreen(this);
}
class RocketScreen extends Screen {
GLGraphics glGraphics;
Camera2D camera;
final float WORLD_WIDTH = 60;
final float WORLD_HEIGHT = 36;
float[] rocketRawData;
short[] rocketRawIndices;
BindableVertices rocketVertices;
DynamicGameObject rocket;
float angle;
Vector2 gravity;
public RocketScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();
camera = new Camera2D(glGraphics, WORLD_WIDTH, WORLD_HEIGHT);
rocketRawData = new float[]{
// x, y, r, g, b, a
+4.0f, +0.0f, 1.0f, 0.0f, 0.0f, 1, // 0
+2.0f, +1.0f, 0.5f, 0.0f, 0.0f, 1, // 1
+2.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1, // 2
-2.0f, +1.0f, 0.0f, 0.5f, 0.5f, 1, // 3
-2.0f, -1.0f, 0.0f, 0.5f, 0.5f, 1, // 4
-3.0f, +1.0f, 0.0f, 0.5f, 0.5f, 1, // 5
-3.0f, -1.0f, 0.0f, 0.5f, 0.5f, 1, // 6
-4.0f, +3.0f, 0.0f, 0.0f, 1.0f, 1, // 7
-5.0f, +0.0f, 0.0f, 0.0f, 1.0f, 1, // 8
-4.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1 // 9
};
rocketRawIndices = new short[]{
0, 1, 2,
1, 4, 2,
1, 3, 4,
3, 4, 6,
3, 5, 6,
3, 7, 5,
5, 8, 6,
6, 9, 4
};
rocketVertices = new BindableVertices(glGraphics, 10, 3 * 8, true, false);
rocketVertices.setVertices(rocketRawData, 0, rocketRawData.length);
rocketVertices.setIndices(rocketRawIndices, 0, rocketRawIndices.length);
int velocity = 30;
angle = 45;
rocket = new DynamicGameObject(0, 0, 9, 6);
rocket.position.add(1, 1);
rocket.velocity.x = (float) Math.cos(Math.toRadians(angle)) * velocity;
rocket.velocity.y = (float) Math.sin(Math.toRadians(angle)) * velocity;
gravity = new Vector2(0, -10);
}
@Override
public void update(float deltaTime) {
rocket.velocity.add(gravity.x * deltaTime, gravity.y * deltaTime);
rocket.position.add(rocket.velocity.x * deltaTime, rocket.velocity.y * deltaTime);
}
@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.setViewportAndMatrices();
gl.glTranslatef(rocket.position.x, rocket.position.y, 0);
gl.glRotatef(angle, 0, 0, 1);
rocketVertices.bind();
rocketVertices.draw(GL10.GL_TRIANGLES, 0, rocketRawIndices.length);
rocketVertices.unbind();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
}
}
【问题讨论】:
-
在 StackExchange 数学论坛上提问,您可能会得到一些好的答案。一旦他们可以解释三角/几何,您就可以从中找出代码。
标签: android animation vector opengl-es