Java 如何旋转形状,它是旋转的单个零件的集合?

Java 如何旋转形状,它是旋转的单个零件的集合?,java,opengl,rotation,lwjgl,jogl,Java,Opengl,Rotation,Lwjgl,Jogl,我的画又是一个小线条或圆圈的集合,我以不同的角度旋转(大部分是线条)。 现在我想把这整幅画旋转到某个角度 你可以看到我想要达到的目标。 所以我的问题是如何旋转整个图形 @Override public void display(GLAutoDrawable arg0) { final GL2 gl = arg0.getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

我的画又是一个小线条或圆圈的集合,我以不同的角度旋转(大部分是线条)。 现在我想把这整幅画旋转到某个角度

你可以看到我想要达到的目标。 所以我的问题是如何旋转整个图形

@Override
public void display(GLAutoDrawable arg0) {
    final GL2 gl = arg0.getGL().getGL2();
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
   
    drwaMan(gl);
    gl.glFlush();
   
}

private void drwaMan(GL2 gl) {
    // this line is not working i was hoping by doing something like this entire shape will rotate
    //gl.glRotatef(15, 0f, 0f, 1.0f);
    
    float radius = 50;
    float cx = 100, cy = 400; // center of circle
    int bodyAngel = 180; // draw line at angel
    float bodyLineLength = 150;
    int lineAngel = 270;

    // calculate first point of line 
    float px = (float) (radius * Math.sin(Math.toRadians(bodyAngel))) + cx;
    float py = (float) (radius * Math.cos(Math.toRadians(bodyAngel))) + cy;
    
    // draw head
    drawCircle(gl,radius,cx,cy);
    // draw line
    drawBoadyLine(gl,px,py,bodyLineLength,lineAngel);
    
    // drawhands 50 distance from starting point
    drawHands(gl,px,py-50,225,315,100);
    
    // lags at end of line
    drawHands(gl,px,py-150,225,315,100);
}

void drawCircle(GL2 gl,float radius,float cx,float cy)
{
   gl.glLoadIdentity();
   gl.glColor3f(1.0f, 1.0f, 1.0f);
   gl.glBegin(GL.GL_LINE_LOOP);
 
   for (int i = 0; i <= 360; i++) {
            float x1, y1;
            x1 = (float) (radius * Math.sin(Math.toRadians(i))) + cx;
            y1 = (float) (radius * Math.cos(Math.toRadians(i))) + cy;
            gl.glVertex2d(x1,y1);
    }
 
   gl.glEnd();
}
private void drawHands(GL2 gl, float x, float y, int a1, int a2,int l) {

    gl.glLoadIdentity();
    gl.glTranslatef(x, y, 0);
    gl.glRotatef(a1, 0, 0, 1);
    
    gl.glBegin(GL.GL_LINE_LOOP);
        gl.glVertex2f(0, 0);
        gl.glVertex2f(l, 0);
    gl.glEnd();
    
    gl.glLoadIdentity();
    gl.glTranslatef(x, y, 0);
    gl.glRotatef(a2, 0, 0, 1);
    gl.glBegin(GL.GL_LINE_LOOP);
        gl.glVertex2f(0, 0);
        gl.glVertex2f(l, 0);
    gl.glEnd();
}

private void drawBoadyLine(GL2 gl, float x, float y, float bodyLineLength, int bodyAngel) {
    gl.glLoadIdentity();
    gl.glTranslatef(x, y, 0);
    gl.glRotatef(bodyAngel, 0f, 0f, 1.0f);
    
    gl.glBegin(GL.GL_LINE_LOOP);
        gl.glVertex2f(0, 0);
        gl.glVertex2f(bodyLineLength, 0);
    gl.glEnd();
    
}
@覆盖
公共空白显示(自动绘图arg0){
最终GL2 gl=arg0.getGL().getGL2();
gl.glClear(gl.gl_颜色_缓冲_位| gl.gl_深度_缓冲_位);
德瓦曼(德国劳埃德);
gl.glFlush();
}
私人无效数据管理员(GL2 gl){
//这条线不起作用,我希望通过这样做,整个形状会旋转
//gl.glRotatef(15,0f,0f,1.0f);
浮动半径=50;
浮点cx=100,cy=400;//圆心
int bodyAngel=180;//在角度处画线
浮体线条长度=150;
int lineAngel=270;
//计算直线的第一点
浮点数px=(浮点数)(半径*数学正弦(数学托拉半径(体角))+cx;
float py=(float)(半径*数学cos(数学toRadians(bodyangle)))+cy;
//牵引头
绘制圆(gl、半径、cx、cy);
//划线
拉丝绳(gl、px、py、车身线长度、线性天使);
//拉手距起点50米
拉手(德国劳埃德船级社,px,py-50225315100);
//线尾滞后
拉手(德国劳埃德船级社,px,py-150225315100);
}
空心绘图圆(GL2 gl、浮动半径、浮动cx、浮动cy)
{
gl.glLoadIdentity();
gl.glColor3f(1.0f、1.0f、1.0f);
gl.glBegin(gl.gl\u LINE\u LOOP);

对于(int i=0;i,
drawCircle
的第一个语句是:

gl.glLoadIdentity();
这将重置当前转换矩阵为单位

这使得
gl.glRotatef(15,0f,0f,1.0f);
调用无效

您应该删除对
glLoadIdentity
的所有调用,并在
display
函数中的
glClear
之后只执行一次

你还应该看看:

  • 要知道巫婆矩阵受到了影响
  • 允许您执行临时转换(对象的部分)

    • drawCircle的第一句话是:

      gl.glLoadIdentity();
      
      这将重置当前转换矩阵为单位

      这使得
      gl.glRotatef(15,0f,0f,1.0f);
      调用无效

      您应该删除对
      glLoadIdentity
      的所有调用,并在
      display
      函数中的
      glClear
      之后只执行一次

      你还应该看看:

      • 要知道巫婆矩阵受到了影响
      • 允许您执行临时转换(对象的部分)

      听起来像是2D变换。我发现这是一种变换的备忘。@dbrown93这篇文章只是关于理论知识,没有关于任何api如何实现这一点的真实例子。是的,但它只是应用关于围绕一个点旋转的部分。所以你可以翻译“中心”从人到原点,旋转坐标,然后将人向后平移你应该做一些对我来说听起来像2D变换的事情。我发现这是一种变换的备忘表。@dbrown93这篇文章只是关于理论知识,没有关于如何通过任何api实现这一点的真实示例。是的,但它只是简单的应用程序将零件绕一点旋转,这样就可以平移“中心”将人的坐标移动到原点,旋转坐标,然后将人向后平移。你应该做一些事情,删除整个形状,使其断开连接,并在随机位置绘制形状。也许,但你可以取消glRotate命令的注释,并看到“随机”图像旋转。实际上,没有随机的,你必须进一步思考需要变换的位置(如关节)你的坐标必须是静态的。掌握基础的变化需要时间。通过删除整个形状会断开连接,并且形状可能在随机位置绘制,但是你可以取消glRotate命令的注释,并看到“随机”图像旋转。实际上,没有随机的,你必须进一步考虑你想要在哪里绘制变换(如关节)和坐标必须是静态的。掌握基础变换需要时间。