# Having trouble undoing a camera() transformation

hi, I’ve tried searching for a solution online but I wasn’t able to find one I could understand. I’m kinda new to coding in general. This is what I’ve got so far;

``````  //make varuables
PVector offset = new PVector(width/2,height/2);
mouse = new PVector(mouseX,mouseY);

//if mouse is far enough from center of screen, then adjust the camera position.

//limit how far away the camera is allowed to move from the player.

//apply transformation.
camera(cam.x,cam.y,zoom,  cam.x,cam.y,0,  0,1,0);

//adjust mouse pos to correct for transformation
``````

I’ve managed to figure out how to correct the x and y values, but as soon as I zoom in or out the mouse position gets distorted. I’ve looked at other threads and they all seemed too complicated for me to understand or implement.

there were some good solutions online but none were usable for me. I need the world pos so I can use it for some other stuff, I can’t just use push() and pop() to fix things. I’ve tried to use screenX and screenY, but those are literally the reverse of what I need. I need to convert a screen position to a world position.

1 Like

You could try modelX(…) etc.

https://processing.org/reference/modelX_.html

from what I can tell that’s just a 3D version of screenX though?

edit: I just figured out a really stupid way to make it work.

``````  cam.add(player.pos.copy().sub(cam).div(50));
camera(cam.x,cam.y,defzoom,cam.x,cam.y,0,0,1,0);

translate(0,0,defzoom-zoom);
for(int i = 0; i<250; i++) {
PVector scrmouse = new PVector(screenX(mouse.x,mouse.y),screenY(mouse.x,mouse.y));
}
``````

Excuse can you describe your solution?

When it’s the Opposite of screenX where do you get the 3D coordinates from the mouse

Or what is mouse class?

That’s not true. But it’s also not what you are looking for.

since I couldn’t find a legitimate way of doing it, I just had a for() loop that repeatedly adds the difference between the actual mouse position and the position the mouse Pvector appears on the screen. Instead of giving the actual position, it just gets it closer and closer after each loop.

Here, I added stuff to make it easier to understand.

``````  setup() {
size(500,500,P3D);
}
draw() {
background(50);

//place a point at actual pos
stroke(255,0,0);
strokeWeight(10);
point(mouseX,mouseY);

//make a PVector to store mouse pos for easy use
PVector mouse = new PVector(mouseX,mouseY);

//put transformations here
//{ ... }

//add first point to show where the computer thinks the mouse PVector is
stroke(255);
strokeWeight(4);
point(mouse.x,mouse.y);

//get closer and closet to the actual pos every loop
//place a point at every loop to show progress
for(int i = 0; i<250; i++) {
//make a temporary PVector that holds the position of the mouse PVector on the screen
PVector screen_mouse = new PVector(screenX(mouse.x,mouse.y), screenY(mouse.x,mouse.y));

//find the difference from the screen pos to the actual pos and add it to the mouse PVector

//make a point for demonstration
stroke(0,map(i,0,250,10,255),0);
point(mouse.x,mouse.y);
}

//place final point to show true pos;
stroke(0,0,255);
point(mouse.x,mouse.y);
}
``````

I don’t think I really understand your question very well. I’m using the z dimension to zoom in. Everything but the camera is at z = 0. I suppose I didn’t actually say that though, so sorry if there was any confusion.

1 Like

Thanks for that