Объект не движется

Итак, я хочу повернуть объект, я вызываю glPushMatrix (), чтобы сохранить матрицу, glTranslatef, потому что я хочу, чтобы у объекта была собственная ось, поэтому я перемещаю объект в середину экрана, затем выполняю поворот, вызовите glPopMatrix () и ничего не произойдет: D

package Tanc;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.*;
public class Tanc{

public Tanc(){
    try{
        Display.setDisplayMode(new DisplayMode(640,480));
        Display.setTitle("Tancc");
        Display.create();
    }catch(LWJGLException e){
        e.printStackTrace();
    }
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();
    GL11.glOrtho(1, 1, 1, 1, 1, -1);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glMatrixMode(GL11.GL_PROJECTION);

    float y_angle = 0;

    while (!Display.isCloseRequested()) {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glPushMatrix(); 

/*     
        GL11.glRectd(0, 0, 0.2f, 0.3f);
       // GL11.glRotated(50, 1, 0, 0);
      //  GL11.glRotated(50, 0, 1, 0);
        GL11.glRotated(1, 0, 0, 1);
    //    GL11.glTranslatef(0, 0, 0);
        GL11.glTranslatef(-0.1f, -0.15f, 0);
     //   GL11.glTranslatef(-1f, -0.15f, 0);
        GL11.glPopMatrix();
*/
        GL11.glLoadIdentity();
        GL11.glPushMatrix();
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex2f(0f, 0f);
        GL11.glVertex2f(0.2f, 0f);
        GL11.glVertex2f(0.2f, 0.3f);
        GL11.glVertex2f(0f, 0.3f);
        GL11.glEnd();
        GL11.glTranslatef(-0.1f, -0.15f, 0);
        GL11.glRotatef(30, 1, 0, 1);
        GL11.glPopMatrix();
        Display.update();
        Display.sync(60);
    }       
    Display.destroy();
    System.exit(0);
}

public static void main(String[] args){
    new Tanc();
}

}


person Florin Marin    schedule 01.11.2013    source источник


Ответы (3)


Это потому, что вы делаете одно и то же в каждом кадре.

Вы: создаете треугольник, перемещаете его и вращаете от 0 до 30 градусов. В следующем кадре все сбрасывается, и он делает то же самое, поворачивается от 0 до 30 градусов.

Вам нужны какие-то постоянные данные.

GL11.glRotatef(xRot, 1, 0, 1);
//...
xRot = xRot > 360 ? 0 : xRot + 10;
person Captain Skyhawk    schedule 01.11.2013
comment
Не имеет смысла. У вас вообще есть опыт программирования? Если нет, я бы вернулся к основам, прежде чем погрузиться в 3D-программирование. - person Captain Skyhawk; 01.11.2013
comment
Кроме того, убедитесь, что вы объявляете xRot вне цикла while, иначе вы столкнетесь с той же проблемой. - person Captain Skyhawk; 01.11.2013
comment
Да, это вне цикла while :) - person Florin Marin; 01.11.2013
comment
@FlorinMarin, почему вы разместили тот же вопрос, я уже ответил на ваш другой вопрос примерно о том же. - person vallentin; 02.11.2013

Ответ капитана Скайхока правильный.

Кроме того, сделайте свои преобразования ПЕРЕД рисованием.

person Uli Holtmann    schedule 02.11.2013

Я наконец исправил это :) и он вращает только один объект: D.

 package Tanc;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.*;
public class Tanc{
private void useless(){
    /*     
    GL11.glRectd(0, 0, 0.2f, 0.3f);
   // GL11.glRotated(50, 1, 0, 0);
  //  GL11.glRotated(50, 0, 1, 0);
    GL11.glRotated(1, 0, 0, 1);
//    GL11.glTranslatef(0, 0, 0);
    GL11.glTranslatef(-0.1f, -0.15f, 0);
 //   GL11.glTranslatef(-1f, -0.15f, 0);
    GL11.glPopMatrix();
*/

       //          GL11.glLoadIdentity();
         }
    public Tanc(){

    try{
        Display.setDisplayMode(new DisplayMode(640,480));
        Display.setTitle("Tancc");
        Display.create();
    }catch(LWJGLException e){
        e.printStackTrace();
    }
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();
    GL11.glOrtho(1, 1, 1, 1, 1, -1);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glMatrixMode(GL11.GL_PROJECTION);

    float y_angle = 0;
    float xrot= Mouse.getDY();
    float yrot =Mouse.getDX();
    float a=0,b=0,c=0;
    while (!Display.isCloseRequested()) {  

        GL11.glPushMatrix();
        GL11.glRotatef(yrot, 0, 0, 1);
        GL11.glRotatef(xrot, 0, 0, 1);
        GL11.glTranslatef(a, b, 0);
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);


        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex2f(0f, 0f);
        GL11.glVertex2f(0.2f, 0f);
        GL11.glVertex2f(0.2f, 0.3f);
        GL11.glVertex2f(0f, 0.3f);   
        GL11.glEnd(); 



       if(Keyboard.isKeyDown(Keyboard.KEY_A)){
        xrot = xrot > 360 ? 0 : xrot + 5;
     //   a += 0.01f;
      //  b += 0.01f;
       }
    //   if(Keyboard.isKeyDown(Keyboard.KEY_D)){
           // if(xrot>360){
           //   xrot = 0;
            //}else {
                xrot += Mouse.getDY()*1f;
                yrot -= Mouse.getDX()*1f;
           // }
    //   }
        GL11.glPopMatrix();

        GL11.glBegin(GL11.GL_QUADS);


        GL11.glVertex2f(0.2f, 0.2f);
        GL11.glVertex2f(0.3f, 0.2f);
        GL11.glVertex2f(0.3f, 0.3f);
        GL11.glVertex2f(0.2f, 0.3f);   
        GL11.glEnd(); 

        Display.update();
        Display.sync(60);
    }       
    Display.destroy();
    System.exit(0);
}

public static void main(String[] args){
    new Tanc();
}

}

person Florin Marin    schedule 02.11.2013