3D对象仅在构造函数中声明时可见

时间:2015-10-21 11:25:37

标签: java android opengl-es

我有一个Android应用程序,它使用OpenGL ES在屏幕上显示3D立方体。我希望用户点击屏幕并向该点发送一个立方体,源自主立方体。

我像这样处理触摸输入:

public boolean onTouchEvent(MotionEvent e) {
    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Fetch the normalized coordinates from the cube
            Vec2 cubePos = mainCube.getPositionOnScreen();

            // Multiply in order to get the pixels
            int cubePixelX = (int)(cubePos.x * width);
            int cubePixelY = (int)(cubePos.y * height);

            // A vector for storing the touched part of the screen
            Vec2 pressedCoordinates = new Vec2(e.getX(), e.getY());

            // Calculate the angle from the middle of the cube and the touched coordinates (0 rad is straight up. [0...pi] anti-clockwise, [0...-pi] clockwise)
            double angle = Math.atan2(cubePixelX - pressedCoordinates.x, cubePixelY - pressedCoordinates.y);

            // Create a child cube from the main cube's position and the calculated angle
            ChildCube child = new ChildCube(mainCube.getPos());
            child.setMovementAngle(angle);
            childCubes.addElement(child);    // A Vector

            break;
    }

    return true;
}

从onDrawFrame()

调用Vector childCubes
for (int i = 0; i < childCubes.size(); i++) {
    childCubes.elementAt(i).update();
    childCubes.elementAt(i).draw(mViewProjectionMatrix);
}

就像mainCube

一样
mainCube.update()
mainCube.draw(mViewProjectionMatrix);

实际上正在调用属于子多维数据集的方法(我在update()和draw()方法中都验证了这一点)但是屏幕上没有呈现任何内容。如果我在onSurfaceCreated中声明一个子多维数据集 - 这是我对构造函数的最接近 - 就像这样

cc = new ChildCube(mainCube.getPos());    // cc is declared a private variable of type ChildCube
childCubes.addElement(cc);

然后只需在按下屏幕时更新onTouchEvent()中的多维数据集

cc.setPos(mainCube.getPos());
cc.setMovementAngle(angle);

然后我可以看到一个完美呈现的子立方体。似乎它是新的运算符导致它无法工作。如果我这样做

cc = new ChildCube(mainCube.getPos());
cc.setMovementAngle(angle);
childCubes.addElement(cc);

然后我的屏幕上仍然只有我的主立方体。

为什么“new”阻止我的立方体被渲染到屏幕?我的OpenGL部分应该是正确的,因为我静态添加的立方体得到渲染。

1 个答案:

答案 0 :(得分:0)

只是一个建议,但请查看ChildCube的构造函数,并确保正确设置位置。我在两段代码中注意到的不同之处在于,您可以对cc.setPos进行显式调用,但是在不起作用的情况下,您将位置传递给构造函数。