Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как привязать линию к сфере, Как привязать линию к сфере 
:(
    Опции темы
vinograd2008
Дата 11.8.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.12.2008

Репутация: нет
Всего: нет



Есть сфера. На сфере нужно нарисовать линию и поворачивать её вместе со сферой с помощью мыши. Как это сделать? Как привязать линию к сфере? Сейчас все рисуется вот так вот:

Код

<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;
        }
    }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.