проблема вращения на OpenGL - PullRequest
       23

проблема вращения на OpenGL

1 голос
/ 01 августа 2011

Я пытался заставить точку вращаться вокруг другой точки в OpenGLES для 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();
}

}

1 Ответ

0 голосов
/ 01 августа 2011

Просто чтобы получить ответ, я скопировал свой комментарий.

Возможно, в вашей матрице есть glScale. Вы можете попытаться загрузить матрицу идентичности перед рисованием, чтобы убедиться, что масштаб не задействован. Но это удалит все другие преобразования, которые вы делали раньше.

Также обратите внимание: если у вас не квадратный дисплей и вы не учитываете соотношение сторон экрана, он также будет выглядеть масштабированным.

Для вашей второй проблемы: Вы можете опубликовать заявление о вращении, которое вы имеете в виду? А может быть, лучше открыть новый вопрос для новой проблемы.

...