我很难实现屏幕上OpenGL形状的旋转和移动。基本上,我想要实现的是能够使用触摸屏控制形状。 无论我触摸哪里,它都应该向那个方向旋转并开始向前移动直到它到达那里。
以下是onSurfaceChanged()
中设置平截头体和相机的代码:
glViewport(0, 0, width, height);
float sizeRatio = (float) width / height;
Matrix.frustumM(
projectionMatrix, 0, -sizeRatio, sizeRatio, -1.0f, 1.0f, 1.0f, 20.0f
);
Matrix.setLookAtM(
viewMatrix, 0, 0, 0, -60, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f
);
Matrix.multiplyMM(globalMvpMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
以及onTouchEvent()
处理触摸输入的方式(shape
是存储位置和旋转的对象,然后在屏幕上绘制形状):
lastTouchX = event.getX();
lastTouchY = event.getY();
float shapePosX = shape.getPositionX();
float shapePosY = shape.getPositionY();
int[] viewport = new int[4];
glGetIntegerv(GL_VIEWPORT, viewport, 0);
float[] unprojectedTouchCoords = new float[4];
GLU.gluUnProject(
lastTouchX, lastTouchY, 0,
viewMatrix, 0,
projectionMatrix, 0,
viewport, 0,
unprojectedTouchCoords, 0
);
float unprojectedX = unprojectedTouchCoords[0] / unprojectedTouchCoords[3];
float unprojectedY = unprojectedTouchCoords[1] / unprojectedTouchCoords[3];
float rotation = 90 - (float) Math.toDegrees(Math.atan2(
shapePosY - unprojectedY, shapePosX - unprojectedX
));
shape.setRotation(rotation);
float moveX = 2 * (float) Math.cos(Math.toRadians(rotation));
float moveY = 2 * (float) Math.sin(Math.toRadians(rotation));
shape.move(moveX, moveY);
然而,它似乎并不好用。形状在错误的方向上移动,并且只有在形状的位置为(0,0)时旋转才是正确的。在任何其他情况下,它都会中断。
我想这个问题涉及相机与OpenGL空间中的形状之间的距离,但我不知道在哪里以及如何解决这个问题。我试着让相机更接近形状,但没有明显改善。
你能帮帮我吗?我真的很沮丧。
答案 0 :(得分:0)
我没有深入研究你的代码,但我真的想给你一个建议:转换的顺序在OpenGL中很重要,因为它们是累积的。
这意味着 rotate and translate
与 translate and rotate
不同。
Here是了解我所说的内容的良好起点。
答案 1 :(得分:0)
好像你有协调计算问题。您需要@Override
onTouchEvent
的{{1}}方法,其余位于
GLSurfaceView