Skip to content

Instantly share code, notes, and snippets.

@joonjoonjoon
Created October 21, 2020 00:21
Show Gist options
  • Save joonjoonjoon/2b19a1e0a9f9634f4cb66cb737cbab7a to your computer and use it in GitHub Desktop.
Save joonjoonjoon/2b19a1e0a9f9634f4cb66cb737cbab7a to your computer and use it in GitHub Desktop.
a quick experiment on how to do 2D zooms on a 3D camera
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class DebugTestZoom : MonoBehaviour
{
public Vector2 pers;
public float zoom;
Matrix4x4 matrix;
Camera camera;
// Start is called before the first frame update
void Start()
{
camera = GetComponent<Camera>();
matrix = camera.projectionMatrix;
}
void Update()
{
zoom = Mathf.Clamp(zoom, 1, 5);
var limitPers = Mathf.Abs(Mathf.Abs(zoom)-1);
pers.x = Mathf.Clamp(pers.x, -limitPers, limitPers);
pers.y = Mathf.Clamp(pers.y, -limitPers, limitPers);
SetVanishingPoint(GetComponent<Camera>(), pers);
}
void SetVanishingPoint (Camera cam, Vector2 perspectiveOffset) {
var m = cam.projectionMatrix;
var width = 2*cam.nearClipPlane/matrix.m00 / zoom;
var height = 2*cam.nearClipPlane/matrix.m11 / zoom;
perspectiveOffset.x *= width / 2f;
perspectiveOffset.y *= height / 2f;
var left = (-width / 2 - perspectiveOffset.x);
var right = (left + width);
var bottom = (-height / 2 - perspectiveOffset.y);
var top = (bottom + height);
cam.projectionMatrix = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
}
Matrix4x4 PerspectiveOffCenter (float left, float right, float bottom, float top, float near, float far)
{
var x = (2.0f * near) / (right - left);
var y = (2.0f * near) / (top - bottom);
var a = (right + left) / (right - left);
var b = (top + bottom) / (top - bottom);
var c = -(far + near) / (far - near);
var d = -(2.0f * far * near) / (far - near);
var e = -1.0f;
Matrix4x4 m = new Matrix4x4();
m[0,0] = x; m[0,1] = 0.0f; m[0,2] = a; m[0,3] = 0.0f;
m[1,0] = 0.0f; m[1,1] = y; m[1,2] = b; m[1,3] = 0.0f;
m[2,0] = 0.0f; m[2,1] = 0.0f; m[2,2] = c; m[2,3] = d;
m[3,0] = 0.0f; m[3,1] = 0.0f; m[3,2] = e; m[3,3] = 0.0f;
return m;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment