Я хочу нарисовать крупье на основе скелетной анимации.По сути, крупье должно уметь воспроизводить движения, подобные человеческим, такие как ходьба ... Я создал код под следующей логикой: в крупье есть разные типы суставов:детский сустав тоже должен двигаться.Аналогия может состоять в том, что если вы поворачиваете свой локтевой сустав (то есть родительский сустав), сустав запястья (детский сустав) также всегда будет двигаться.У меня есть нерабочий код, который предполагает рисовать суставы левой ноги.
package org.example.pointtest;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
public class SimplePoint
{
public FloatBuffer hipVertexBuffer;
public FloatBuffer kneeVertexBuffer;
public FloatBuffer ankleVertexBuffer;
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
float[][]leftleg={hip,knee,ankle};
FloatBuffer []VertexBuffers={kneeVertexBuffer,ankleVertexBuffer};
FloatBuffer[]CompleteVertexBuffers={hipVertexBuffer,kneeVertexBuffer};
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 SimplePoint()
{
float []hippoint=
{1.75f,-2.75f,0.0f};//0 hip
float[]kneepoint=
{1.75f,-6.75f,0.0f};//1 knee
float[]anklepoint=
{1.75f,-10.75f,0.0f};//2 ankle
ByteBuffer vbb = ByteBuffer.allocateDirect(1*3*4);
vbb.order(ByteOrder.nativeOrder());
hipVertexBuffer=vbb.asFloatBuffer();
hipVertexBuffer.put(hippoint);
hipVertexBuffer.position(0);
ByteBuffer kbb = ByteBuffer.allocateDirect(1*3*4);
kbb.order(ByteOrder.nativeOrder());
kneeVertexBuffer=kbb.asFloatBuffer();
kneeVertexBuffer.put(kneepoint);
kneeVertexBuffer.position(0);
ByteBuffer abb = ByteBuffer.allocateDirect(1*3*4);
abb.order(ByteOrder.nativeOrder());
ankleVertexBuffer=abb.asFloatBuffer();
ankleVertexBuffer.put(anklepoint);
ankleVertexBuffer.position(0);
}
public void draw(GL10 gl)
{
/*gl.glPushMatrix();
gl.glTranslatef(0, 1, 0);
gl.glDrawArrays(GL10.GL_POINTS, 2, 1);
gl.glPopMatrix();
*/
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,hipVertexBuffer);// root joint transformation matrix(supposition)
gl.glColor4f(1f, 0f, 0f, 1f);
gl.glDrawArrays(GL10.GL_POINTS, 0, 1);
gl.glPushMatrix();
int i=0;
while(leftleg[i]!=leftleg[leftleg.length-1])
{
if (leftleg[i]!=leftleg[leftleg.length-1])
{
gl.glTranslatef(0, distance2D(hip, knee), 0);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,VertexBuffers[i]);
gl.glDrawArrays(GL10.GL_POINTS, 0, 1);
gl.glMultMatrixf(CompleteVertexBuffers[i]);
gl.glPushMatrix();
}
if(leftleg[i]==leftleg[leftleg.length-1])
{
gl.glPopMatrix();
}
i++;
}
}
}