From d1d984f8a397955de23a92c3381f9ec79908b1bc Mon Sep 17 00:00:00 2001 From: "bocska.karina" <bocska.karina@hallgato.ppke.hu> Date: Tue, 12 Nov 2024 14:06:47 +0100 Subject: [PATCH] use threading for point searching --- Assets/Scenes/SampleScene.unity | 32 ++++---- .../Controllers/SelectPointsController.cs | 78 +++++++++++++------ Assets/Scrips/Events/SpawnBlockEvent.cs | 12 +-- Assets/mesh.obj | 62 +++++++-------- 4 files changed, 106 insertions(+), 78 deletions(-) diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 5e0d37a..d0ef86e 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -4190,7 +4190,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 919132149155446097, guid: cbd9713bd330c064b8c327427eb068e1, type: 3} propertyPath: m_IsActive - value: 1 + value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] @@ -13258,11 +13258,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4704240697808797663, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 119.91 objectReference: {fileID: 0} - target: {fileID: 4704240697808797663, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 46 objectReference: {fileID: 0} - target: {fileID: 4704240698125147208, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_text @@ -13270,23 +13270,23 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 91.91 objectReference: {fileID: 0} - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 59.955 objectReference: {fileID: 0} - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -23 objectReference: {fileID: 0} - target: {fileID: 5043647495600119106, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_Layer @@ -13310,7 +13310,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7785151267686525225, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_IsActive - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7785151267686525226, guid: 048249d9a15aa3c459399751e860bde7, type: 3} propertyPath: m_RootOrder @@ -21778,7 +21778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668758913251958, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 44.7 objectReference: {fileID: 0} - target: {fileID: 1984668758913251958, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21810,7 +21810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668759388320319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 40 objectReference: {fileID: 0} - target: {fileID: 1984668759388320319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21846,7 +21846,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668759906836222, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 40 objectReference: {fileID: 0} - target: {fileID: 1984668759906836222, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21870,7 +21870,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668759991436502, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 40 objectReference: {fileID: 0} - target: {fileID: 1984668759991436502, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21906,7 +21906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668760453204319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 44.7 objectReference: {fileID: 0} - target: {fileID: 1984668760453204319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21930,7 +21930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668760497519799, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 42.510002 objectReference: {fileID: 0} - target: {fileID: 1984668760497519799, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y @@ -21958,7 +21958,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1984668760711245992, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 40 objectReference: {fileID: 0} - target: {fileID: 1984668760711245992, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3} propertyPath: m_AnchoredPosition.y diff --git a/Assets/Scrips/Controllers/SelectPointsController.cs b/Assets/Scrips/Controllers/SelectPointsController.cs index 32344d4..fc839d2 100644 --- a/Assets/Scrips/Controllers/SelectPointsController.cs +++ b/Assets/Scrips/Controllers/SelectPointsController.cs @@ -7,6 +7,7 @@ using MathNet.Numerics.LinearAlgebra.Factorization; using MathNet.Numerics.LinearAlgebra; using Unity.Mathematics; using static PointCloudDataReader; +using System.Threading.Tasks; public class SelectPointsController : MonoBehaviour { @@ -44,32 +45,64 @@ public class SelectPointsController : MonoBehaviour private void SelectPointsHandler(InputAction.CallbackContext context) { - List<Vector3> selectedPoints = new(); - foreach (GameObject cloud in pointClouds) + Vector3[] cloudPositions = new Vector3[pointClouds.Count]; + Quaternion[] cloudRotations = new Quaternion[pointClouds.Count]; + List<Point[]> points = new(); + for (int i = 0; i < pointClouds.Count; i++) { - Transform cloudTransform = cloud.transform; - Point[] points = cloud.GetComponent<PointCloudDataReader>().PointData; - for (int i = 0; i < points.Length; i++) + cloudPositions[i] = pointClouds[i].transform.position; + cloudRotations[i] = pointClouds[i].transform.rotation; + points.Add(pointClouds[i].GetComponent<PointCloudDataReader>().PointData); + } + Bounds[] selectionBounds = new Bounds[_blockSelections.Count]; + for (int i = 0; i < _blockSelections.Count; i++) + { + selectionBounds[i] = _blockSelections[i].GetComponent<MeshCollider>().bounds; + } + _ = FitPlaneToSelectedPointsAsync(cloudPositions, cloudRotations, points, selectionBounds); + } + + private async Task FitPlaneToSelectedPointsAsync(Vector3[] cloudPositions, Quaternion[] cloudRotations, List<Point[]> cloudPoints, Bounds[] selectionBounds) + { + Debug.Log("task"); + Task<List<Vector3>> task = Task.Run(() => + { + Debug.Log("running task"); + List<Vector3> selectedPoints = new(); + for (int i1 = 0; i1 < cloudPoints.Count; i1++) { - Vector3 point = points[i].position; - point.x *= -1f; - foreach (GameObject blockSelection in _blockSelections) + // GameObject cloud = pointClouds[i1]; + // Transform cloudTransform = cloud.transform; + // Point[] points = cloud.GetComponent<PointCloudDataReader>().PointData; + Point[] points = cloudPoints[i1]; + for (int i = 0; i < points.Length; i++) { - MeshCollider collider = blockSelection.GetComponent<MeshCollider>(); - Vector3 ptGlobal = cloudTransform.rotation * point + cloudTransform.position; - if (collider.bounds.Contains(ptGlobal)) + Vector3 point = points[i].position; + point.x *= -1f; + // foreach (GameObject blockSelection in _blockSelections) + foreach (Bounds bound in selectionBounds) { - selectedPoints.Add(ptGlobal); + // MeshCollider collider = blockSelection.GetComponent<MeshCollider>(); + // Vector3 ptGlobal = cloudTransform.rotation * point + cloudTransform.position; + Vector3 ptGlobal = cloudRotations[i1] * point + cloudPositions[i1]; + // if (collider.bounds.Contains(ptGlobal)) + if (bound.Contains(ptGlobal)) + { + selectedPoints.Add(ptGlobal); + } } } } - } - CalculatePlane(selectedPoints); + Debug.Log("finished collecting points"); + return selectedPoints; + }); + CalculatePlane(await task); } // source: https://stackoverflow.com/questions/10900141/fast-plane-fitting-to-many-points private void CalculatePlane(List<Vector3> points) { + Debug.Log("calculating plane"); if (points.Count < 3) { Debug.Log("not enough points to calculate plane"); @@ -116,17 +149,18 @@ public class SelectPointsController : MonoBehaviour Plane plane = new(planeNormal, -d); Debug.Log(plane); - _debugPoints.Clear(); - for (int i = 0; i < 200; i++) - { - Vector3 randomPoint = new(UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f)); - _debugPoints.Add(ProjectPointOntoPlane(plane, randomPoint)); - } + // _debugPoints.Clear(); + // for (int i = 0; i < 200; i++) + // { + // Vector3 randomPoint = new(UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f)); + // _debugPoints.Add(ProjectPointOntoPlane(plane, randomPoint)); + // } Vector<float> colAvg = G.ColumnSums(); colAvg /= G.RowCount; Vector3 pointAvg = new(colAvg[0], colAvg[1], colAvg[2]); SpawnPlane(ProjectPointOntoPlane(plane, pointAvg), planeNormal); + UIController.Instance.NewStatusMessage("Plane calculation completed."); } public GameObject SpawnPlane(Vector3 pos, Vector3 normal) @@ -193,8 +227,8 @@ public class SelectPointsController : MonoBehaviour { // CalculateRealPoints(); EditState.Instance.RegisterListener(EditChangeHandler); - SpawnPlane(new Vector3(0, 0, 0), Vector3.left); - SpawnPlane(new Vector3(-1, 0, 0), Vector3.up); + // SpawnPlane(new Vector3(0, 0, 0), Vector3.left); + // SpawnPlane(new Vector3(-1, 0, 0), Vector3.up); } private void EditChangeHandler() diff --git a/Assets/Scrips/Events/SpawnBlockEvent.cs b/Assets/Scrips/Events/SpawnBlockEvent.cs index c73b21c..498d4b7 100644 --- a/Assets/Scrips/Events/SpawnBlockEvent.cs +++ b/Assets/Scrips/Events/SpawnBlockEvent.cs @@ -77,15 +77,15 @@ public class SpawnBlockEvent : MonoBehaviour // Start is called before the first frame update void Start() { - GameObject spawnedObject = Instantiate(spawnPrefab, new Vector3(-1.65f, 0.46f, -4.93f), Quaternion.identity); - Collider objectCollider = spawnedObject.GetComponent<Collider>(); - Vector3 adjustment = Vector3.Scale(this.transform.up, objectCollider.bounds.size / 2); - spawnedObject.transform.position += adjustment; - spawnedObject.transform.parent = this.transform; + // GameObject spawnedObject = Instantiate(spawnPrefab, new Vector3(-1.65f, 0.46f, -4.93f), Quaternion.identity); + // Collider objectCollider = spawnedObject.GetComponent<Collider>(); + // Vector3 adjustment = Vector3.Scale(this.transform.up, objectCollider.bounds.size / 2); + // spawnedObject.transform.position += adjustment; + // spawnedObject.transform.parent = this.transform; // _selectPointsController.AddSelection(spawnedObject); // spawnedObject.GetComponent<BlockSelect>().selectPointsController = _selectPointsController; - ProgramController.Instance.RegisterBlock(spawnedObject); + // ProgramController.Instance.RegisterBlock(spawnedObject); } } diff --git a/Assets/mesh.obj b/Assets/mesh.obj index c8b90c0..a2ebe60 100644 --- a/Assets/mesh.obj +++ b/Assets/mesh.obj @@ -1,27 +1,27 @@ -v -1.15 0.46 -4.43 -v -2.15 0.46 -4.43 -v -1.15 1.46 -4.43 -v -2.15 1.46 -4.43 -v -1.15 1.46 -5.43 -v -2.15 1.46 -5.43 -v -1.15 0.46 -5.43 -v -2.15 0.46 -5.43 -v -1.15 1.46 -4.43 -v -2.15 1.46 -4.43 -v -1.15 1.46 -5.43 -v -2.15 1.46 -5.43 -v -1.15 0.46 -5.43 -v -1.15 0.46 -4.43 -v -2.15 0.46 -4.43 -v -2.15 0.46 -5.43 -v -2.15 0.46 -4.43 -v -2.15 1.46 -4.43 -v -2.15 1.46 -5.43 -v -2.15 0.46 -5.43 -v -1.15 0.46 -5.43 -v -1.15 1.46 -5.43 -v -1.15 1.46 -4.43 -v -1.15 0.46 -4.43 +v 4.790933 0.0005001426 3.249483 +v 4.190578 0.0005001426 3.249483 +v 4.790933 5.129273 3.249483 +v 4.190578 5.129273 3.249483 +v 4.790933 5.129273 2.379545 +v 4.190578 5.129273 2.379545 +v 4.790933 0.0005001426 2.379545 +v 4.190578 0.0005001426 2.379545 +v 4.790933 5.129273 3.249483 +v 4.190578 5.129273 3.249483 +v 4.790933 5.129273 2.379545 +v 4.190578 5.129273 2.379545 +v 4.790933 0.0005001426 2.379545 +v 4.790933 0.0005001426 3.249483 +v 4.190578 0.0005001426 3.249483 +v 4.190578 0.0005001426 2.379545 +v 4.190578 0.0005001426 3.249483 +v 4.190578 5.129273 3.249483 +v 4.190578 5.129273 2.379545 +v 4.190578 0.0005001426 2.379545 +v 4.790933 0.0005001426 2.379545 +v 4.790933 5.129273 2.379545 +v 4.790933 5.129273 3.249483 +v 4.790933 0.0005001426 3.249483 f 1 3 4 f 1 4 2 f 9 5 6 @@ -34,15 +34,9 @@ f 17 18 19 f 17 19 20 f 21 22 23 f 21 23 24 -v 5.960464E-08 -0.5 -0.5000001 -v -5.960464E-08 -0.5 0.5000001 -v 5.960464E-08 0.5 -0.5000001 -v -5.960464E-08 0.5 0.5000001 +v 5.100156 -0.02601445 14.33806 +v 7.014131 0.03212595 14.30453 +v 5.094431 2.09043 14.34149 +v 6.875519 2.140711 14.31028 f 25 28 26 f 28 25 27 -v -1.5 5.960464E-08 0.5000001 -v -0.5 5.960464E-08 0.5000001 -v -1.5 -5.960464E-08 -0.5000001 -v -0.5 -5.960464E-08 -0.5000001 -f 29 32 30 -f 32 29 31 -- GitLab