Affine Transformation Coordinate System Explain

I am using Affine Transformation to position my game objects on screen. My applet is 320 * 240, yet the leftmost edge is -80 for one of the objects so far and the rightmost being 240. The object in question is a 32 * 8 rectangle shape. To me it seems my coordinates are “crooked”. Could someone please explain this to me? Any assistance in this matter would be greatly appreciated.

Sincerely,

8BitOoze

Is it 2D or 3D?

How do you create the transformation? Directly with the matrix or using a helper function like translate(), rotate(), lookAt() etc. ?

It is possible to create a shew transformation with with an affine transform, if that is what you mean by “crooked”.

Show some of your code! :slight_smile:

2D

Using g2d.translate(object.getX(), object.getY());

Ok, here’s a link to the latest version of my code with the shrewed affine transformation link

Any assistence in this matter would be greatly appreciated.

Sincerely,

8BitOoze

The problem is that you both translate the shape in the constructor for Ball and Paddle AND in the drawing.

This is the explanation for the extra offset. Just set the translation in the constructors to zero and it will work.

I don’t understand what you mean.

Paddle constructor:


// class constructor
	public Paddle(double x, double y, double width, double height)
	{
		// set the paddles x position
		setX(x);
		// set the paddles y position
		setY(y);
		// set the paddles width
		setWidth(width);
		// set the paddles height
		setHeight(height);
		// set the paddles shape
		setShape(new Rectangle((int)getX(), (int)getY(), (int)getWidth(), (int)getHeight()));
	}

Ball Constructor:


// class constructor
	public Ball(double x, double y, double width, double height)
	{
		// set the balls x position
		setX(x);
		// set the balls y position
		setY(y);
		// set the balls width
		setWidth(width);
		// set the balls height
		setHeight(height);
		// set the balls shape
		setShape(new Rectangle((int)getX(), (int)getY(), (int)getWidth(), (int)getHeight()));
	}

I don’t see any g2d.transform() in there anywhere. If you mean changing my EightBitOoze constructor as follows:


public final void init()
	{
		// create the backbuffer for smooth graphics
		backbuffer = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
		g2d = backbuffer.createGraphics();

		// create the identity transform
		identity = new AffineTransform();

		// create an instance of the paddle object
		paddle = new Paddle(getSize().width / 4, 106, 32, 8);

		// set the paddle's x velocity
		paddle.setVX(2);

		// create an instance of the ball object
		ball = new Ball(getSize().width / 4, 10, 8, 8);

		// set the players score to 0
		score = 1234;

		// start the user input listener
		addKeyListener(this);
	}

And changing the update method to:


public final void update(Graphics g)
	{
		// erase the background
		g2d.setPaint(Color.LIGHT_GRAY);
		g2d.fillRect(0, 0, getSize().width, getSize().height);

		// draw the statusbar
		g2d.setPaint(Color.GREEN);
		g2d.fillRect(0, getSize().height - STATUSBARHEIGHT, getSize().width, STATUSBARHEIGHT);

		// draw the players score
		g2d.setPaint(Color.WHITE);
		g2d.drawString("Score: " + Integer.toString(score), 0, (getSize().height - STATUSBARHEIGHT) + (STATUSBARHEIGHT /2));

		// draw the ball
		g2d.setPaint(Color.BLUE);
		g2d.translate(ball.getX(), ball.getY());
		g2d.fill(ball.getShape());

		// draw the paddle
		g2d.translate(paddle.getX(), paddle.getY());
		g2d.fill(paddle.getShape());

		// repaint the applet window
		paint(g);
	}

Then please let me know as I’m not sure what you mean when you say I’m translating on the ball/paddle constructor when I can’t see a single translate call in them. Any assistance in this matter would be greatly appreciated.

Sincerely,

8BitOoze

The shape is translated with this statement:


setShape(new Rectangle((int)getX(), (int)getY(), (int)getWidth(), (int)getHeight()));

// Should be this instead:
// setShape(new Rectangle(0, 0, (int)getWidth(), (int)getHeight()));


In the animation you draw the same shape translated once more but then you draw the shape that is positioned at the initial (getX(), getY()) position and you get an offset.

Wow i didn’t know that thanks. I did what you said and it worked.

Sincerely,

8BitOoze