Add vertical shift to 3ds max exporter / babylon camera's

In regard to this post i made.

I would be nice if we can apply the vertical shift to a camera in babylon since we would like to use this feature to match the canvas with renders from 3ds max.

Thanks in advance!
Axel

Adding @drigax and @Guillaume_Pelletier

Interesting! I wasn’t aware of this camera setting. I don’t think our cameras currently support this without adding some extra math to our view projection calculation logic, do you know @sebavan or @Evgeni_Popov? Also is there a significant difference in 3dsMax between shifting the camera and translating it?

1 Like

Hi, so here is what happens in max when you turn on the vertical shift of a camera.

my scene looks like this when the vertical shift is turned off:


As you can see on the left the camera is at eye height and looking up at the ‘buildings’, on the right is what the camera sees. There I’ve drawn some lines on it to make it clear that the vertical lines are not going perfectly straight up.

Now here is the same view with the vertical shift turned on:


as you can see here the lines do go perfectly up which is not realistic to be clear, but it just looks better for architectural renders.

I’m also not sure how it exactly works in 3ds max but i you can see the camera is looking straight ahead instead of at its target.
Schermafbeelding 2021-01-15 081138 This is what the camera now sees but it only shows the green as the camera viewport.

This is very different from just translating the camera as you would have to move the camera to the vertical center of the buildings which isn’t an option in our case.

Thanks for the quick replies, i hope this explanation helps! (also sorry for posting 3 answers but i can only put 1 image per post)

1 Like

I don’t think either, as it seems it is a tilting of the projection plane. Not sure how to do that…

Hi,

Is there any progress on the implementation or investigation into this feature?
We’d really like this feature as it’s a common technique in architectural renderings.
Also it’s supported in all main 3D software packages, like max, maya, blender, etc.
Here is a short video on youtube which explains the technique used in blender.

Here is a preview of what this would look like in 3dsMax

Would be great to be able to use this feature in our future projects.
Please let me know if you need any other additional info on this topic.
Thank you
Pieter

Hi!

Has there been any consideration on implementing this feature?
We are very excited to start using babylon!

Kind regards

Thanks for the reminder. I created this issue to track this feature: Add camera lens shift · Issue #10119 · BabylonJS/Babylon.js · GitHub

However I don’t believe that the team will be able to implement this quickly, if you’re waiting on this feature. Often with such specialized asks, it may be easier to implement this on our behalf, we’re always happy to accept a PR :slight_smile:

I’m on it :+1:

2 Likes

you are the best

2 Likes

This PR implements what you need. It is still to be reviewed, but once it is merged, you will be able to use camera.applyVerticalCorrection() or camera.projectionPlaneTilt

I’ll post the maths I used below as an FYI

2 Likes

Let’s just set ourselves in the camera view space. In BJS left-handed convention, Z is forward in the look direction, X is right and Y is up. (On the drawing, X is toward us)

Here on the drawing, projection plane untilted is AC. Projection plane tilted by angle alpha is EF. Camera is B on the left

By definition, a perspective projection projects every point P in the scene on the projection plane (here lying at Z), along the direction BP, that’s the pinhole model. We get the projected point G by dividing P’s coordinates by P.z, the z coordinate, with a projection matrix :

        (
            a, 0, 0, 0,
            0, b, 0, 0,
            0, 0, c, 1,
            0, 0, d, 0
        )

The 1 in the last column allows us to get this division when we normalize homogeneous coordinates with w.

But in our case, we want to project on the tilted plane directed by EF to get H, and still along the direction BP. For that, we want to find the z-coordinate of H, written as z on the image. For this we just need a bit of geometry :

As similar triangle, we have Y / Z = y / z, so y = Y * z / Z
With some trigonometry in the triangle HIO, we get : z = Z - y * tan(alpha)
We replace with above : z = Z - Y * z * tan(alpha) / Z.
Grouping z together : z = Z / (1 + Y * tan(alpha) / Z)

Now we are ready to use P’s coordinates (Px, Py, Pz) :
As similar triangles, Py / Pz = Y / Z, so Y = Py * Z / Pz

We replace : z = Z / (1 + Py * tan(alpha) / Pz).

Now, perspective projection is about multiplying every coordinate of P by the same thing to get Pz => z, so here, we are going to multiply everything by z / Pz, hence :

Px
Py
Pz  
=> 
Px * Z / (Pz + Py * tan(alpha)), 
Py * Z / (Pz + Py * tan(alpha)), 
Pz * Z / (Pz + Py * tan(alpha))

In matrix form, this new transformation is :

        (
            a, 0, 0, 0,
            0, b, 0, tan(alpha),
            0, 0, c, 1,
            0, 0, d, 0
        )
3 Likes