我正在开发一款适用于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向量中每个子多维数据集的行,那么主立方体将保持原样。
有没有人理解为什么主立方体正在移动,并且衍生的子立方体没有出现?如有必要,我会上传整个代码。
答案 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()));