我在这里遇到了一个问题。我设置了一个速度为x和y的正方形抛射物,并通过这样设置顶点位置,将实际的正方形绘制到这个位置
代码:
vertices.put(new float[] { x1, y1, 1, 1, 1, 1, 0.0f, 1.0f,
x2, y2, 1, 1, 1, 1, 1.0f, 1.0f,
x3, y3, 1, 1, 1, 1, 1.0f, 0.0f,
x4, y4, 1, 1, 1, 1, 0.0f, 0.0f });
// x y r g b A u|s v|t
其中所有的x都是我经过的角落的位置。
然后我将这个矩形(l2rArrow)沿着x&y轴,并让屏幕跟随它:
boolean hasTranslated = false;
if (!l2rArrow.isFired) { // if the arrow has not yet been fired we render it thus
gl.glPushMatrix(); //save our state
gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate
gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it
texture.bind(gl, Texture.TEXTURE_L2RARROW);
mRect = new MeshRect(l2rArrow.getMyRect());
mRect.Draw(GL10.GL_TRIANGLES, gl);
gl.glPopMatrix(); //return to saved state
} else { // the arrow has been fired so we need to render it like this and have the "camera" follow it
hasTranslated = true;
gl.glPushMatrix();
gl.glLoadIdentity();
float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
if (camY > 0) { camY = 0;}
if (camX < -4800) { camX = -4800;}
gl.glTranslatef(camX, camY,0f);
l2rArrow.Update(deltaTime);
texture.bind(gl, Texture.TEXTURE_L2RARROW);
mRect = new MeshRect(l2rArrow.getMyRect());
mRect.Draw(GL10.GL_TRIANGLES, gl);
if (l2rArrow.hasCollided) {
//run collision code for detecting a hit and ending turn
}
}
这同样有效。当炮弹发射时,我们会完美地跟随它。现在,虽然我希望箭头指向箭头行进的角度。所以我需要在飞行途中将箭头旋转到。我试着把这个箭头翻译回0,0旋转它,然后把它放回,但当我把箭头放回时,它画在旋转平面的坐标上。
} else {
hasTranslated = true;
gl.glPushMatrix();
gl.glLoadIdentity();
float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
if (camY > 0) { camY = 0;}
if (camX < -4800) { camX = -4800;}
gl.glTranslatef(camX, camY,0f);
gl.glPushMatrix();
gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
gl.glRotatef((float) l2rArrow.getAngle(), 0f, 0f, 1f); //rotate
gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f);
l2rArrow.Update(deltaTime);
texture.bind(gl, Texture.TEXTURE_L2RARROW);
mRect = new MeshRect(l2rArrow.getMyRect());
mRect.Draw(GL10.GL_TRIANGLES, gl);
gl.glPopMatrix();
if (l2rArrow.hasCollided) {
//run collision code for detecting a hit and ending turn
}
}
我理解这一点。如何旋转箭头,然后将其移回未旋转平面上的位置?
当Y=0时,箭头停止,并且从现在起,Y=0以旋转角度运行。
经过大量的研究和思考,我决定改变我在世界中放置对象的方式。我现在使用的似乎是Normal方法,即glTranslate将它们转换到适当的位置。
现在一切都很完美。
显然,我以前做这件事的方式很糟糕,因为直接将顶点绘制到你想要的空间中(不是在原点绘制,然后平移)可能会变得很混乱。