2,856 questions
Hi, if you want see line you must create triangles. Try following code:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="-10,20,10" LookDirection="40,-40,-40" UpDirection="0,0,1"/>
</Viewport3D.Camera>
<ModelVisual3D Content="{Binding MGroup}"/>
</Viewport3D>
public class ViewModel
Hi, if you want see line you must create triangles. try following code:
{
public Model3DGroup MGroup { get => GetData(); }
private ObservableCollection<Line> col = new ObservableCollection<Line>();
private Model3DGroup GetData()
{
// collection of lines
Point pt1 = new Point(0, 0);
Point pt2 = new Point(10, 0);
for (int i = 0; i < 10; i++) col.Add(new Line() { X1 = pt1.X, X2 = pt2.X, Y1 = pt1.Y + i, Y2 = pt2.Y + i });
// create ModelGroup
Model3DGroup gr = new Model3DGroup();
gr.Children.Add(new DirectionalLight(Colors.White, new Vector3D(-1, -1, -3)));
foreach (var item in col)
{
GeometryModel3D mod = AddLine(new Point3D(item.X1, item.Y1, 0), new Point3D(item.X2, item.Y2, 0));
gr.Children.Add(mod);
}
return gr;
}
private GeometryModel3D AddLine(Point3D startPoint, Point3D endPoint)
{
var material = new DiffuseMaterial(new SolidColorBrush(Colors.Red));
var mesh = new MeshGeometry3D();
mesh.Positions.Add(startPoint);
mesh.Positions.Add(endPoint);
mesh.Positions.Add(new Point3D(startPoint.X, startPoint.Y + .1, startPoint.Z));
mesh.Positions.Add(new Point3D(endPoint.X, endPoint.Y + .1, endPoint.Z));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(3);
mesh.TriangleIndices.Add(3);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(0);
return new GeometryModel3D(mesh, material);
}
}
public class MyViewPort
{
private Viewport3D _vPort;
public Viewport3D VPort
{
get => this._vPort;
set
{
if (this._vPort == null)
{
this._vPort = value;
this._vPort.MouseDown += _vPort_MouseDown;
this._vPort.MouseMove += _vPort_MouseMove;
this._vPort.MouseUp += _vPort_MouseUp;
this._vPort.Loaded += _vPort_Loaded;
}
}
}
private AxisAngleRotation3D rot = new AxisAngleRotation3D(new Vector3D(0, 2, 0), 0);
private void _vPort_Loaded(object sender, RoutedEventArgs e)
{
var mod = this._vPort.Children[0] as ModelVisual3D;
mod.Transform = new RotateTransform3D(rot);
}
private Point pt = new Point(double.NaN, double.NaN);
private void _vPort_MouseDown(object sender, MouseButtonEventArgs e) => pt = e.GetPosition(this._vPort);
private void _vPort_MouseMove(object sender, MouseEventArgs e)
{
if (!double.IsNaN(pt.X))
{
Point pt1 = e.GetPosition(this._vPort);
double ang = pt1.X - pt.X;
rot.Angle = ang;
}
}
private void _vPort_MouseUp(object sender, MouseButtonEventArgs e) => pt = new Point(double.NaN, double.NaN);
}