calculate coordinates of raycast hit point.
This commit is contained in:
@@ -1,22 +1,23 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
|
||||||
public class RaycastTest : MonoBehaviour
|
public class RaycastTest : MonoBehaviour
|
||||||
{
|
{
|
||||||
public Transform from;
|
public Transform from;
|
||||||
public Transform to;
|
public Transform to;
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
if (!from || !to) return;
|
if (!from || !to) return;
|
||||||
|
|
||||||
Debug.DrawLine(from.position, to.position, Color.red);
|
Debug.DrawLine(from.position, to.position, Color.red);
|
||||||
|
|
||||||
foreach (var uddTexture in GameObject.FindObjectsOfType<uDesktopDuplication.Texture>()) {
|
foreach (var uddTexture in GameObject.FindObjectsOfType<uDesktopDuplication.Texture>()) {
|
||||||
var result = uddTexture.RayCast(from.position, to.position - from.position);
|
var result = uddTexture.RayCast(from.position, to.position - from.position);
|
||||||
if (result.hit) {
|
if (result.hit) {
|
||||||
Debug.DrawLine(result.position, result.position + result.normal, Color.yellow);
|
Debug.DrawLine(result.position, result.position + result.normal, Color.yellow);
|
||||||
}
|
Debug.Log("COORDS: " + result.coords + ", DESKTOP: " + result.desktopCoords);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,8 +312,11 @@ public class Texture : MonoBehaviour
|
|||||||
public struct RayCastResult
|
public struct RayCastResult
|
||||||
{
|
{
|
||||||
public bool hit;
|
public bool hit;
|
||||||
|
public Texture texture;
|
||||||
public Vector3 position;
|
public Vector3 position;
|
||||||
public Vector3 normal;
|
public Vector3 normal;
|
||||||
|
public Vector2 coords;
|
||||||
|
public Vector2 desktopCoords;
|
||||||
}
|
}
|
||||||
|
|
||||||
static readonly RayCastResult raycastFailedResult = new RayCastResult {
|
static readonly RayCastResult raycastFailedResult = new RayCastResult {
|
||||||
@@ -328,13 +331,13 @@ public class Texture : MonoBehaviour
|
|||||||
var r = radius;
|
var r = radius;
|
||||||
var center = transform.position - transform.forward * r;
|
var center = transform.position - transform.forward * r;
|
||||||
|
|
||||||
var rot = transform.rotation;//Quaternion.FromToRotation(Vector3.forward, (transform.position - center).normalized);
|
// Localize the start point of the ray and the direction.
|
||||||
var trs = Matrix4x4.TRS(center, rot, Vector3.one);
|
var trs = Matrix4x4.TRS(center, transform.rotation, Vector3.one);
|
||||||
var invTrs = trs.inverse;
|
var invTrs = trs.inverse;
|
||||||
|
|
||||||
Vector3 localFrom = invTrs.MultiplyPoint3x4(from);
|
Vector3 localFrom = invTrs.MultiplyPoint3x4(from);
|
||||||
Vector3 localDir = invTrs.MultiplyVector(dir).normalized;
|
Vector3 localDir = invTrs.MultiplyVector(dir).normalized;
|
||||||
|
|
||||||
|
// Calculate the intersection points of circle and line on the X-Z plane.
|
||||||
var a = localDir.z / localDir.x;
|
var a = localDir.z / localDir.x;
|
||||||
var b = localFrom.z - a * localFrom.x;
|
var b = localFrom.z - a * localFrom.x;
|
||||||
|
|
||||||
@@ -361,21 +364,25 @@ public class Texture : MonoBehaviour
|
|||||||
|
|
||||||
var to = (Vector3.Dot(localDir, to0) > 0f) ? to0 : to1;
|
var to = (Vector3.Dot(localDir, to0) > 0f) ? to0 : to1;
|
||||||
|
|
||||||
var toAngle = Mathf.Abs(Mathf.Atan2(to.x, to.z));
|
// Check if the point is inner angle of mesh width.
|
||||||
|
var toAngle = Mathf.Atan2(to.x, to.z);
|
||||||
var halfWidthAngle = (worldWidth / radius) * 0.5f;
|
var halfWidthAngle = (worldWidth / radius) * 0.5f;
|
||||||
if (toAngle > halfWidthAngle) {
|
if (Mathf.Abs(toAngle) > halfWidthAngle) {
|
||||||
return raycastFailedResult;
|
return raycastFailedResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculate the intersection points on XZ-Y plane.
|
||||||
var v = to - localFrom;
|
var v = to - localFrom;
|
||||||
var l = Mathf.Sqrt(Mathf.Pow(v.x, 2f) + Mathf.Pow(v.z, 2f));
|
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 ly = localFrom.y + l * localDir.y / Mathf.Sqrt(Mathf.Pow(localDir.x, 2f) + Mathf.Pow(localDir.z, 2f));
|
||||||
|
|
||||||
|
// Check if the point is inner mesh height.
|
||||||
var halfHeight = worldHeight * 0.5f;
|
var halfHeight = worldHeight * 0.5f;
|
||||||
if (Mathf.Abs(ly) > halfHeight) {
|
if (Mathf.Abs(ly) > halfHeight) {
|
||||||
return raycastFailedResult;
|
return raycastFailedResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check hit position is in the range of the ray.
|
||||||
to.y = ly;
|
to.y = ly;
|
||||||
var hitPos = trs.MultiplyPoint(to);
|
var hitPos = trs.MultiplyPoint(to);
|
||||||
|
|
||||||
@@ -383,10 +390,20 @@ public class Texture : MonoBehaviour
|
|||||||
return raycastFailedResult;
|
return raycastFailedResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculate coordinates.
|
||||||
|
var coordX = toAngle / halfWidthAngle * 0.5f;
|
||||||
|
var coordY = ly / halfHeight * 0.5f;
|
||||||
|
int desktopX = monitor.left + (int)((coordX + 0.5f) * monitor.width);
|
||||||
|
int desktopY = monitor.top + (int)((0.5f - coordY) * monitor.height);
|
||||||
|
|
||||||
|
// Result
|
||||||
return new RayCastResult {
|
return new RayCastResult {
|
||||||
hit = true,
|
hit = true,
|
||||||
|
texture = this,
|
||||||
position = trs.MultiplyPoint(to),
|
position = trs.MultiplyPoint(to),
|
||||||
normal = trs.MultiplyVector(-to).normalized
|
normal = trs.MultiplyVector(-to).normalized,
|
||||||
|
coords = new Vector2(coordX, coordY),
|
||||||
|
desktopCoords = new Vector2(desktopX, desktopY)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user