|
|
- //======= Copyright (c) Valve Corporation, All rights reserved. ===============
- using UnityEngine;
-
- public class SteamVR_TestTrackedCamera : MonoBehaviour
- {
- public Material material;
- public Transform target;
- public bool undistorted = true;
- public bool cropped = true;
-
- void OnEnable()
- {
- // The video stream must be symmetrically acquired and released in
- // order to properly disable the stream once there are no consumers.
- var source = SteamVR_TrackedCamera.Source(undistorted);
- source.Acquire();
-
- // Auto-disable if no camera is present.
- if (!source.hasCamera)
- enabled = false;
- }
-
- void OnDisable()
- {
- // Clear the texture when no longer active.
- material.mainTexture = null;
-
- // The video stream must be symmetrically acquired and released in
- // order to properly disable the stream once there are no consumers.
- var source = SteamVR_TrackedCamera.Source(undistorted);
- source.Release();
- }
-
- void Update()
- {
- var source = SteamVR_TrackedCamera.Source(undistorted);
- var texture = source.texture;
- if (texture == null)
- {
- return;
- }
-
- // Apply the latest texture to the material. This must be performed
- // every frame since the underlying texture is actually part of a ring
- // buffer which is updated in lock-step with its associated pose.
- // (You actually really only need to call any of the accessors which
- // internally call Update on the SteamVR_TrackedCamera.VideoStreamTexture).
- material.mainTexture = texture;
-
- // Adjust the height of the quad based on the aspect to keep the texels square.
- var aspect = (float)texture.width / texture.height;
-
- // The undistorted video feed has 'bad' areas near the edges where the original
- // square texture feed is stretched to undo the fisheye from the lens.
- // Therefore, you'll want to crop it to the specified frameBounds to remove this.
- if (cropped)
- {
- var bounds = source.frameBounds;
- material.mainTextureOffset = new Vector2(bounds.uMin, bounds.vMin);
-
- var du = bounds.uMax - bounds.uMin;
- var dv = bounds.vMax - bounds.vMin;
- material.mainTextureScale = new Vector2(du, dv);
-
- aspect *= Mathf.Abs(du / dv);
- }
- else
- {
- material.mainTextureOffset = Vector2.zero;
- material.mainTextureScale = new Vector2(1, -1);
- }
-
- target.localScale = new Vector3(1, 1.0f / aspect, 1);
-
- // Apply the pose that this frame was recorded at.
- if (source.hasTracking)
- {
- var t = source.transform;
- target.localPosition = t.pos;
- target.localRotation = t.rot;
- }
- }
- }
-
|