From d519dba1209716d431c14ef8303ae76eaa99c0f8 Mon Sep 17 00:00:00 2001 From: hecomi Date: Thu, 15 Dec 2016 02:30:04 +0900 Subject: [PATCH] add raycast api. --- .../Examples/Scenes/Raycast.unity | Bin 0 -> 18424 bytes .../Examples/Scenes/Raycast.unity.meta | 8 ++ .../Examples/Scripts/RaycastTest.cs | 22 +++++ .../Examples/Scripts/RaycastTest.cs.meta | 12 +++ Assets/uDesktopDuplication/Scripts/Texture.cs | 81 ++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Raycast.unity create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Raycast.unity.meta create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/RaycastTest.cs create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/RaycastTest.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Raycast.unity b/Assets/uDesktopDuplication/Examples/Scenes/Raycast.unity new file mode 100644 index 0000000000000000000000000000000000000000..17d1e2b956d80bc697d3860393904ede6e647b8c GIT binary patch literal 18424 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 { + var result = uddTexture.RayCast(from.position, to.position - from.position); + if (result.hit) { + Debug.DrawLine(result.position, result.position + result.normal, Color.yellow); + } + } + } +} diff --git a/Assets/uDesktopDuplication/Examples/Scripts/RaycastTest.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/RaycastTest.cs.meta new file mode 100644 index 0000000..86c116c --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/RaycastTest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 810a4ad59c7d8d34e9b6014e8191fffe +timeCreated: 1481722966 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scripts/Texture.cs b/Assets/uDesktopDuplication/Scripts/Texture.cs index 73d0e70..79b7b82 100644 --- a/Assets/uDesktopDuplication/Scripts/Texture.cs +++ b/Assets/uDesktopDuplication/Scripts/Texture.cs @@ -308,6 +308,87 @@ public class Texture : MonoBehaviour // To world position return transform.position + (transform.rotation * localPos); } + + public struct RayCastResult + { + public bool hit; + public Vector3 position; + public Vector3 normal; + } + + static readonly RayCastResult raycastFailedResult = new RayCastResult { + hit = false, + position = Vector3.zero, + normal = Vector3.forward + }; + + // This function can be used only for vertical (= MeshForwardDirection.Z) plane. + public RayCastResult RayCast(Vector3 from, Vector3 dir) + { + var r = radius; + var center = transform.position - transform.forward * r; + + var rot = transform.rotation;//Quaternion.FromToRotation(Vector3.forward, (transform.position - center).normalized); + var trs = Matrix4x4.TRS(center, rot, Vector3.one); + var invTrs = trs.inverse; + + Vector3 localFrom = invTrs.MultiplyPoint3x4(from); + Vector3 localDir = invTrs.MultiplyVector(dir).normalized; + + var a = localDir.z / localDir.x; + var b = localFrom.z - a * localFrom.x; + + var aa = a * a; + var bb = b * b; + var ab = a * b; + var rr = r * r; + + var s = aa * rr - bb + rr; + if (s < 0f) { + return raycastFailedResult; + } + s = Mathf.Sqrt(s); + + var t = aa + 1; + + var lx0 = (-s - ab) / t; + var lz0 = (b - a * s) / t; + var to0 = new Vector3(lx0, 0f, lz0); + + var lx1 = (s - ab) / t; + var lz1 = (a * s + b) / t; + var to1 = new Vector3(lx1, 0f, lz1); + + var to = (Vector3.Dot(localDir, to0) > 0f) ? to0 : to1; + + var toAngle = Mathf.Abs(Mathf.Atan2(to.x, to.z)); + var halfWidthAngle = (worldWidth / radius) * 0.5f; + if (toAngle > halfWidthAngle) { + return raycastFailedResult; + } + + var v = to - localFrom; + var l = Mathf.Sqrt(Mathf.Pow(v.x, 2f) + Mathf.Pow(v.z, 2f)); + var ly = localFrom.y + l * localDir.y / Mathf.Sqrt(Mathf.Pow(localDir.x, 2f) + Mathf.Pow(localDir.z, 2f)); + + var halfHeight = worldHeight * 0.5f; + if (Mathf.Abs(ly) > halfHeight) { + return raycastFailedResult; + } + + to.y = ly; + var hitPos = trs.MultiplyPoint(to); + + if ((hitPos - from).magnitude > dir.magnitude) { + return raycastFailedResult; + } + + return new RayCastResult { + hit = true, + position = trs.MultiplyPoint(to), + normal = trs.MultiplyVector(-to).normalized + }; + } } } \ No newline at end of file