【问题标题】:Android game - simulate object rotation along its pathAndroid 游戏 - 沿路径模拟对象旋转
【发布时间】: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


【解决方案1】:

可以根据瞬时速度矢量计算角度:

// Get direction to point the ship
mangleInDeg = (float) (Math.atan2(mRelSpeed.y, mRelSpeed.x)  * 180 / Math.PI);
mangleInDeg += 90.0; // offset the angle to coincide with angle of the base ship image

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多