v5.0
指定されたサブディビジョンルールで細分割されたメッシュのジオメトリ描写、サブディビジョンのレベルおよび使用されている場合は不連続角を指定します。ジオメトリ データは 1D 配列で戻され、次の値で構成されます。
1)頂点: x、y、z 値のポリゴン頂点 2D 配列(Nx3)。
2)ポリゴンデータ:順序付けられた、ポリゴン定義の配列。各ポリゴンはエレメントのリストによって定義され、ポリゴン定義の最初のエレメントにはポリゴンのインデックスの数を設定する必要があります。頂点の順序付けは、外側を向く法線を基準として反時計回りの順序付け(右手の法則)に従う必要があります。たとえば、それぞれ 4 つのインデックスを持つポリゴンの配列: {4,0,1,4,3,4,1,2,5,4... }
3)ポリゴン ノード標準配列: 各ポリゴン ノードに標準 X、Y、Z 値を含む·2D 配列。
4)各ポリゴンフェイスに対するポリゴンノード:各ポリゴンフェイスにおけるポリゴンノードの数の後に、対応するポリゴンノードのインデックスが続く 1D 配列。
5)UVW 配列:連続するUVクラスタプロパティである ClusterProperty オブジェクトを含む 1D 配列で、オブジェクトそれぞれには対応する 1D 配列が続きます。この配列は UVW クラスタプロパティの各ポリゴンノードに対する UVW 値からなります。
6)カラー配列:連続する頂点カラークラスタプロパティである ClusterProperty オブジェクトを含む 1D 配列で、オブジェクトそれぞれには対応する 1D 配列が続きます。この配列は頂点カラープロパティの各ポリゴンノードに対する RGBA 値からなります。
7)マテリアル配列:連続するポリゴンクラスタである Material オブジェクトを含む 1D 配列で、オブジェクトそれぞれには対応する 1D 配列が続きます。この配列は各ポリゴンクラスタの補間されたポリゴン値からなります。
8)ウェイト配列:現時点ではサポートされていません。
9)エンベロープウェイト配列:現時点ではサポートされていません。
注:C++ API 相当の PolygonMesh::GetGeometryAccessor 関数は、必要なデータのみを取得できる(ゆえにこのデータへのアクセス効率を格段に向上させる)CGeometryAccessor オブジェクトを戻します。
Object PolygonMesh.GetApproximatedMeshAndAttributes( siSubdivisionRuleType in_SubRule, Int32 in_lSubdivisionLevel, Boolean in_bDiscontinuity, Double in_dDiscontinuityAngle ); |
oArray = PolygonMesh.GetApproximatedMeshAndAttributes( SubdivisionRule, SubdivisionLevel, UseDiscontinuity, DiscontinuityAngle ); |
1DArray
パラメータ | タイプ | 説明 |
---|---|---|
SubdivisionRule | siSubdivisionRuleType | このパラメータには、アプロクシメーションに使用するサブディビジョンルールが含まれます。 |
SubdivisionLevel | Long | このパラメータには、アプロクシメーションに使用するサブディビジョンルールが含まれます。 |
UseDiscontinuity | Boolean | 不連続角を使用するかどうかを指定します。 |
DiscontinuityAngle | Double | 不連続角を指定します。 |
' ' This example illustrates how to create a nem PolygonMesh from an ApproximatedMesh ' and how to carry over the attributes. ' set oCube = ActiveSceneRoot.AddGeometry("Cube","MeshSurface") set oMaterial = oCube.AddMaterial("Blinn") 'Add Polygon Material and texture set oPolygonCluster = oCube.ActivePrimitive.Geometry.AddCluster(siPolygonCluster, ,Array(4)) set oMaterial = oPolygonCluster.AddMaterial("Phong") set oImage = AddImageSource( "$SI_HOME\Data\XSI_SAMPLES\Pictures\jio.jpg" ) set oImageClip = AddImageClip( oImage ) set oPhong = oMaterial.Shaders("Phong") set oColor8Mix1 = oPhong.ambient.connectfromprogid("Softimage.sib_color_8mix.1") set oColor8Mix2 = oPhong.diffuse.connectfromprogid("Softimage.sib_color_8mix.1") set oTex2D = oColor8Mix1.color1.connectfromprogid("Softimage.txt2d-image-explicit.1") call oColor8Mix2.color1.connect(oTex2D) set oTex2D.tex.source = oImageClip 'Add Polygon Material set oPolygonCluster = oCube.ActivePrimitive.Geometry.AddCluster(siPolygonCluster,,Array(0,1)) set oMaterial = oPolygonCluster.AddMaterial("Lambert") 'Add UV and VertexColor Properties set oSamplePointCluster = oCube.ActivePrimitive.Geometry.AddCluster(siSampledPointCluster) set oUVProp = oSamplePointCluster.AddProperty("Texture Projection") set oRGBAProp = oSamplePointCluster.AddProperty("Vertex Color") set oGApprox = oCube.Properties.Find("geomapprox") oGApprox.Parameters("gapproxmosl").value = 1 MakeLocal oGApprox ApproxVersion( oCube) 'This function will duplicate the approximated version of the if selection.count > 0 then ApproxVersion( selection(0)) else Application.LogMessage "You must select a PolygonMesh" end if 'This function will duplicate the approximated version of the Sub ApproxVersion(in_obj) Dim l_NewMesh Dim l_Parent Dim l_AllInputUVTxtAndCAV Dim l_AllOutputUVTxtAndCAV Dim l_GeometryApproximation Dim l_NewLocalGeometryApproximation Dim l_aVertices Dim l_aPolygonData Dim l_aPolygonNodeNormalArray Dim l_aUVArray Dim l_aColorArray Dim l_aMaterialArray Dim l_LocalProperties Dim l_attribs set l_AllInputUVTxtAndCAV = CreateObject( "XSI.Collection") set l_AllOutputUVTxtAndCAV = CreateObject( "XSI.Collection") 'Check that in_obj is an object if not(IsObject(in_obj)) then Application.LogMessage "The inputed parameter must be a 3D Object." Exit Sub end if if not(in_obj.BelongsTo("3D Object")) then Application.LogMessage "The inputed object must be a 3D Object." Exit Sub end if 'If the object is not a PolygonMesh than exit the function if in_obj.activeprimitive.geometry.type <> "PolygonMesh" then Application.LogMessage in_obj & " has to be a polymesh object" Exit Sub end if set l_GeometryApproximation = in_Obj.Properties.Find("geomapprox") l_attribs = in_obj.ActivePrimitive.Geometry.GetApproximatedMeshAndAttributes( _ l_GeometryApproximation.Parameters("gapproxmosr").value,_ l_GeometryApproximation.Parameters("gapproxmosl").value,_ l_GeometryApproximation.Parameters("gapproxmoad").value,_ l_GeometryApproximation.Parameters("gapproxmoan").value ) l_aVertices = l_attribs(0) l_aPolygonData = l_attribs(1) l_aPolygonNodeNormalArray = l_attribs(2) l_aPolygonNodePolygonFaceIndexArray = l_attribs(3) l_aPolygonFaceParentPolygonFaceIndexArray = l_attribs(4) l_aUVArray = l_attribs(5) l_aColorArray = l_attribs(6) l_aMaterialArray = l_attribs(7) set l_Parent = in_obj.Parent set l_NewMesh = l_Parent.AddPolygonMesh(l_aVertices,l_aPolygonData) 'Copy local properties set l_LocalProperties = in_obj.LocalProperties for each iLocProp in l_LocalProperties CopyPaste iLocProp,,l_NewMesh,2 next 'If the geometry approximation is a local property we set the subdivision level to '0 as it is the most likely thing users want to do. set l_NewLocalGeometryApproximation = l_NewMesh.LocalProperties.Find("geomapprox") if IsObject(l_NewLocalGeometryApproximation) and TypeName(l_NewLocalGeometryApproximation) <> "Nothing" then l_NewLocalGeometryApproximation.Parameters("gapproxmosl").value = 0 end if 'Add a sample cluster if there's some VertexColors or UVProp if IsArray(l_aUVArray) then i = 0 do while i < ubound(l_aUVArray) set l_Cluster = l_NewMesh.ActivePrimitive.Geometry.AddCluster(siSampledPointCluster) set l_UVProp = l_Cluster.AddProperty("Texture Projection", ,l_aUVArray(i).Name & "_" & l_Cluster.Name) ReDim l_UVPropArray(2,(l_Cluster.Elements.Count - 1)) for j = 0 to l_Cluster.Elements.Count-1 l_UVPropArray(0,j) = l_aUVArray(i+1)(j*3) l_UVPropArray(1,j) = l_aUVArray(i+1)(j*3 + 1) l_UVPropArray(2,j) = l_aUVArray(i+1)(j*3 + 2) next l_UVProp.Elements.Array = l_UVPropArray l_AllInputUVTxtAndCAV.Add l_aUVArray(i) l_AllOutputUVTxtAndCAV.Add l_UVProp i = i+2 Loop end if if IsArray(l_aColorArray) then i = 0 do while i < ubound(l_aColorArray) set l_Cluster = l_NewMesh.ActivePrimitive.Geometry.AddCluster(siSampledPointCluster) set l_ColorProp = l_Cluster.AddProperty("Vertex Color", ,l_aColorArray(i).Name & "_" & l_Cluster.Name) ReDim l_ColorPropArray(3,l_Cluster.Elements.Count - 1) for j = 0 to l_Cluster.Elements.Count-1 l_ColorPropArray(0,j) = l_aColorArray(i+1)(j*4) l_ColorPropArray(1,j) = l_aColorArray(i+1)(j*4 + 1) l_ColorPropArray(2,j) = l_aColorArray(i+1)(j*4 + 2) l_ColorPropArray(3,j) = l_aColorArray(i+1)(j*4 + 3) next l_ColorProp.Elements.Array = l_ColorPropArray l_AllInputUVTxtAndCAV.Add l_aColorArray(i) l_AllOutputUVTxtAndCAV.Add l_ColorProp i = i+2 Loop end if if IsArray(l_aMaterialArray) then Dim l_bEmptyMaterialIndexArray Dim l_CurrentMaterial Dim l_NewMaterial Dim l_NewCluster Dim l_MaxIndex Dim l_MaterialIndexArray Dim l_Material i = 0 do while i < ubound(l_aMaterialArray) set l_NewCluster = l_NewMesh.ActivePrimitive.Geometry.AddCluster(siPolygonCluster, , l_aMaterialArray(i+1)) MakeLocal l_NewCluster.Material CopyPaste l_aMaterialArray(i),,l_NewCluster,2 SIRebindByNameUserData l_NewCluster.Material, l_AllInputUVTxtAndCAV, l_AllOutputUVTxtAndCAV i = i+2 Loop end if 'Rebind the material that may be a local property at object level SIRebindByNameUserData l_NewMesh.Material, l_AllInputUVTxtAndCAV, l_AllOutputUVTxtAndCAV SelectObj l_NewMesh End Sub |