Мне нужно вывести модель сакуры (формат obj). У меня есть кадр, к которому я применяю текстуры. Проблема в том, что при применении цветочных текстур прозрачные части как будто перекрывают другие объекты, хотя теоретически они должны быть прозрачными и сквозь них должны быть видны другие объекты.
< li>Изображение, на котором прозрачная часть цветка перекрывает ветку
У меня есть треугольники, на которые я накладываю изображение цветка. Саму рамку я сделал прозрачной, картинка, которую я накладываю, тоже имеет прозрачную часть и непрозрачный цветок. Но при наложении прозрачность работает некорректно. Вот код с примером с двумя цветами.
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
namespace WpfApp4;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadModel();
}
private void LoadModel()
{
var obj = new Object3D
{
vertices = new[]
{
new Point3D(4, 15, -10),
new Point3D(3, 16, -9),
new Point3D(4, 16, -10),
new Point3D(4, 16, -10),
new Point3D(4, 16, -8),
new Point3D(5, 17, -10)
},
normals = new[]
{
new Vector3D(-1, 0, -1),
new Vector3D(0, 1, 0)
},
texCoords = new[]
{
new Point(1, 0),
new Point(0, 1),
new Point(0, 0),
new Point(1, 0),
new Point(0, 1),
new Point(0, 0)
},
surfaces = new[]
{
new Surface { vertices = new[] { 0, 1, 2 } },
new Surface { vertices = new[] { 3, 4, 5 } }
},
material = new MaterialInfo
{
diffuseColor = Colors.White,
emissiveColor = Colors.Black,
specularColor = Colors.Gray,
reflectionIndex = 0.5,
material_file_name = "flower.png"
}
};
var model = AddObjectToScene(obj);
Viewport3D.Children.Add(model);
}
private ModelVisual3D AddObjectToScene(Object3D obj)
{
var model = new ModelVisual3D();
var model3D = new GeometryModel3D();
var mesh = new MeshGeometry3D();
var normals = new Vector3DCollection
{
new Vector3D(-1, 0, -1),
new Vector3D(0, 1, 0)
};
mesh.Normals = normals;
var positions = new Point3DCollection
{
new Point3D(4, 15, -10),
new Point3D(3, 16, -9),
new Point3D(4, 16, -10),
new Point3D(4, 15, -11),
new Point3D(3, 16, -10),
new Point3D(4, 16, -11)
};
mesh.Positions = positions;
var triangleIndices = new Int32Collection { 0, 1, 2, 3, 4, 5 };
mesh.TriangleIndices = triangleIndices;
mesh.TextureCoordinates = new PointCollection
{
new Point(1, 0.5),
new Point(0.5, 1),
new Point(0, 0),
new Point(1, 0.5),
new Point(0.5, 1),
new Point(0, 0)
};
model3D.Geometry = mesh;
var myMaterialGroup = new MaterialGroup();
Material mt1 = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(0,255,255,255)));
Material mt2 = new EmissiveMaterial(new SolidColorBrush(Colors.Black));
Material mt3 = new SpecularMaterial(new SolidColorBrush(Colors.Gray), 0.5);
Material texture = null;
var imageBrush = new ImageBrush
{
ImageSource = new BitmapImage(new Uri(obj.material.material_file_name, UriKind.RelativeOrAbsolute)),
Opacity = 1
};
texture = new DiffuseMaterial(imageBrush);
myMaterialGroup.Children.Add(mt1);
myMaterialGroup.Children.Add(mt3);
myMaterialGroup.Children.Add(mt2);
if (texture != null)
myMaterialGroup.Children.Add(texture);
model3D.Material = myMaterialGroup;
model.Content = model3D;
return model;
}
}
public class Object3D
{
public Point3D[] vertices { get; set; }
public Vector3D[] normals { get; set; }
public Point[] texCoords { get; set; }
public Surface[] surfaces { get; set; }
public MaterialInfo material { get; set; }
}
public class Surface
{
public int[] vertices { get; set; }
}
public class MaterialInfo
{
public Color diffuseColor { get; set; }
public Color emissiveColor { get; set; }
public Color specularColor { get; set; }
public double reflectionIndex { get; set; }
public string material_file_name { get; set; }
}
Важное примечание: в средствах просмотра 3D-модель выглядит нормально. Также в рамках задания я не могу использовать OpenGl и другие продвинутые библиотеки.
Мне нужно вывести модель сакуры (формат obj). У меня есть кадр, к которому я применяю текстуры. Проблема в том, что при применении цветочных текстур прозрачные части как будто перекрывают другие объекты, хотя теоретически они должны быть прозрачными и сквозь них должны быть видны другие объекты. [list] < li>Изображение, на котором прозрачная часть цветка перекрывает ветку
[img]https://i.sstatic.net/CQPXLZrk.png[/img]
[/list] У меня есть треугольники, на которые я накладываю изображение цветка. Саму рамку я сделал прозрачной, картинка, которую я накладываю, тоже имеет прозрачную часть и непрозрачный цветок. Но при наложении прозрачность работает некорректно. Вот код с примером с двумя цветами. [code]using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Media.Media3D;
namespace WpfApp4;
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); LoadModel(); }
private void LoadModel() { var obj = new Object3D { vertices = new[] { new Point3D(4, 15, -10), new Point3D(3, 16, -9), new Point3D(4, 16, -10), new Point3D(4, 16, -10), new Point3D(4, 16, -8), new Point3D(5, 17, -10) }, normals = new[] { new Vector3D(-1, 0, -1), new Vector3D(0, 1, 0) }, texCoords = new[] { new Point(1, 0), new Point(0, 1), new Point(0, 0), new Point(1, 0), new Point(0, 1), new Point(0, 0) }, surfaces = new[] { new Surface { vertices = new[] { 0, 1, 2 } }, new Surface { vertices = new[] { 3, 4, 5 } } }, material = new MaterialInfo { diffuseColor = Colors.White, emissiveColor = Colors.Black, specularColor = Colors.Gray, reflectionIndex = 0.5, material_file_name = "flower.png" } };
var model = AddObjectToScene(obj); Viewport3D.Children.Add(model); }
private ModelVisual3D AddObjectToScene(Object3D obj) { var model = new ModelVisual3D(); var model3D = new GeometryModel3D(); var mesh = new MeshGeometry3D();
var normals = new Vector3DCollection { new Vector3D(-1, 0, -1), new Vector3D(0, 1, 0) }; mesh.Normals = normals; var positions = new Point3DCollection { new Point3D(4, 15, -10), new Point3D(3, 16, -9), new Point3D(4, 16, -10), new Point3D(4, 15, -11), new Point3D(3, 16, -10), new Point3D(4, 16, -11) }; mesh.Positions = positions;
var triangleIndices = new Int32Collection { 0, 1, 2, 3, 4, 5 }; mesh.TriangleIndices = triangleIndices;
mesh.TextureCoordinates = new PointCollection { new Point(1, 0.5), new Point(0.5, 1), new Point(0, 0), new Point(1, 0.5), new Point(0.5, 1), new Point(0, 0) };
model3D.Geometry = mesh;
var myMaterialGroup = new MaterialGroup(); Material mt1 = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(0,255,255,255))); Material mt2 = new EmissiveMaterial(new SolidColorBrush(Colors.Black)); Material mt3 = new SpecularMaterial(new SolidColorBrush(Colors.Gray), 0.5);
Material texture = null; var imageBrush = new ImageBrush { ImageSource = new BitmapImage(new Uri(obj.material.material_file_name, UriKind.RelativeOrAbsolute)), Opacity = 1 }; texture = new DiffuseMaterial(imageBrush);
if (texture != null) myMaterialGroup.Children.Add(texture);
model3D.Material = myMaterialGroup;
model.Content = model3D; return model; } }
public class Object3D { public Point3D[] vertices { get; set; } public Vector3D[] normals { get; set; } public Point[] texCoords { get; set; } public Surface[] surfaces { get; set; } public MaterialInfo material { get; set; } }
public class Surface { public int[] vertices { get; set; } }
public class MaterialInfo { public Color diffuseColor { get; set; } public Color emissiveColor { get; set; } public Color specularColor { get; set; } public double reflectionIndex { get; set; } public string material_file_name { get; set; } }
[/code] и камера [code]
[/code] [img]https://i.sstatic.net/W7l8PIwX.png[/img] Важное примечание: в средствах просмотра 3D-модель выглядит нормально. Также в рамках задания я не могу использовать OpenGl и другие продвинутые библиотеки.