v5.0
Returns a PointLocatorData
object containing the closest surface locations from the specified
input positions. By default, input positions have to be defined in
the object's local space reference.
Some aspects of the closest locations computation such as the
reference pose or the method (closest surface, closest vertex or
knot, ...) can be set up using Geometry.SetupPointLocatorQueries.
This setup will affect all subsequent calls to GetClosestLocations
and to Geometry.GetClosestLocationsWithinRadius.
When you call this method an acceleration cache is automatically
created. See Geometry.SetupPointLocatorQueries
for more information.
Notice that the "closest distance" relationship may change relative
to the spatial reference of the geometry and the input positions.
See Geometry.SetupPointLocatorQueries
for more information.
Notice that the returned point locators can be evaluated on any
Geometry instance having the same topology.
PointLocatorData Geometry.GetClosestLocations( Object in_pPositions ); |
oReturn = Geometry.GetClosestLocations( Positions ); |
Parameter | Type | Description |
---|---|---|
Positions | Array | An array of Doubles, either formatted as a 1D array of packed XYZ triplets, or as a 2D array of XYZ triplets. |
/* Example using PointLocatorData to find the closest mesh sphere vertex from a Null */ NewScene(); var NullObj = GetPrim("Null", null, null, null); Translate(NullObj, -2.0, 8.0, 5.0, siRelative, siView, siObj, siXYZ); var SphereGeom = CreatePrim("Sphere", "MeshSurface").ActivePrimitive.Geometry; var ClosestPointLocator = SphereGeom.GetClosestLocations(NullObj.Kinematics.Global.Transform.GetTranslationValues2()); var ClosestPosition = SphereGeom.EvaluatePositions(ClosestPointLocator).toArray(); var TriangleVertices = SphereGeom.GetTriangleVertexIndexArray(ClosestPointLocator).toArray(); var TriangleWeights = SphereGeom.GetTriangleWeightArray(ClosestPointLocator).toArray(); Application.LogMessage("The closest position on the mesh sphere from the Null is (" + ClosestPosition[0] + ", " + ClosestPosition[1] + ", " + ClosestPosition[2] + ")"); Application.LogMessage("which corresponds to the triangle made of vertices (" + TriangleVertices[0] + ", " + TriangleVertices[1] + ", " + TriangleVertices[2] + ")."); Application.LogMessage("The barycentric weight relatively to each triangle vertex is (" + TriangleWeights[0] + ", " + TriangleWeights[1] + ", " + TriangleWeights[2] + ")."); //INFO : The closest position on the mesh sphere from the Null is (-0.6959691047668459, 3.2883720624894605, 1.8517908803876053) //INFO : which corresponds to the triangle made of vertices (14, 21, 22). //INFO : The barycentric weight relatively to each triangle vertex is (0.34798455238342285, 0.12156937271356582, 0.5304460525512695). |
/* This example uses PointLocatorData to shrink-wrap a sphere to a cube, and then push the sphere along the cube's normals. */ NewScene(null, false); var root = Application.ActiveSceneRoot; var CubeGeom = root.AddGeometry("Cube", "MeshSurface").ActivePrimitive.Geometry; var SphereObj = root.AddGeometry("Sphere", "MeshSurface"); SphereObj.subdivv = 24; SphereObj.subdivu = 24; // We must freeze it, otherwise its position array cannot be set: FreezeObj(SphereObj); var SphereGeom = SphereObj.ActivePrimitive.Geometry; var SphereOnCubePointLocators = CubeGeom.GetClosestLocations(SphereGeom.Points.PositionArray); var SphereOnCubePositions = CubeGeom.EvaluatePositions(SphereOnCubePointLocators).toArray(); var SphereOnCubeNormals = CubeGeom.EvaluateNormals(SphereOnCubePointLocators).toArray(); for (i = 0; i < SphereOnCubePositions.length; i++) SphereOnCubePositions[i] += SphereOnCubeNormals[i]*3; SphereGeom.Points.PositionArray = SphereOnCubePositions; |
PointLocatorData Geometry Geometry.GetClosestLocationsWithinRadius Geometry.GetRaycastIntersections Geometry.SetupPointLocatorQueries Geometry.GetSurfacePointLocatorsFromPoints Geometry.EvaluatePositions Geometry.EvaluateNormals Geometry.EvaluateClusterProperty PolygonMesh.GetPolygonIndexArray PolygonMesh.GetTriangleVertexIndexArray PolygonMesh.GetTriangleNodeIndexArray PolygonMesh.GetTriangleWeightArray PolygonMesh.ConstructPointLocators NurbsSurfaceMesh.GetSubSurfaceIndexArray NurbsSurfaceMesh.GetNormalizedUVArray NurbsSurfaceMesh.ConstructPointLocators