- Home /
Issue with Perspective Camera with a specific view.
Hello Unity community. I have a little problem about perspective camera. What I want to achieve is similar to the following screenshot but I want the 2 side images on top of the screen.
However, when I adjust the y position of the image, what I get is the following screenshot.
So, to conclude my problem. I want the view like the first image but position like the second image and I don't know how to do it. So, any suggestion? Thank you!
I am guessing a good answer would include the use of a custom projection matrix.
Basically, you want projection on the X and Z axis, but the Y axis should be orthographic. I don't even now if that's possible with a custom projection matrix. You might want to look at Thin$$anonymous$$atrix's openGL tutorials where he covers projection matrices. But I have no idea how to combine 2 types of projection matrices in different axes.
Answer by Bodrp · Apr 16, 2017 at 08:45 AM
Right here I think is what you need. I tweaked gfoot's code a little to get this:
using UnityEngine;
public class ProjectionMatrixCustomizer : MonoBehaviour
{
[SerializeField] float left = -5;
[SerializeField] float right = 5;
[SerializeField] float bottom = -10;
[SerializeField] float top = 1;
[SerializeField] float dist = 15;
public void Update()
{
Camera.main.projectionMatrix = PerspectiveOffCenter(left, right, bottom, top, dist, Camera.main.nearClipPlane, Camera.main.farClipPlane);
}
Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float dist, float near, float far)
{
float x = 2.0f * dist / (right - left);
float y = 2.0f * dist / (top - bottom);
float a = (right + left) / (right - left);
float b = (top + bottom) / (top - bottom);
float c = -(far + near) / (far - near);
float d = -(2.0f * far * near) / (far - near);
float e = -1.0f;
var m = new Matrix4x4();
m[0, 0] = x;
m[0, 1] = 0;
m[0, 2] = a;
m[0, 3] = 0;
m[1, 0] = 0;
m[1, 1] = y;
m[1, 2] = b;
m[1, 3] = 0;
m[2, 0] = 0;
m[2, 1] = 0;
m[2, 2] = c;
m[2, 3] = d;
m[3, 0] = 0;
m[3, 1] = 0;
m[3, 2] = e;
m[3, 3] = 0;
return m;
}
}
From there, I fiddled with the serialized fields to get what I wanted. Which I didn't. But I managed to get what YOU wanted (maybe). Whatever you do, if you leave Top
value near 0
, you should be able to get the desired effect.
When you're done, I suggest you change the Update()
method for a Start()
method to avoid recalculating the matrix every frame.
Your answer
Follow this Question
Related Questions
Google cardboard - Wrong cameras? 0 Answers
How to end a cinematic camera cycle 1 Answer
My Camera Do Not Limit Its Angles And It Glitches, How I Can Solution It? 0 Answers
Camera projection matrix parameters unit 1 Answer
When I run my builds I get a blank screen, in the editor they run fine 0 Answers