t1 / TFDContents / Assets / KinectDemos / ColliderDemo / Scripts / DepthSpriteViewer.cs @ 3
이력 | 보기 | 이력해설 | 다운로드 (5.59 KB)
| 1 | 3 | KTH | using UnityEngine; |
|---|---|---|---|
| 2 | using System.Collections; |
||
| 3 | |||
| 4 | public class DepthSpriteViewer : MonoBehaviour |
||
| 5 | {
|
||
| 6 | [Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
|
||
| 7 | public int playerIndex = 0; |
||
| 8 | |||
| 9 | [Tooltip("Camera used to estimate the overlay positions of 3D-objects over the background. By default it is the main camera.")]
|
||
| 10 | public Camera foregroundCamera; |
||
| 11 | |||
| 12 | [Tooltip("Depth image renderer.")]
|
||
| 13 | public SpriteRenderer depthImage; |
||
| 14 | |||
| 15 | // width of the created box colliders |
||
| 16 | private const float colliderWidth = 0.3f; |
||
| 17 | |||
| 18 | // the KinectManager instance |
||
| 19 | private KinectManager manager; |
||
| 20 | |||
| 21 | // screen rectangle taken by the foreground image (in pixels) |
||
| 22 | private Rect foregroundImgRect; |
||
| 23 | |||
| 24 | // game objects to contain the joint colliders |
||
| 25 | private GameObject[] jointColliders = null; |
||
| 26 | private int numColliders = 0; |
||
| 27 | |||
| 28 | // depth image resolution |
||
| 29 | private int depthImageWidth; |
||
| 30 | private int depthImageHeight; |
||
| 31 | |||
| 32 | // depth sensor platform |
||
| 33 | private KinectInterop.DepthSensorPlatform sensorPlatform = KinectInterop.DepthSensorPlatform.None; |
||
| 34 | |||
| 35 | |||
| 36 | void Start () |
||
| 37 | {
|
||
| 38 | if (foregroundCamera == null) |
||
| 39 | {
|
||
| 40 | // by default use the main camera |
||
| 41 | foregroundCamera = Camera.main; |
||
| 42 | } |
||
| 43 | |||
| 44 | manager = KinectManager.Instance; |
||
| 45 | if(manager && manager.IsInitialized()) |
||
| 46 | {
|
||
| 47 | KinectInterop.SensorData sensorData = manager.GetSensorData(); |
||
| 48 | |||
| 49 | if(sensorData != null && sensorData.sensorInterface != null && foregroundCamera != null) |
||
| 50 | {
|
||
| 51 | // sensor platform |
||
| 52 | sensorPlatform = sensorData.sensorIntPlatform; |
||
| 53 | |||
| 54 | // get depth image size |
||
| 55 | depthImageWidth = sensorData.depthImageWidth; |
||
| 56 | depthImageHeight = sensorData.depthImageHeight; |
||
| 57 | |||
| 58 | // calculate the foreground rectangles |
||
| 59 | Rect cameraRect = foregroundCamera.pixelRect; |
||
| 60 | float rectHeight = cameraRect.height; |
||
| 61 | float rectWidth = cameraRect.width; |
||
| 62 | |||
| 63 | if(rectWidth > rectHeight) |
||
| 64 | rectWidth = rectHeight * depthImageWidth / depthImageHeight; |
||
| 65 | else |
||
| 66 | rectHeight = rectWidth * depthImageHeight / depthImageWidth; |
||
| 67 | |||
| 68 | float foregroundOfsX = (cameraRect.width - rectWidth) / 2; |
||
| 69 | float foregroundOfsY = (cameraRect.height - rectHeight) / 2; |
||
| 70 | foregroundImgRect = new Rect(foregroundOfsX, foregroundOfsY, rectWidth, rectHeight); |
||
| 71 | |||
| 72 | // create joint colliders |
||
| 73 | numColliders = sensorData.jointCount; |
||
| 74 | jointColliders = new GameObject[numColliders]; |
||
| 75 | |||
| 76 | for(int i = 0; i < numColliders; i++) |
||
| 77 | {
|
||
| 78 | string sColObjectName = ((KinectInterop.JointType)i).ToString() + "Collider"; |
||
| 79 | jointColliders[i] = new GameObject(sColObjectName); |
||
| 80 | jointColliders[i].transform.parent = transform; |
||
| 81 | |||
| 82 | if (i == 0) |
||
| 83 | {
|
||
| 84 | // circle collider for body center |
||
| 85 | CircleCollider2D collider = jointColliders[i].AddComponent<CircleCollider2D>(); |
||
| 86 | collider.radius = colliderWidth; |
||
| 87 | } |
||
| 88 | else |
||
| 89 | {
|
||
| 90 | // box colliders for bones |
||
| 91 | BoxCollider2D collider = jointColliders[i].AddComponent<BoxCollider2D>(); |
||
| 92 | collider.size = new Vector2(colliderWidth, colliderWidth); |
||
| 93 | } |
||
| 94 | } |
||
| 95 | } |
||
| 96 | } |
||
| 97 | |||
| 98 | } |
||
| 99 | |||
| 100 | void Update () |
||
| 101 | {
|
||
| 102 | // get the users texture |
||
| 103 | if(manager && manager.IsInitialized() && depthImage && |
||
| 104 | (depthImage.sprite == null || sensorPlatform == KinectInterop.DepthSensorPlatform.KinectSDKv1)) |
||
| 105 | {
|
||
| 106 | Texture2D texDepth = manager.GetUsersLblTex(); |
||
| 107 | Rect rectDepth = new Rect(0, 0, texDepth.width, texDepth.height); |
||
| 108 | Vector2 pivotSprite = new Vector2(0.5f, 0.5f); |
||
| 109 | |||
| 110 | depthImage.sprite = Sprite.Create(texDepth, rectDepth, pivotSprite); |
||
| 111 | depthImage.flipY = true; |
||
| 112 | |||
| 113 | float worldScreenHeight = foregroundCamera.orthographicSize * 2f; |
||
| 114 | float spriteHeight = depthImage.sprite.bounds.size.y; |
||
| 115 | |||
| 116 | float scale = worldScreenHeight / spriteHeight; |
||
| 117 | depthImage.transform.localScale = new Vector3(scale, scale, 1f); |
||
| 118 | |||
| 119 | } |
||
| 120 | |||
| 121 | if(manager && manager.IsUserDetected(playerIndex) && foregroundCamera) |
||
| 122 | {
|
||
| 123 | long userId = manager.GetUserIdByIndex(playerIndex); // manager.GetPrimaryUserID(); |
||
| 124 | |||
| 125 | // update colliders |
||
| 126 | for(int i = 0; i < numColliders; i++) |
||
| 127 | {
|
||
| 128 | bool bActive = false; |
||
| 129 | |||
| 130 | if(manager.IsJointTracked(userId, i)) |
||
| 131 | {
|
||
| 132 | Vector3 posJoint = manager.GetJointPosDepthOverlay(userId, i, foregroundCamera, foregroundImgRect); |
||
| 133 | posJoint.z = depthImage ? depthImage.transform.position.z : 0f; |
||
| 134 | |||
| 135 | if (i == 0) |
||
| 136 | {
|
||
| 137 | // circle collider for body center |
||
| 138 | jointColliders[i].transform.position = posJoint; |
||
| 139 | |||
| 140 | Quaternion rotCollider = manager.GetJointOrientation(userId, i, true); |
||
| 141 | jointColliders[i].transform.rotation = rotCollider; |
||
| 142 | |||
| 143 | bActive = true; |
||
| 144 | } |
||
| 145 | else |
||
| 146 | {
|
||
| 147 | int p = (int)manager.GetParentJoint((KinectInterop.JointType)i); |
||
| 148 | |||
| 149 | if (manager.IsJointTracked (userId, p)) |
||
| 150 | {
|
||
| 151 | // box colliders for bones |
||
| 152 | Vector3 posParent = manager.GetJointPosDepthOverlay(userId, p, foregroundCamera, foregroundImgRect); |
||
| 153 | posParent.z = depthImage ? depthImage.transform.position.z : 0f; |
||
| 154 | |||
| 155 | Vector3 posCollider = (posJoint + posParent) / 2f; |
||
| 156 | jointColliders[i].transform.position = posCollider; |
||
| 157 | |||
| 158 | Quaternion rotCollider = Quaternion.FromToRotation (Vector3.up, (posJoint - posParent).normalized); |
||
| 159 | jointColliders[i].transform.rotation = rotCollider; |
||
| 160 | |||
| 161 | BoxCollider2D collider = jointColliders [i].GetComponent<BoxCollider2D>(); |
||
| 162 | collider.size = new Vector2(collider.size.x, (posJoint - posParent).magnitude); |
||
| 163 | |||
| 164 | bActive = true; |
||
| 165 | } |
||
| 166 | } |
||
| 167 | } |
||
| 168 | |||
| 169 | if (jointColliders[i].activeSelf != bActive) |
||
| 170 | {
|
||
| 171 | // change collider activity |
||
| 172 | jointColliders[i].SetActive(bActive); |
||
| 173 | } |
||
| 174 | } |
||
| 175 | } |
||
| 176 | |||
| 177 | } |
||
| 178 | |||
| 179 | } |