Проблема с прозрачными цветными текстурами, накладывающимися на другие объекты в формате OBJ.C#

Место общения программистов C#
Ответить
Anonymous
 Проблема с прозрачными цветными текстурами, накладывающимися на другие объекты в формате OBJ.

Сообщение Anonymous »

Мне нужно вывести модель сакуры (формат 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 и другие продвинутые библиотеки.


Подробнее здесь: https://stackoverflow.com/questions/792 ... obj-format
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»