Попытка нарисовать края прямоугольного куба в WPF, но безуспешно
Я пытаюсь нарисовать и отобразить только края или стороны прямоугольного куба, но все еще безуспешно, используя WPF. Это внутри пользовательского элемента управления, который я хочу отобразить в приложении Windows Form (C#). Как я уже видел, трехмерные объекты в WPF создаются с использованием треугольников, поэтому я попытался нарисовать линии с помощью прямоугольников, где ширина прямоугольника мала (достаточно, чтобы его можно было распознать как кромку или сторону куба), но он не отображается правильно. вот код, который я использую:
<UserControl x:Class="Spatial_and_Temporal_Research.BoundingBoxes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" DataContext="{Binding}" Height="509" Width="739" FontFamily="Times New Roman">
<Grid>
<!-- Place a Label control at the top of the view. -->
<Label
HorizontalAlignment="Center"
TextBlock.TextAlignment="Center"
FontSize="20"
Foreground="Red"
Content="Model: Cone"/>
<!-- Viewport3D is the rendering surface. -->
<Viewport3D Name="myViewport" >
<!-- Add a camera. -->
<Viewport3D.Camera>
<PerspectiveCamera
FarPlaneDistance="20"
LookDirection="-6, -5, -4"
UpDirection="0,1,0"
NearPlaneDistance="1"
Position="6 5 4"
FieldOfView="45" />
</Viewport3D.Camera>
<!-- Add models. -->
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup >
<Model3DGroup.Children>
<!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -->
<AmbientLight Color="White" />
<!-- Define a red cone. -->
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.55 -0.5 -0.5 -0.45 -0.5 -0.5 -0.55 -0.5 0.5 -0.45 -0.5 0.5 -0.55 0.5 -0.5 -0.45 0.5 -0.5 -0.55 0.5 0.5 -0.45 0.5 0.5 0.45 -0.5 -0.5 0.55 -0.5 -0.5 0.45 -0.5 0.5 0.55 -0.5 0.5 -0.5 -0.55 -0.5 -0.5 -0.45 -0.5 0.5 -0.55 -0.5 0.5 -0.45 -0.5 -0.5 -0.55 0.5 -0.5 -0.45 0.5 0.5 -0.55 0.5 0.5 -0.45 0.5 0.45 0.5 -0.5 0.55 0.5 -0.5 0.45 0.5 0.5 0.55 0.5 0.5 -0.5 0.45 -0.5 -0.5 0.55 -0.5 0.5 0.45 -0.5 0.5 0.55 -0.5 -0.5 0.45 0.5 -0.5 0.55 0.5 0.5 0.45 0.5 0.5 0.55 0.5"
TriangleIndices="0 2 3 3 1 0 4 6 7 7 5 4 1 0 4 4 5 1 3 2 6 6 7 3 8 10 11 11 9 8 13 12 14 14 15 13 17 16 18 18 19 17 20 22 23 23 21 20 17 16 20 20 21 17 19 18 22 22 23 19 25 24 26 26 27 25 29 28 30 30 31 29"
>
</MeshGeometry3D>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush
Color="Red"
Opacity="1.0"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
</Model3DGroup.Children>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
</UserControl>
Я подумываю попробовать другие графические библиотеки, такие как opengl или gdi+. Если вы знаете, как нарисовать 3D-линию в wpf, продемонстрируйте пример. Любая помощь будет оценена. Заранее спасибо.
2 ответа
Если вы хотите визуализировать сетку вашего 3D-объекта, порекомендуйте добавить Helixtoolkit. Но "linevisual3D", содержащийся в этом дополнении, довольно неубедительный... Я призываю вас думать не о трехмерных призмах (как сказал SlimsGhost), а о двухмерных прямоугольниках, а затем использовать свойства материала, чтобы сделать его видимым в обоих направлениях. Я кодировал это, и он работает очень хорошо (лучше, чем Helix Linevisual3D)
Я хотел добавить изображение, но не могу, так как у меня нет моих "10 очков репутации" ^^:
PS: если это действительно вызывает интерес, я могу опубликовать метод в другой специальной теме.
С наилучшими пожеланиями
Что бы вы ни рисовали, это нужно тесселяции, поскольку WPF по существу рисует треугольники.
Таким образом, чтобы смоделировать линию как набор мозаичных поверхностей, сначала представьте, что линия сплошная или, более конкретно, длинная прямоугольная призма с небольшим поперечным сечением. Если вы думаете о линии таким образом, у вас есть шестигранное сплошное тело (включая две "заглушки" линии, если вы даже хотите их), и вы можете определить соответствующие треугольники, и WPF будет хорошо их отображать.
Конечно, немного громоздко, но определенно выполнимо.
Если есть лучший способ сделать это в WPF, я бы хотел услышать об этом.
Удачи!