using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public class Positioner { public static Vector3 FixedPosition (GameObject GroundObject, RaycastHit hit){ Vector3 oldPosition = GroundObject.transform.position; GroundObject.transform.position = hit.point; Vector3[] ObjectVertices = GroundObject.GetComponent<MeshFilter>().mesh.vertices; List<Vector3> ProjectedVertices = new List<Vector3>(); List<float> VerticeDistance = new List<float>(); foreach(Vector3 vertice in ObjectVertices){ // Projects every vertex point to a line from linePoint Vector3 linePoint = Vector3.MoveTowards(hit.point, hit.normal, Vector3.Distance(GroundObject.collider.bounds.max, hit.point)); Vector3 ProjectedVertice = Math3d.ProjectPointOnLine(linePoint, (hit.point - linePoint).normalized, GroundObject.transform.TransformPoint(vertice)); ProjectedVertices.Add (ProjectedVertice); VerticeDistance.Add (Vector3.Distance(ProjectedVertice, linePoint)); } Vector3 FarthestPoint = ProjectedVertices[VerticeDistance.IndexOf(VerticeDistance.Max())]; float IntersectionDepht = Vector3.Distance(hit.point, FarthestPoint); GroundObject.transform.position = oldPosition; Debug.DrawRay(FarthestPoint, Vector3.up, Color.green, 2, false); Vector3 finalPosition = hit.point + (hit.normal.normalized * IntersectionDepht); return finalPosition; } }
Debug infoa riviltä 24:
297.7, 17.5, 308.0 = 297.7, 17.3, 308.0 + (0.0, 1.0, 0.0 * 0,2324142 )
Tarkoitus on korjata objektin sijaintia lähtien käyttäen raycast hittiä, se muuntaa 3d mallin pisteet globaaliksi ja laskee mikä on normaalin suhteen kaukaisin. Koska objektin keskipiste on oletuksena osumassa siirretään sitä normaalia kohti kaukaisimman pisteet ja keskipisteen etäisyyden verran. Tällä hetkellä kuitenkin etäisyys on aina liian suuri.
Apuja? Onko tässä logiikassa jotain pielessä?
:(
Sain ratkaisun muualta. https://dl.dropboxusercontent.com/u/92559435/
Parent / child rakenteen käyttäminen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.