Snippets
Revised by
Michelle Chen
069aa2c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityStandardAssets.ImageEffects;
public class CameraMgr : MonoBehaviour
{
public GameObject m_buttonPanel;
private bool m_isFrontFacing = false;
private WebCamDevice m_currCamera;
private WebCamDevice m_backCamera;
private WebCamDevice m_frontCamera;
private WebCamTexture m_cameraTexture;
// Source: https://answers.unity.com/questions/773464/webcamtexture-correct-resolution-and-ratio.html
public AspectRatioFitter m_cameraImageFitter;
// Image rotation
Vector3 m_camRotationVector = new Vector3(0f, 0f, 0f);
// Image uvRect
private Rect m_cameraDefaultRect = new Rect(0f, 0f, 1f, 1f);
private Rect m_cameraFixedRect = new Rect(0f, 1f, 1f, -1f);
// Image Parent's scale
private Vector3 m_cameraDefaultScale = new Vector3(1f, 1f, 1f);
private Vector3 m_cameraFixedScale = new Vector3(-1f, 1f, 1f);
public RawImage m_cameraPlane;
private string m_currFileName;
public ColorCorrectionLookup m_colorCorrectionLookup;
private void Start()
{
m_isFrontFacing = false;
StartCoroutine(SetUpCamera());
}
// Sources:
// https://docs.unity3d.com/ScriptReference/WebCamTexture-ctor.html
// https://docs.unity3d.com/ScriptReference/WebCamTexture-videoRotationAngle.html
// https://docs.unity3d.com/ScriptReference/WebCamTexture-videoVerticallyMirrored.html
IEnumerator SetUpCamera()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
if (!Application.HasUserAuthorization(UserAuthorization.WebCam)) yield break;
WebCamDevice[] devices = WebCamTexture.devices;
for (int i = 0; i < devices.Length; i++)
{
Debug.Log("Camera Names " + devices[i].name);
if (devices[i].isFrontFacing)
{ m_frontCamera = devices[i];
}
else
{ m_backCamera = devices[i];
}
}
m_isFrontFacing = false;
StartCoroutine(StartCamera());
}
IEnumerator StartCamera()
{
// camera is flipped when testing with front facing camera in editor
if (Application.isEditor || m_isFrontFacing)
{ m_currCamera = m_frontCamera;
}
else
{ m_currCamera = m_backCamera;
}
m_cameraTexture = new WebCamTexture(m_currCamera.name, 1280, 720, 30);
// Sources:
// https://answers.unity.com/questions/1421387/webcamtexture-zoomed-in-on-ipad-pro.html
// https://answers.unity.com/questions/773464/webcamtexture-correct-resolution-and-ratio.html
m_cameraTexture.Play();
// Display webcam
yield return new WaitUntil(() => m_cameraTexture.width != 16 && m_cameraTexture.height != 16); // Workaround for weird bug on macOS
m_cameraPlane.texture = m_cameraTexture;
// Set camera filter modes for a smoother looking image
m_cameraPlane.texture.filterMode = FilterMode.Trilinear;
// Set AspectRatioFitter's ratio
m_cameraImageFitter.aspectRatio = (float)m_cameraTexture.width / m_cameraTexture.height;
m_cameraImageFitter.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight;
// If you want height to control width:
/**
m_camImageFitter.aspectRatio = (float) m_cameraTexture.height / m_cameraTexture.width;
m_camImageFitter.aspectMode = AspectRatioFitter.AspectMode.HeightControlsWidth;
**/
// Rotate image to show correct orientation
m_camRotationVector.z = -m_cameraTexture.videoRotationAngle;
m_cameraPlane.rectTransform.localEulerAngles = m_camRotationVector;
// Unflip if vertically flipped
m_cameraPlane.uvRect = m_cameraTexture.videoVerticallyMirrored ? m_cameraFixedRect : m_cameraDefaultRect;
// Mirror front-facing camera's image horizontally to look more natural
if (Application.isEditor)
{ m_cameraPlane.transform.localScale = m_cameraFixedScale;
} else
{
m_cameraPlane.transform.localScale = m_currCamera.isFrontFacing ? m_cameraFixedScale : m_cameraDefaultScale;
}
}
public void ClickFlipCameraBtn()
{
StopCamera();
m_isFrontFacing = !m_isFrontFacing;
StartCoroutine(StartCamera());
}
public void StopCamera()
{ m_cameraTexture.Stop();
}
public void ClickCameraBtn()
{
HideUI();
m_currFileName = "Photo" + PlayerPrefs.GetInt("PhotoIdx", 0) + ".png";
ScreenCapture.CaptureScreenshot(m_currFileName);
PlayerPrefs.SetInt("PhotoIdx", PlayerPrefs.GetInt("PhotoIdx", 0) + 1);
Invoke("ShowUI", 0.2f);
}
public void ClickFilterBtn(FilterBtn filterBtn)
{
if (m_colorCorrectionLookup != null)
{
if (filterBtn.m_filter != null)
{
m_colorCorrectionLookup.enabled = true;
m_colorCorrectionLookup.Convert(filterBtn.m_filter, "");
}
else
{
m_colorCorrectionLookup.enabled = false;
}
}
}
private void HideUI()
{ m_buttonPanel.SetActive(false);
}
private void ShowUI()
{ m_buttonPanel.SetActive(true);
}
}
|
You can clone a snippet to your computer for local editing. Learn more.