Android Opengl中的旋转问题
我一直试图在Opengl es for android中使一个点围绕另一个点旋转。它工作,但在一个特定的方式。随着旋转越来越大(即接近90°),点离旋转中心越来越远。最终点在椭圆轨道上围绕旋转中心旋转,但我希望它以圆形方式旋转。有人知道我怎么能做到这一点吗?多谢各位Android Opengl中的旋转问题,android,opengl-es,rotation,Android,Opengl Es,Rotation,我一直试图在Opengl es for android中使一个点围绕另一个点旋转。它工作,但在一个特定的方式。随着旋转越来越大(即接近90°),点离旋转中心越来越远。最终点在椭圆轨道上围绕旋转中心旋转,但我希望它以圆形方式旋转。有人知道我怎么能做到这一点吗?多谢各位 package org.example.pointtest; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;
package org.example.pointtest;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
public class LegRoot
{
public FloatBuffer hipVertexBuffer;
float[]hip={1.75f,-2.75f,0.0f};//0 hip
float[]knee={1.75f,-6.75f,0.0f};//1 knee
float[]ankle={1.75f,-10.75f,0.0f};//2 ankle
public float distance2D(float[]origin,float[]extremity)
{
float a=extremity[0]-origin[0];
float b=extremity[1]-origin[1];
float c=extremity[2]-origin[2];
float[] d={a,b,c};
return d[1];
}
public LegRoot()
{
float []hippoint=
{
1.75f,-2.75f,0.0f
};//0 hip
ByteBuffer vbb = ByteBuffer.allocateDirect(1*3*4);
vbb.order(ByteOrder.nativeOrder());
hipVertexBuffer=vbb.asFloatBuffer();
hipVertexBuffer.put(hippoint);
hipVertexBuffer.position(0);
}
public void hip(GL10 gl)
{
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,hipVertexBuffer);// root joint transformation matrix(supposition)
gl.glPushMatrix();
gl.glColor4f(1f, 0f, 0f, 1f);
gl.glRotatef(0f, 0, 0, 1);
gl.glTranslatef(0f,0f, 0);
gl.glDrawArrays(GL10.GL_POINTS, 0, 1);
gl.glPopMatrix();
}
public void knee(GL10 gl)
{
gl.glPushMatrix();
gl.glTranslatef(-hip[0], -hip[1], 0);
gl.glRotatef(0f, 0, 0, 1);
gl.glTranslatef(hip[0], hip[1], 0);
gl.glTranslatef(0,distance2D(hip,knee), 0);
hip(gl);
gl.glPopMatrix();
}
public void ankle(GL10 gl)
{
gl.glPushMatrix();
gl.glTranslatef(-knee[0], -knee[1], 0);
gl.glRotatef(90f, 0, 0, 1);
gl.glTranslatef(knee[0], knee[1], 0);
gl.glTranslatef(0, distance2D(knee, ankle), 0);
knee(gl);
gl.glPopMatrix();
}
}为了得到答案,我复制了我的评论 你的矩阵中可能有一个glScale。可以尝试在绘制之前加载标识矩阵,以确保不涉及比例。但这将删除您以前所做的所有其他转换 另请注意:如果您使用非方形显示器,并且不考虑显示器的纵横比,则这看起来也将是缩放的
对于你的第二个问题:你能发布你所说的轮换语句吗?对于一个新的问题,最好打开一个新的问题。您确定选择了正确的旋转中心吗?对我来说,这听起来像是围绕另一个点旋转。试着绕一整圈看看它是否是一个围绕另一个点的圆。我很有信心我正在围绕一个我定义的点旋转。事实上,这就是我所做的。好吧,那么你的矩阵中可能有一个glScale。可以尝试在绘制之前加载标识矩阵,以确保不涉及比例。但这将删除您以前所做的所有其他转换。另外请注意:如果您使用非方形显示,并且不考虑显示器的纵横比,这看起来也是缩放的。是的,基本上我手机的屏幕不是方形的,而是矩形的,因此当我将视口定义为gl.glviewport(0,0,w,h)时,它不是方形,而是矩形。我更改了视口。现在天气很好。但我还有一个问题。当我定义一个旋转角度时,例如glrotatef(90,0,0,1),我的点是旋转180°,在我的程序中没有其他的glrotatef,我不知道它为什么会这样做。谢谢你的第一个问题我的问题解决了,我刚刚重写了程序,效果很好,谢谢