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! | Слава солнцу!
|
|
| |