Android Opengl中的旋转问题

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;

我一直试图在Opengl es for android中使一个点围绕另一个点旋转。它工作,但在一个特定的方式。随着旋转越来越大(即接近90°),点离旋转中心越来越远。最终点在椭圆轨道上围绕旋转中心旋转,但我希望它以圆形方式旋转。有人知道我怎么能做到这一点吗?多谢各位

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,我不知道它为什么会这样做。谢谢你的第一个问题我的问题解决了,我刚刚重写了程序,效果很好,谢谢