How to create a multipatch using a series of triangles


Development licensing Deployment licensing
ArcView ArcView
ArcEditor ArcEditor
ArcInfo ArcInfo
Engine Developer Kit Engine Runtime

Additional Requirements
  • This article assumes your project includes references to the ESRI Geometry assembly.

Creating a multipatch using a series of triangles

The following shows a simple code example of constructing a textured MultiPatch geometry using a TriangleStrip that resembles a vertical polygon, assuming it is 300 (width) x 100 (height) in size:
 

[C#]
public IMultiPatch CreateMultipatch()
{
//Prepare the geometry material list.
IGeometryMaterial texture = new GeometryMaterialClass();
texture.TextureImage = "C:\\Temp\\MyImage.bmp";

IGeometryMaterialList materialList = new GeometryMaterialListClass();
materialList.AddMaterial(texture);

//Create the multipatch.
IGeneralMultiPatchCreator multiPatchCreator = new GeneralMultiPatchCreatorClass();
multiPatchCreator.Init(4, 1, false, false, false, 4, materialList);

//Set up part.

//Could also use a Ring or a TriangleFan.
multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip);
multiPatchCreator.SetMaterialIndex(0, 0);
multiPatchCreator.SetPatchPointIndex(0, 0);
multiPatchCreator.SetPatchTexturePointIndex(0, 0);

//Set real-world points.
WKSPointZ upperLeft  = new WKSPointZ();
WKSPointZ lowerLeft  = new WKSPointZ();
WKSPointZ upperRight = new WKSPointZ();
WKSPointZ lowerRight = new WKSPointZ();

upperLeft.X = 0;
upperLeft.Y = 0;
upperLeft.Z = 0;
upperRight.X = 300;
upperRight.Y = 0;
upperRight.Z = 0;
lowerLeft.X = 0;
lowerLeft.Y = 0;
lowerLeft.Z = -100;
lowerRight.X = 300;
lowerRight.Y = 1;
lowerRight.Z = -100;

multiPatchCreator.SetWKSPointZ(0, ref upperRight);
multiPatchCreator.SetWKSPointZ(1, ref lowerRight);
multiPatchCreator.SetWKSPointZ(2, ref upperLeft);
multiPatchCreator.SetWKSPointZ(3, ref lowerLeft);

//Set texture points.
//Set the texture coordinates for a panel.
WKSPoint textureUpperLeft  = new WKSPoint();
WKSPoint textureLowerLeft  = new WKSPoint();
WKSPoint textureUpperRight = new WKSPoint();
WKSPoint textureLowerRight = new WKSPoint();

textureUpperLeft.X = 0;
textureUpperLeft.Y = 0;
textureUpperRight.X = 1;
textureUpperRight.Y = 0;
textureLowerLeft.X = 0;
textureLowerLeft.Y = 1;
textureLowerRight.X = 1;
textureLowerRight.Y = 1;

multiPatchCreator.SetTextureWKSPoint(0, ref textureUpperRight);
multiPatchCreator.SetTextureWKSPoint(1, ref textureLowerRight);
multiPatchCreator.SetTextureWKSPoint(2, ref textureUpperLeft);
multiPatchCreator.SetTextureWKSPoint(3, ref textureLowerLeft);
IMultiPatch multiPatch = multiPatchCreator.CreateMultiPatch() as IMultiPatch;

return multiPatch;
}

[VB.NET]
Private Function CreateMultipatch() As IMultiPatch
  'Prepare the geometry material list.
  Dim texture As IGeometryMaterial = New GeometryMaterialClass()
  texture.TextureImage = "C:\\Temp\\MyImage.bmp"
  Dim materialList As IGeometryMaterialList = New GeometryMaterialListClass()
  materialList.AddMaterial(texture)

  'Create the multipatch.
  Dim multiPatchCreator As IGeneralMultiPatchCreator = New GeneralMultiPatchCreatorClass() 
  multiPatchCreator.Init(4, 1, False, False, False, 4, materialList)
  
  'Set up part.
  'Could also use a Ring or a TriangleFan.
  multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip) 
  multiPatchCreator.SetMaterialIndex(0, 0)
  multiPatchCreator.SetPatchPointIndex(0, 0)
  multiPatchCreator.SetPatchTexturePointIndex(0, 0)
  
  'Set real-world points.
  Dim upperLeft As WKSPointZ = New WKSPointZ()
  Dim lowerLeft As WKSPointZ = New WKSPointZ()
  Dim upperRight As WKSPointZ = New WKSPointZ()
  Dim lowerRight As WKSPointZ = New WKSPointZ()
  upperLeft.X = 0
  upperLeft.Y = 0
  upperLeft.Z = 0
  upperRight.X = 300
  upperRight.Y = 0
  upperRight.Z = 0
  lowerLeft.X = 0
  lowerLeft.Y = 0
  lowerLeft.Z = -100
  lowerRight.X = 300
  lowerRight.Y = 1
  lowerRight.Z = -100
  multiPatchCreator.SetWKSPointZ(0, upperRight) 
  multiPatchCreator.SetWKSPointZ(1, lowerRight) 
  multiPatchCreator.SetWKSPointZ(2, upperLeft)
  multiPatchCreator.SetWKSPointZ(3, lowerLeft)
 
  'Set texture points.
  'Set the texture coordinates for a panel.
  Dim textureUpperLeft As WKSPoint = New WKSPoint()
  Dim textureLowerLeft As WKSPoint = New WKSPoint()
  Dim textureUpperRight As WKSPoint = New WKSPoint()
  Dim textureLowerRight As WKSPoint = New WKSPoint()
  textureUpperLeft.X = 0
  textureUpperLeft.Y = 0
  textureUpperRight.X = 1
  textureUpperRight.Y = 0
  textureLowerLeft.X = 0
  textureLowerLeft.Y = 1
  textureLowerRight.X = 1
  textureLowerRight.Y = 1
  multiPatchCreator.SetTextureWKSPoint(0, textureUpperRight)
  multiPatchCreator.SetTextureWKSPoint(1, textureLowerRight)
  multiPatchCreator.SetTextureWKSPoint(2, textureUpperLeft)
  multiPatchCreator.SetTextureWKSPoint(3, textureLowerLeft)
  Dim multiPatch As IMultiPatch = CType(multiPatchCreator.CreateMultiPatch(), IMultiPatch)
  Return multiPatch
End Function