
v5.0
PolygonMesh 特定のトポロジ情報から PointLocatorData を構築します。各ポイントロケータを定義するには、ポイントインデックス、頂点インデックス、およいサブトライアングルの重心ウェイト(正規化された正の値)が必要です。サブトライアングルの頂点インデックスはすべて対応入力ポリゴンの一部である必要があります。トライアングルの頂点とウェイトの配列には、各入力ポリゴンにつき3 つの値を含める必要があります。
精度を向上させるために、ポリゴンの実際の三角形分割に対応する頂点のサブトライアングルを指定することを推奨します。実際の三角形分割は PolygonFace.TriangleSubIndexArray を使用して取得できます。
戻されるポイントロケータは、同じトポロジを持つ任意の PolygonMesh インスタンスについて評価できます。
PointLocatorData PolygonMesh.ConstructPointLocators( Object in_pPolygonIndices, Object in_pSubTriangleVertexIndices, Object in_pSubTriangleWeights ); |
oReturn = PolygonMesh.ConstructPointLocators( PolygonIndexArray, SubTriangleVertexIndexArray, SubTriangleWeightArray ); |
| パラメータ | タイプ | 説明 |
|---|---|---|
| PolygonIndexArray | 1DArray | ポイントロケータが作成されるポリゴンインデックスの配列。 |
| SubTriangleVertexIndexArray | Array | トリプレットセットの 1D 配列または 2D 配列のいずれかです。頂点インデックスのトリプレットは、ポイントロケータが作成されるポリゴンサブトライアングルを定義します。各トリプレットの頂点は対応する入力ポリゴンに隣接している必要があります。 |
| SubTriangleWeightArray | Array | パッキングされた重心座標トリプレットの 1D 配列または同 2D 配列のいずれかの書式をとる Double配列。適切な結果を得るには、各トリプレットのウェイト合計値を 1.0 にし、ウェイト値はそれぞれ正の値にする必要があります。 |
//
// This example creates point locators at random surface locations,
// and positions a Null at each of these point locators.
//
// Even if these point locators are simply randomly constructed,
// this example shows how to do it in the most accurate way,
// which is to specify subtriangles which correspond to the actual
// polygon triangulation.
//
NewScene( null, false );
var SphereGeom = CreatePrim("Sphere", "MeshSurface").ActivePrimitive.Geometry;
var NbPtLocators = 50;
var PolygonIndexArray = new Array(NbPtLocators);
var SubTriangleVertexArray = new Array(NbPtLocators*3);
var SubTriangleWeightArray = new Array(NbPtLocators*3);
var Polygons = SphereGeom.Polygons;
for(i = 0; i < NbPtLocators; i++) {
PolygonIndexArray[i] = Math.floor(Math.random() * 0.999999 * Polygons.Count);
var Polygon = Polygons.Item(PolygonIndexArray[i]);
var SubTri = Math.floor(Math.random() * 0.999999 * (Polygon.NbPoints-2));
var PolygonVertices = Polygon.Vertices;
var TriangleSubIndices = Polygon.TriangleSubIndexArray.toArray();
SubTriangleVertexArray[i*3] = PolygonVertices.Item(TriangleSubIndices[SubTri*3]).Index;
SubTriangleVertexArray[i*3+1] = PolygonVertices.Item(TriangleSubIndices[SubTri*3+1]).Index;
SubTriangleVertexArray[i*3+2] = PolygonVertices.Item(TriangleSubIndices[SubTri*3+2]).Index;
var W1 = Math.random();
var W2 = Math.random();
var W3 = Math.random();
var WSum = W1+W2+W3;
SubTriangleWeightArray[i*3] = W1/WSum;
SubTriangleWeightArray[i*3+1] = W2/WSum;
SubTriangleWeightArray[i*3+2] = W3/WSum;
}
var RandomPointLocators = SphereGeom.ConstructPointLocators(PolygonIndexArray, SubTriangleVertexArray, SubTriangleWeightArray);
CreateNullsAtPointLocations(SphereGeom, RandomPointLocators);
function CreateNullsAtPointLocations( InGeom, InPointLocators )
{
var SpherePositions = InGeom.EvaluatePositions(InPointLocators).toArray();
var SphereNormals = InGeom.EvaluateNormals(InPointLocators).toArray();
var TempVector = XSIMath.CreateVector3();
var TempRotation = XSIMath.CreateRotation();
for (i = 0; i < SpherePositions.length; i+=3)
{
var NullObj = GetPrim( "Null" );
TempVector.Set(SpherePositions[i], SpherePositions[i+1], SpherePositions[i+2]);
NullObj.LocalTranslation = TempVector;
TempVector.Set(SphereNormals[i], SphereNormals[i+1], SphereNormals[i+2]);
TempRotation.SetFromXYZAxes( TempVector, TempVector, TempVector );
NullObj.LocalRotation = TempRotation;
}
} |
PointLocatorData Geometry Geometry.GetClosestLocations Geometry.GetClosestLocationsWithinRadius Geometry.SetupPointLocatorQueries Geometry.GetSurfacePointLocatorsFromPoints Geometry.EvaluatePositions Geometry.EvaluateNormals Geometry.EvaluateClusterProperty PolygonMesh.GetPolygonIndexArray PolygonMesh.GetTriangleVertexIndexArray PolygonMesh.GetTriangleNodeIndexArray PolygonMesh.GetTriangleWeightArray NurbsSurfaceMesh.GetSubSurfaceIndexArray NurbsSurfaceMesh.GetNormalizedUVArray NurbsSurfaceMesh.ConstructPointLocators PolygonFace.TriangleSubIndexArray