LWJGL Forum

Programming => Lightweight Java Gaming Library => Topic started by: zulo on June 04, 2004, 16:40:58

Title: help me with basic rotating and moving problems
Post by: zulo on June 04, 2004, 16:40:58
Hi

I have some problems with learning basic rotating, I have made a method
for moving a quad and rendering the quad, but when i rotate it always rotates the world, so it doesnt rotate around its own axis.

i want to rotate any object around its own axis without placing it exactly at 0,0

Is this the way its supposed to be? if i load a model then how can i know how to place it at exactly centered at 0,0? adn what if the model moves?

i really need help with this, please help me, i have looked in the opengl red book, and other tutorials + documents and forums and examples but i just cant get this rotating to work.

Here is the code so you can see what i do wrong..

What im trying to do in my render method is, calling firkant() that
moves and rotates and draws a quad on screen. This quad should rotate around its own z axis, but it wont do that unless i draw the quad exactly centered on 0,0

When the quad is drawn im drawing another quad that should not move...

Code: [Select]

 
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.openal.AL;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.Window;
 
/**
 * $Id: Game.java,v 1.3 2004/05/05 14:35:05 cix_foo Exp $
 *
 * This is a <em>very basic</em> skeleton to init a game and run it.
 *
 * @author $Author: cix_foo $
 * @version $Revision: 1.3 $
 */
public class Game {
 
 /** Game title */
 public static final String GAME_TITLE = "My Game";
 
 /** Desired frame time */
 private static final int FRAMERATE = 60;
 
 /** Exit the game */
 private static boolean finished;

private static boolean leftpressed =false;

private static boolean rightpressed =false;

private static float rotated = 0.0f;

private static float rtri = 0;

private static float rquad = 0;

private static int firkantz = 0;

 
 /** My texture */
 //private static int texture;
 
 /**
  * No constructor needed - this class is static
  */
 private Game() {}
 
 /**
  * Application init
  * @param args Commandline args
  */
 public static void main(String[] args) {
  try {
   init();
   run();
  } catch (Exception e) {
   e.printStackTrace(System.err);
   Sys.alert(GAME_TITLE, "An error occured and the game will exit.");
  } finally {
   cleanup();
  }
 }
 
 /**
  * Initialise the game
  * @throws Exception if init fails
  */
 private static void init() throws Exception {
  // Create a fullscreen window with 1:1 orthographic 2D projection, and with
  // mouse, keyboard, and gamepad inputs.
  Window.create(GAME_TITLE);
   
  // Enable vsync if we can
  Window.setVSyncEnabled(true);
   
  // Start up the sound system
  AL.create();
 
  // Enable texture mapping
  //GL11.glEnable(GL11.GL_TEXTURE_2D);
 
  // TODO: Load in your textures etc here
  //texture = loadTexture("data/nehe.png");
 }
 
 /**
* Texture loading directly from LWJGL examples
*/
private final static int loadTexture(String path) {
Image image = (new javax.swing.ImageIcon(path)).getImage();

// Exctract The Image
BufferedImage tex = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = (Graphics2D) tex.getGraphics();
g.drawImage(image, null, null);
g.dispose();

// Flip Image
AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
tx.translate(0, -image.getHeight(null));
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
tex = op.filter(tex, null);

// Put Image In Memory
ByteBuffer scratch = ByteBuffer.allocateDirect(4 * tex.getWidth() * tex.getHeight());

byte data[] = (byte[]) tex.getRaster().getDataElements(0, 0, tex.getWidth(), tex.getHeight(), null);
scratch.clear();
scratch.put(data);
scratch.rewind();

// Create A IntBuffer For Image Address In Memory  
IntBuffer buf = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
GL11.glGenTextures(buf); // Create Texture In OpenGL  

GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
// Typical Texture Generation Using Data From The Image

// Linear Filtering
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
// Linear Filtering
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
// Generate The Texture
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, tex.getWidth(), tex.getHeight(), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, scratch);

return buf.get(0); // Return Image Address In Memory
}


/**
  * Runs the game (the "main loop")
  */
 private static void run() {
  while (!finished) {
   // Always call Window.update(), all the time
   Window.update();
   
   if (Window.isCloseRequested()) {
    // Check for O/S close requests
    finished = true;
   } else if (Window.isActive()) {
    // The window is in the foreground, so we should play the game
    logic();
    render();
    org.lwjgl.Display.sync(FRAMERATE);
   } else {
    // The window is not in the foreground, so we can allow other stuff to run and
    // infrequently update
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {
    }
    logic();
    if (Window.isVisible() || Window.isDirty()) {
     // Only bother rendering if the window is visible or dirty
     render();
    }
   }
  }
 }
 
 /**
  * Do any game-specific cleanup
  */
 private static void cleanup() {
  // TODO: save anything you want to disk here
 
  // Stop the sound
  AL.destroy();
   
  // Close the window
  Window.destroy();
 }
 
 /**
  * Do all calculations, handle input, etc.
  */
 private static void logic() {
  // Example input handler: we'll check for the ESC key and finish the game instantly when it's pressed
  if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
   finished = true;
  }
  if(Keyboard.isKeyDown(Keyboard.KEY_LEFT)){
  leftpressed=true;
  }
  if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT)){
  rightpressed=true;
  }
 
  // TODO: all your game logic goes here.
  if(rotated==360){
  rotated=0;
  }
  else{
  rotated++;firkantz++;
  }
 
 
 
 
 }
 
 public static void firkant(){
 
  GL11.glMatrixMode(GL11.GL_MODELVIEW);
  GL11.glLoadIdentity();
  GL11.glPushMatrix();
 
  GL11.glLoadIdentity();
  movefirkant();
  renderfirkant();

GL11.glPopMatrix();
 }
 public static void movefirkant(){
  GL11.glTranslatef(400.0f,400.0f,0.0f);
  GL11.glRotatef(firkantz,0.0f,0.0f,0.2f);
  }
 public static void renderfirkant(){
  GL11.glBegin(GL11.GL_QUADS);
  GL11.glVertex3f(0.0f, 0.0f, 0.0f);
  GL11.glVertex3f(40.0f, 0.0f, 0.0f);
  GL11.glVertex3f(40.0f, 40.0f, 0.0f);
  GL11.glVertex3f(0.0f, 40.0f, 0.0f);
  GL11.glEnd();
 }
 
 /**
  * Render the current frame
  */
 private static void render() {
 
  GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
 
  firkant();
 
 
  GL11.glLoadIdentity();
  GL11.glTranslatef(400.0f,400.0f,1.0f);
  GL11.glRotatef(rtri,0.0f,0.0f,1.0f);
  GL11.glBegin(GL11.GL_QUADS);
  GL11.glVertex3f(-20.0f, -20.0f, 0.0f);
  GL11.glVertex3f(20.0f, -20.0f, 0.0f);
  GL11.glVertex3f(20.0f, 20.0f, 0.0f);
  GL11.glVertex3f(-20.0f, 20.0f, 0.0f);
  GL11.glEnd();
 
 
   

 }
 
 
}
Title: This might help
Post by: Fool Running on June 07, 2004, 15:49:43
one of your problems (if not your only problem  :wink: ) is that you need to rotate the poly before you translate it in order to create the effect you are going for.

just change:
Code: [Select]

   GL11.glTranslatef(400.0f,400.0f,0.0f);
   GL11.glRotatef(firkantz,0.0f,0.0f,0.2f);

in movefirkant() to:
Code: [Select]

   GL11.glRotatef(firkantz,0.0f,0.0f,0.2f);
   GL11.glTranslatef(400.0f,400.0f,0.0f);


that will help alot  :lol: