Mappingmode ve referencemode açıklar

MappingMode açıklıyor

MappingMode determines how the element data is mapped to the surface of the geometry in Aspose.3D for .NET. It provides various ways to define this mapping:

  1. ControltrolointHer bir veri öğesi geometrinin kontrol noktasına eşleştirilir. Bu mod, geometrinin şeklini tanımlayan her kontrol noktasının belirli bir veri elemanıyla ilişkili olmasını sağlar.
  2. OlyolygongonertexVeriler bir çokgenin verteksine eşleştirilmiştir. Bir kontrol noktasının çoklu çokgenler tarafından paylaşıldığı durumlarda, kontrol noktasının her örneği, farklı poligonlarda göründüğü gibi, kendi ayrı verilerine sahip olacaktır. Bu, paylaşılan kontrol noktalarının bile farklı poligonlar için dikenler olarak hizmet verdiklerinde benzersiz verilere sahip olmasını sağlar.
  3. PolygonVeriler tüm çokgen ile eşleştirilir. Bu, bir çokgenin tüm dikenlerinin aynı veri elemanını paylaştığı anlamına gelir. Bu mod, poligon içindeki tutarlılığı sağlayarak, tüm poligon yüzeyinde tek tip verilerin uygulanması gerektiğinde kullanışlıdır.
  4. EdgeVeriler geometrinin kenarlarına eşleştirilir. Bir kenarın her uç noktası aynı verileri paylaşır ve farklı kenarlar için farklı verilere izin verirken kenarlara düzgün veri uygulamanın bir yolunu sağlar. Bu, kırışık değerleri veya kenar tabanlı özellikler gibi kenarlara özgü özellikleri tanımlamak için özellikle yararlı olabilir.
  5. AllllameTek bir veri elemanı geometrinin tüm yüzeyine eşleştirilir. Verilerin kontrol noktaları, çokgen dikenleri veya kenar uç noktaları olarak yorumlanmasına bakılmaksızın, aynı veri değeri tüm elementler boyunca eşit olarak uygulanır. Bu mod, tüm geometri boyunca sabit bir değerin korunması gereken senaryolar için idealdir ve tüm 3D modelinde tek tip bir özellik sağlar.

ReferenceMode açıklıyor

ReferenceMode verileri endekslerle yeniden kullanıp kullanamayacağını tanımlar, ReferenceMode için üç politika vardır:

1.Doğrudan, data is directly referenced, and stored in VertexElement’s Data property. 1.IndextodirectVeriler indeks ile başvurulur, daha sonra VertexElement veri listesinde dizine erişilir. 1.Dizin, data is only referenced by index, now only the VertexElementMaterial use this reference mode, this is similar to IndexToDirect but the differences is the materials are defined under the Node’s property Materials, not in the VertexElementMaterial, all VertexElement only works with primitive data.

Örneğin, bir küpün tanımı göz önüne alındığında:

var cube = new Mesh();
Vector4[] controlPoints = new Vector4[]
{
    new Vector4( -5.0, 0.0, 5.0, 1.0),
    new Vector4( 5.0, 0.0, 5.0, 1.0),
    new Vector4( 5.0, 10.0, 5.0, 1.0),
    new Vector4( -5.0, 10.0, 5.0, 1.0),
    new Vector4( -5.0, 0.0, -5.0, 1.0),
    new Vector4( 5.0, 0.0, -5.0, 1.0),
    new Vector4( 5.0, 10.0, -5.0, 1.0),
    new Vector4( -5.0, 10.0, -5.0, 1.0)
};
cube.ControlPoints.AddRange(controlPoints);

// Front face (Z+)
cube.CreatePolygon(new int[] { 0, 1, 2, 3 });
// Right side (X+)
cube.CreatePolygon(new int[] { 1, 5, 6, 2 });
// Back face (Z-)
cube.CreatePolygon(new int[] { 5, 4, 7, 6 });
// Left side (X-)
cube.CreatePolygon(new int[] { 4, 0, 3, 7 });
// Bottom face (Y-)
cube.CreatePolygon(new int[] { 0, 4, 5, 1 });
// Top face (Y+)
cube.CreatePolygon(new int[] { 3, 2, 6, 7 });

var vertexColor = (VertexElementVertexColor) cube.CreateElement(VertexElementType.VertexColor);
vertexColor.MappingMode = MappingMode.ControlPoint;
var red = new Vector4(1, 0, 0, 1);
var green = new Vector4(0, 1, 0, 1);
var blue = new Vector4(0, 0, 1, 1);
var white = new Vector4(1, 1, 1, 1);

Kontrol noktaları 0 ve 1, yeşil kontrol noktaları 2 ve 3, mavi kontrol noktaları 4 ve 5 ve beyaz kontrol noktaları 6 ve 7 için kırmızı atamak istiyorsanız, aşağıdaki yaklaşımla bunu elde edebilirsiniz:

vertexColor.ReferenceMode = ReferenceMode.Direct;
vertexColor.Data.Add(red); // 0
vertexColor.Data.Add(red); // 1
vertexColor.Data.Add(green); // 2
vertexColor.Data.Add(green); // 3
vertexColor.Data.Add(blue); // 4
vertexColor.Data.Add(blue); // 5
vertexColor.Data.Add(white); // 6
vertexColor.Data.Add(white); // 7

Noktaları verimli bir şekilde kontrol etmek ve bellek tüketimini azaltmak için renkler atamak için renkleri referans almak için endeksleri kullanabilirsiniz. Renkleri ayrı ayrı tanımlayarak ve bunları endekslerle referans alarak, yedekliliği en aza indirebilirsiniz. İşte bunu nasıl başarabilirsiniz:

İlk olarak, benzersiz renkler için vector4 tipinde 4 renk tanımlayın ve daha sonra bu renkleri her kontrol noktasına atamak için 8 endeksli bir dizi kullanın:

vertexColor.ReferenceMode = ReferenceMode.IndexToDirect;
vertexColor.Data.Add(red);
vertexColor.Data.Add(green);
vertexColor.Data.Add(blue);
vertexColor.Data.Add(white);

vertexColor.SetIndices(new int[] { 0, 0, 1, 1, 2, 2, 3, 3 });

Bu yaklaşımda:

  1. Benzersiz renkleri tanımlayın: vector4 örnekleri olarak sadece 4 renk tanımlanır (kırmızı, yeşil, mavi, beyaz).
  2. Bir renk dizin dizisi oluşturun: her kontrol noktası için bu 4 rengi referans etmek için 8 endeksli bir dizi kullanılır.
  3. Indices kullanarak harita renkleri: renkleri endekslerle referans alarak, her bir renk bir kez saklandığı ve çoklu kontrol noktalarında yeniden kullanıldığı için bellek tüketimini azaltırsınız.

Bu yöntem, yedekli veri depolama alanını düşürerek bellek kullanımını optimize eder ve 3D modelinizi daha verimli hale getirir.