Пятница, 22 Ноября 2024, 02:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как изменить размер квадрата потянув за его ребро мышкой
zombihelloДата: Четверг, 27 Апреля 2017, 20:46 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем добрый день. Пишу для своего движка небольшой 3д редактор уровней (базовый функционал) на подобии Valve Hammer. Так вот, в чем проблема? Проблема в том
что у меня не получается нормально реализовать изменения размеров браша. А именно когда я рисую с верхнего левого угла в правый нижний (и не только), то вершины отзеркаливаються и перетаскиваются тогда противоположные. Как это справить? Я пытался это профиксить, но все идеи которые ко мне приходили не помогали

Вот здесь я хочу увеличить правую сторону, но оно изменяет левую (движется в сторону курсора)
Помогите решить эту проблему :'( , код под скриншотом


А вот сам код:
Вот так я создаю вершины
Код

public override void Create( Vector3f StartPosition, Vector3f EndPosition )
        {
            //AddVertex - просто в List добавляем вершину
            //AddIdVertex - просто в List добавляем id вершины чтобы знать что с чем соединять

            InitBrush( StartPosition, EndPosition );
            ColorBrush = new Color( 1, 1, 1 );
            DefaultColorBrush = ColorBrush;

            // Front
            AddVertex( 0, 0, 0, Vertex.TypeVertex.LeftBottom ); // 0
            AddVertex( Size.X, 0, 0, Vertex.TypeVertex.RightBottom ); // 1
            AddVertex( Size.X, Size.Y, 0, Vertex.TypeVertex.RightTop ); // 2
            AddVertex( 0, Size.Y, 0, Vertex.TypeVertex.LeftTop ); // 3

            // Back
            AddVertex( 0, 0, Size.Z, Vertex.TypeVertex.Back_LeftBottom ); // 4
            AddVertex( Size.X, 0, Size.Z, Vertex.TypeVertex.Back_RightBottom ); // 5
            AddVertex( Size.X, Size.Y, Size.Z, Vertex.TypeVertex.Back_RightTop ); // 6
            AddVertex( 0, Size.Y, Size.Z, Vertex.TypeVertex.Back_LeftTop ); // 7
            ToGloablCoords();

            // Front
            AddIdVertex( 0 ); AddIdVertex( 1 ); AddIdVertex( 2 ); AddIdVertex( 3 );
            AddIdVertex( 0 ); AddIdVertex( 3 ); AddIdVertex( 1 ); AddIdVertex( 2 );
           // и т.д
        }


Вот так я инициализирую браш
Код

protected void InitBrush( Vector3f StartPosition, Vector3f EndPosition )
        {
            if ( StartPosition.X == 0 )
                StartPosition.X = Viewport.fSize; // Viewport.fSize у меня равен 20 (это размер сетки)

            if ( StartPosition.Y == 0 )
                StartPosition.Y = Viewport.fSize;

            if ( StartPosition.Z == 0 )
                StartPosition.Z = Viewport.fSize;

            Position = Program.Align( StartPosition, Viewport.fSize ); // Align - метод который прикрепляет точку к сетке

            Size.X = Program.Align( EndPosition.X, Viewport.fSize ) - Position.X;
            Size.Y = Program.Align( EndPosition.Y, Viewport.fSize ) - Position.Y;
            Size.Z = Program.Align( EndPosition.Z, Viewport.fSize ) - Position.Z;
        }


Так я привожу к глобальным координатам браш
Код

protected void ToGloablCoords()
        {
            for ( int i = 0; i < mLocalVertex.Count; i++ )
            {
                mGlobalVertex[i].X = mLocalVertex[i].Position.X + Position.X;
                mGlobalVertex[i].Y = mLocalVertex[i].Position.Y + Position.Y;
                mGlobalVertex[i].Z = mLocalVertex[i].Position.Z + Position.Z;
            }

            CenterBrush.X = Position.X + Size.X / 2;
            CenterBrush.Y = Position.Y + Size.Y / 2;
            CenterBrush.Z = Position.Z + Size.Z / 2;

            for ( int i = 0; i < mPointsResize.Count; i++ ) // обновляем белые точки для масштабирования (те что на скрине)
                mPointsResize[i].InitPoints( this, mPointsResize[i].typeViewport );
        }


А вот так я собственно изменяю размер браша
Код

        public void Resize( Vector3f FactorSize, Viewport.TypeViewport typeViewport ) // TODO: Сделать изменение размеров браша
        {
            switch ( PointsResize.SelectPointType )
            {
                case PointsResize.PointType.LeftCenter: // если мы тянем за левую центральную точку
                    if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                    {
                        Size.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                    }
                    else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                    typeViewport == Viewport.TypeViewport.Side_2D_xz )
                    {
                        Size.X -= Program.Align( FactorSize.X, Viewport.fSize );
                        Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                    }

                    ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport );
                    break;

                case PointsResize.PointType.RightCenter: // если мы тянем за правую центральную точку
                    if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        Size.Z += Program.Align( FactorSize.X, Viewport.fSize );

                    else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                    typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        Size.X += Program.Align( FactorSize.X, Viewport.fSize );

                    ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport );
                    break;

                case PointsResize.PointType.RightTop:
                    break;
            }

            ToGloablCoords();
        }


А таким методом я обновляю вершины после изменения размера
Код

  private void ResizeLocalVertex( Vector3f FactorSize, Viewport.TypeViewport typeViewport )
        {
            for ( int i = 0; i < mLocalVertex.Count; i++ ) // проходим по всем вершинам и смотрим какие нам надо двигать
            {
                Vertex vertex = mLocalVertex[i];

                switch ( PointsResize.SelectPointType )
                {
                    case PointsResize.PointType.LeftCenter:
                        if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                            typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.LeftTop ||
                            vertex.typeVertex == Vertex.TypeVertex.LeftBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom )
                    vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.RightBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.RightTop ||
                    vertex.typeVertex == Vertex.TypeVertex.LeftBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.LeftTop )
                    vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        break;

                    case PointsResize.PointType.RightCenter:
                        if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                            typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.RightTop ||
                            vertex.typeVertex == Vertex.TypeVertex.RightBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_RightTop ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom )
                    vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_RightTop ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom ||
                    vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop )
                    vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        }

                        break;
                }
            }

// если тянули за центральную левую точку, то мы перемещаем в противоположную сторону все вершины кроме левых
//(ибо при изменении позиции в глоб. координатах без сего дела браш будет двигаться вслед за курсором)

            if ( PointsResize.SelectPointType == PointsResize.PointType.LeftCenter )
                for ( int i = 0; i < mLocalVertex.Count; i++ )
                {
                    Vertex vertex = mLocalVertex[i];
                    if ( vertex.typeVertex != Vertex.TypeVertex.LeftTop || vertex.typeVertex != Vertex.TypeVertex.LeftBottom )
                        if ( typeViewport != Viewport.TypeViewport.Front_2D_yz )
                            vertex.Position.X -= Program.Align( FactorSize.X, Viewport.fSize );
                        else
                            vertex.Position.Z -= Program.Align( FactorSize.X, Viewport.fSize );
                }
        }


Laudate sol! | Praise The Sun! | Слава солнцу!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг