Есть сфера. На сфере нужно нарисовать линию и поворачивать её вместе со сферой с помощью мыши. Как это сделать? Как привязать линию к сфере? Сейчас все рисуется вот так вот: | Код | <Window x:Class="WpfApplication8.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:Primitive3DSurfaces;assembly=Primitive3DSurfaces" Title="tst WPF3D" Height="344" Width="510"> <Grid Name="myGrid"> <Grid.Background> <LinearGradientBrush StartPoint="1,1" EndPoint="0,0"> <LinearGradientBrush.GradientStops> <GradientStop Color="Black" Offset="0"/> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Grid.Background>
<Viewport3D Grid.Column="0" Grid.Row="0"> <Viewport3D.Camera> <PerspectiveCamera Position="0,0,-8" UpDirection="0,1,0" LookDirection="0,0,1" FieldOfView="30" NearPlaneDistance="0.125"/> </Viewport3D.Camera>
<Viewport3D.Children> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="0,0,1" /> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D>
<my:Sphere3D> <ModelVisual3D.Transform> <Transform3DGroup> <Transform3DGroup.Children> <RotateTransform3D x:Name="myHorizontalRTransform"> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="myHorizontalRotation" Angle="270" Axis="10 3 0" /> </RotateTransform3D.Rotation> </RotateTransform3D> <RotateTransform3D x:Name="myVerticalRTransform"> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="myVerticalRotation" Angle="19" Axis="1 0 0" /> </RotateTransform3D.Rotation> </RotateTransform3D> <TranslateTransform3D x:Name="myTranslateTransform" OffsetX="0" OffsetY="0" OffsetZ="0" /> </Transform3DGroup.Children> </Transform3DGroup> </ModelVisual3D.Transform> <my:Sphere3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <ImageBrush ImageSource="/WpfApplication8;component/Images/Untitled.jpg" /> </DiffuseMaterial.Brush> </DiffuseMaterial> </my:Sphere3D.Material> </my:Sphere3D> </ModelVisual3D> </Viewport3D.Children> </Viewport3D> </Grid> </Window>
|
| Код | namespace Primitive3DSurfaces { public abstract class Primitive3D : ModelVisual3D { //<1> internal abstract Geometry3D Tessellate(); //<2> internal readonly GeometryModel3D _content = new GeometryModel3D();
//<3> public Primitive3D() { Content = _content; _content.Geometry = Tessellate(); }
//<4-1> public static DependencyProperty MaterialProperty = DependencyProperty.Register( "Material", typeof(Material), typeof(Primitive3D), new PropertyMetadata(null, new PropertyChangedCallback(OnMaterialChanged))); //<4-2> public Material Material { get { return (Material)GetValue(MaterialProperty); } set { SetValue(MaterialProperty, value); } }
//<5> internal static void OnMaterialChanged(Object sender, DependencyPropertyChangedEventArgs e) { Primitive3D p = ((Primitive3D)sender); p._content.Material = p.Material; }
//<6> internal static void OnGeometryChanged(DependencyObject d) { Primitive3D p = ((Primitive3D)d); p._content.Geometry = p.Tessellate(); }
//<7> internal double DegToRad(double degrees) { return (degrees / 180.0) * Math.PI; } }
}
|
| Код | namespace Primitive3DSurfaces { public sealed class Sphere3D : Primitive3D { public MeshGeometry3D mesh = new MeshGeometry3D();
internal Point3D GetPosition(double t, double y) { double r = Math.Sqrt(1 - y * y); double x = r * Math.Cos(t); double z = r * Math.Sin(t);
return new Point3D(x, y, z); }
private Vector3D GetNormal(double t, double y) { return (Vector3D)GetPosition(t, y); }
private Point GetTextureCoordinate(double t, double y) { Matrix TYtoUV = new Matrix(); TYtoUV.Scale(1 / (2 * Math.PI), -0.5);
Point p = new Point(t, y); p = p * TYtoUV;
return p; }
internal override Geometry3D Tessellate() { int tDiv = 32; int yDiv = 32; double maxTheta = DegToRad(360.0); double minY = -1.0; double maxY = 1.0;
double dt = maxTheta / tDiv; double dy = (maxY - minY) / yDiv;
for (int yi = 0; yi <= yDiv; yi++) { double y = minY + yi * dy;
for (int ti = 0; ti <= tDiv; ti++) { double t = ti * dt;
mesh.Positions.Add(GetPosition(t, y)); mesh.Normals.Add(GetNormal(t, y)); mesh.TextureCoordinates.Add(GetTextureCoordinate(t, y)); } }
for (int yi = 0; yi < yDiv; yi++) { for (int ti = 0; ti < tDiv; ti++) { int x0 = ti; int x1 = (ti + 1); int y0 = yi * (tDiv + 1); int y1 = (yi + 1) * (tDiv + 1);
mesh.TriangleIndices.Add(x0 + y0); mesh.TriangleIndices.Add(x0 + y1); mesh.TriangleIndices.Add(x1 + y0);
mesh.TriangleIndices.Add(x1 + y0); mesh.TriangleIndices.Add(x0 + y1); mesh.TriangleIndices.Add(x1 + y1); } }
mesh.Freeze(); return mesh; } } }
|
|