我有一个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 childCubesfor (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部分应该是正确的,因为我静态添加的立方体得到渲染。
答案 0 :(得分:0)
只是一个建议,但请查看ChildCube的构造函数,并确保正确设置位置。我在两段代码中注意到的不同之处在于,您可以对cc.setPos进行显式调用,但是在不起作用的情况下,您将位置传递给构造函数。