无法让立方体按我想要的方式移动

时间:2015-10-15 19:21:36

标签: java android opengl-es

我正在开发一款适用于Android的OpenGL ES应用程序,该应用程序可以生成一个立方体,可以向用户触摸的屏幕部分发射立方体。但是,每当我生成“子”立方体时,主立方体开始移动,子立方体甚至不会出现。

立方体由Cube类表示。这由ChildCube(由SmallChildCube继承)和MainCube继承。立方体将其位置存储在三个浮点(x,y,z)中。然后update()方法使用这些值来计算转换矩阵:

public void update() {
    long passedTime = SystemClock.uptimeMillis() - lastTime;

    Matrix.setIdentityM(mModelMatrix, 0);

    // rotate the cube
    Matrix.rotateM(mModelMatrix, 0, (float) Math.toDegrees(movementAngle), 0.0f, 0.0f, 1.0f);

    // translation
    pos.x += passedTime/1000.0d * (double)movementSpeed * Math.sin(movementAngle);
    pos.y += passedTime/1000.0d * (double)movementSpeed * Math.cos(movementAngle);
    pos.z += passedTime/1000.0d * (double)movementSpeed * 0.0d;
    Matrix.translateM(mModelMatrix, 0, pos.x, pos.y, pos.z);

    lastTime = SystemClock.uptimeMillis();
}

所有用户输入都在我的CubeRenderer类(继承GLSurfaceView.Renderer)中处理。输入从活动传递到此类,并按如下方式处理:

public boolean onTouchEvent(MotionEvent e) {
    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Vec2 cubePos = mainCube.getPositionOnScreen();

            int mainCubePixelX = (int)(cubePos.x * width);
            int mainCubePixelY = (int)(cubePos.y * height);

            Vec2 pressedCoordinates = new Vec2(e.getX(), e.getY());

            // calculate the angle using the center of the cube (0 degrees is upwards)
            double angle = Math.atan2(cubePixelX - pressedCoordinates.x, cubePixelY - pressedCoordinates.y);

            // spawn child cubes
            childCubes.add(new SmallChildCube(mainCube.getPos()));
            childCubes.lastElement().setMovementAngle(angle);
            break;
    }

    return true;
}

最后更新发生在我的CubeRenderer.onDrawFrame()中:

public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        // view matrix
        Matrix.setLookAtM(mViewMatrix, 0, 0.0f, 0.0f, -10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

        // multiply the matrices
        Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

        // update everything
        mainCube.update();
        if(childCubes.size() > 0) {
            for (int i = 0; i < childCubes.size(); i++) {
                childCubes.elementAt(i).update();
            }
        }

        // render everything
        mainCube.draw(mViewProjectionMatrix);
        if(qubieBullets.size() > 0) {
            for (int i = 0; i < childCubes.size(); i++) {
                childCubes.elementAt(i).draw(mViewProjectionMatrix);
            }
        }
    }

现在,如果我点击屏幕的一部分,即使其构造函数中的movementSpeed声明为0.0f,主立方体也开始向(并过去)移动。但是,如果我注释掉更新childCubes向量中每个子多维数据集的行,那么主立方体将保持原样。

有没有人理解为什么主立方体正在移动,并且衍生的子立方体没有出现?如有必要,我会上传整个代码。

1 个答案:

答案 0 :(得分:0)

哦,我真傻!

当我处理输入并创建一个新的子多维数据集时

viewGradient.layer.cornerRadius = 5; // rounds your view
maskLayer.opacity = 0.8; // make your view transparent

我没有像我想的那样将mainCube位置的值复制到新的Vec3中。相反,上面的行只是告诉对象使用相同的Vec3。

新功能代码:

childCubes.add(new SmallChildCube(mainCube.getPos()));