Aby zobaczyć jak tworzyć etykiety 3D, zobaczymy jak działa funkcja, która to realizuje: CreateTextLabel3D
. Ta funkcja jest odpowiedzialna za wytworzenie obiektu typu ModelVisual3D
, zawierającego etykiety 3D. Funkcja ta będzie miała następującą deklarację:
public static ModelVisual3D CreateTextLabel3D( string text, Brush textColor, bool isDoubleSided, double height, Point3D basePoint, bool isBasePointCenterPoint, Vector3D vectorOver, Vector3D vectorUp);
Parametry wywołania:
- text - tekst który chcemy narysować
- textColor - kolor tekstu
- isDoubleSided - czy ma być widoczny z dwóch stron?
- height - wysokość znaków
- basePoint - punkt bazowy etykiety
- isBasePointCenterPoint - jeśli ustawione na true punkt bazowy jest punktem centralnym etykiety
- vectorOver - wektor poziomy napisu
- vectorUp - wektor pionowy napisu
Funkcja zwraca: element dodawany do Viewport3D
Uwaga: Dwa wektory: vectorOver i vectorUp tworzą powierzchnię, na której rysowany jest tekst. obydwa wektory używane są do wyliczeń wielkości etykiety więc najlepiej, by każda ich współrzędna była 0 lub 1. np. [1,1,0] lub [1,0,1], etc...
Jak ona działa?
- W pierwszym kroku tworzymy TextBlock , który zawiera naszą etykietę.
TextBlock textblock = new TextBlock(new Run(text));
textblock.Foreground = textColor; // ustawianie koloru
textblock.FontFamily = new FontFamily("Arial"); // ustawianie czcionki
- W drugim kroku, tworzymy pędzel i materiał TextBlock , który zawiera stworzony w poprzednim kroku.
DiffuseMaterial mataterialWithLabel = new DiffuseMaterial();
// Allows the application of a 2-D brush,
// like a SolidColorBrush or TileBrush, to a diffusely-lit 3-D model.
// we are creating the brush from the TextBlock
mataterialWithLabel.Brush = new VisualBrush(textblock);
- Teraz czas jest na przygotowanie objektu 3D, który zostanie pokryty tekstem
//calculation of text width (assumming that characters are square):
double width = text.Length * height;
// we need to find the four corners
// p0: the lower left corner; p1: the upper left
// p2: the lower right; p3: the upper right
Point3D p0 = basePoint;
// when the base point is the center point we have to set it up in different way
if(isBasePointCenterPoint)
p0 = basePoint - width / 2 * vectorOver - height / 2 * vectorUp;
Point3D p1 = p0 + vectorUp * 1 * height;
Point3D p2 = p0 + vectorOver * width;
Point3D p3 = p0 + vectorUp * 1 * height + vectorOver * width;
// we are going to create object in 3D now:
// this object will be painted using the (text) brush created before
// the object is rectangle made of two triangles (on each side).
MeshGeometry3D my3D_Restangle = new MeshGeometry3D();
my3D_Restangle.Positions = new Point3DCollection();
my3D_Restangle.Positions.Add(p0); // 0
my3D_Restangle.Positions.Add(p1); // 1
my3D_Restangle.Positions.Add(p2); // 2
my3D_Restangle.Positions.Add(p3); // 3
// when we want to see the text on both sides:
if (isDoubleSided)
{
my3D_Restangle.Positions.Add(p0); // 4
my3D_Restangle.Positions.Add(p1); // 5
my3D_Restangle.Positions.Add(p2); // 6
my3D_Restangle.Positions.Add(p3); // 7
}
my3D_Restangle.TriangleIndices.Add(0);
my3D_Restangle.TriangleIndices.Add(3);
my3D_Restangle.TriangleIndices.Add(1);
my3D_Restangle.TriangleIndices.Add(0);
my3D_Restangle.TriangleIndices.Add(2);
my3D_Restangle.TriangleIndices.Add(3);
// when we want to see the text on both sides:
if (isDoubleSided)
{
my3D_Restangle.TriangleIndices.Add(4);
my3D_Restangle.TriangleIndices.Add(5);
my3D_Restangle.TriangleIndices.Add(7);
my3D_Restangle.TriangleIndices.Add(4);
my3D_Restangle.TriangleIndices.Add(7);
my3D_Restangle.TriangleIndices.Add(6);
}
- W kolejnym kroku pokrywamy stworzony przed chwilą obiekt 3D używając materiału stworzonego na początku. // texture coordinates must be set to // stretch the TextBox brush to cover // the full side of the 3D label. my3D_Restangle.TextureCoordinates.Add(new Point(0, 1)); my3D_Restangle.TextureCoordinates.Add(new Point(0, 0)); my3D_Restangle.TextureCoordinates.Add(new Point(1, 1)); my3D_Restangle.TextureCoordinates.Add(new Point(1, 0)); // when the label is double sided: if (isDoubleSided) { my3D_Restangle.TextureCoordinates.Add(new Point(1, 1)); my3D_Restangle.TextureCoordinates.Add(new Point(1, 0)); my3D_Restangle.TextureCoordinates.Add(new Point(0, 1)); my3D_Restangle.TextureCoordinates.Add(new Point(0, 0)); }
- Teraz jest czas na stworznie obiektu
ModelVisual3D
z napisemModelVisual3D result = new ModelVisual3D();
// we are setting the content:
// our 3D rectangle object covered with materila that is made of label
// (TextBox with text)
result.Content = new GeometryModel3D(my3D_Restangle, mataterialWithLabel);
return result;
(To tylko jedna z części artykułu, przeczytaj pozostałe: 1, 2, 3, 4, 5, 6, 7)
Bardzo interesujący wpis
OdpowiedzUsuń