• 1
Ilya.Z

Отрисовка линий на поверхности 3D сферы

Вопросы

Добрый день, может туплю, или не туда копаю.. есть ли Firemonkey более менее стандартный способ рисовать на поверхности  3D фигур?

в частности интересует сфера, есть две координаты, нужно провести чрез них линию, так что бы бы она легла на поверхность, или начертить фигуру так же лежащую на поверхности.

или надо копать в глубь математики, и разбивать на множество отрезков, расчитывать каждую координату для каждой точки и т.д.

ну а заливка фигур как понимаю только через материалы доступна в 3D, но можно залить ограниченную область на поверхности тогда ?

нашел очень симпатичный пример на youtube от QuarkCube - Sketch3d, но там интерактивное рисование мышкой, и каждая линия это множество примитивов, все красиво но не совсем то )

пытаюсь рисовать скажем планету, и показать на ней треки, области, точки:) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 ответов на этот вопрос

  • 0

Ну, дружище, это уже крайняя лень когда "у меня лапки" )) 

ничего ж не стоит расчитать путь линии по поверхности сферы и  "патхом" ее вывести.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, POV сказал:

Ну, дружище, это уже крайняя лень когда "у меня лапки" )) 

ничего ж не стоит расчитать путь линии по поверхности сферы и  "патхом" ее вывести.

В этом направлении и думал )) .... Ортодромия. проложить маршрут из точки а в точку б, с выбором величины шага

 но да... надеялся что есть нечто готовое внутри FMX'а - .. другое дело, если не затруднит... кинуть что в меня этим - ничего не стоит) был бы очень признателен за линк на какой нить приемлемый алгоритм расчета пути, линии 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Но линия идет "по прямой"? Так размести арку или круг с  диаметром на на долю пикселя больше диаметра сферы. Центр как у сферы.

 

P.S. Оказывается арки нет. Только окружность и путь можно нарисовать. С путем не всё ясно, разбираться по докам надо.

 

sphere2.png

Изменено пользователем POV

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
36 минут назад, POV сказал:

Но линия идет "по прямой"? Так размести арку или круг с  диаметром на на долю пикселя больше диаметра сферы. Центр как у сферы.

 

P.S. Оказывается арки нет. Только окружность и путь можно нарисовать. С путем не всё ясно, разбираться по докам надо.

 

 

Линия по прямой только как элемент кривой) .. того самого пути, у нас есть координаты в пространстве Viewport3D, которые можно привести к локальным координатам сферы, рисовать можем - DrawLine, DrawRect, DrawPoint, DrawLines, DrawPrimitives (прада их так и не понял) ну и DrawCube , DrawFillPolygon.. вот и получается нужен алгоритм, приведение угловых координат сферы к трехмерным координатам Viewport3D/Sphere , и разбивка каждого отрезка на множество под элементов, как понимаю нечто похожее делают летчики для прокладки курса ) либо я сам уже в мыслях улетел в космос...хм

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Патх3Дэ лишь тады. Но координаты на поверхности самому щитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, POV сказал:

Патх3Дэ лишь тады. Но координаты на поверхности самому щитать.

Вот с этим пересчетом и маюсь как раз, ищу какую то информацию.. алгоритмы понятные 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Jeysi Z
      Здравствуйте, для проекта понадобилось рисовать разные 3d линии в зависимости от значения переменной, сначала решил проверить на совсем простом примере, но сразу возникли проблемы. В общем, в процедуре render организован case для переменной stage, в зависимости от её значения должны рисоваться разные линии, но этого не происходит, рисуется только первоначальная линия. 
      Вот код процедуры :
      procedure TForm2.Dummy1Render(Sender: TObject; Context: TContext3D); var i:integer; begin case stage of 1:begin if Context.BeginScene then try Context.Clear(TAlphaColorRec.White); Context.DrawLine(TPoint3D.Create(3,3,0),TPoint3D.Create(3,-3,0),1,TAlphaColorRec.Black); finally Context.EndScene; end; end; 2:begin if Context.BeginScene then try Context.Clear(TAlphaColorRec.White); Context.DrawLine(TPoint3D.Create(-3,3,0),TPoint3D.Create(-3,-3,0),1,TAlphaColorRec.Black); finally Context.EndScene; end; end; end; end;  Вот скрины работы программы. Снизу отображается значение переменной stage.

      Заранее спасибо.
    • От Jeysi Z
      Здравствуйте, начал делать проект о сечениях, нарисовал на viewport3D куб, поставил на грани несколько сфер и соединил их линиями (это была часть задумки). Потом решил добавить всему этому вращение, но когда начинаю вращать всё, что рисовалось в рендере пропадает, причём при отдалении камеры всё нормально. Не подскажете, как можно это исправить?
      Вот код рендера:
      procedure TForm2.Dummy1Render(Sender: TObject; Context: TContext3D);
      begin
      if Context.BeginScene then
          try
            Context.DrawLine(TPoint3D.Create(-3,3,-3),TPoint3D.Create(3,3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,-3,-3),TPoint3D.Create(3,3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,-3,-3),TPoint3D.Create(-3,-3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(-3,3,-3),TPoint3D.Create(-3,-3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(-3,3,3),TPoint3D.Create(3,3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,-3,3),TPoint3D.Create(3,3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,-3,3),TPoint3D.Create(-3,-3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(-3,3,3),TPoint3D.Create(-3,-3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(-3,3,-3),TPoint3D.Create(-3,3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,-3,-3),TPoint3D.Create(3,-3,3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(-3,-3,3),TPoint3D.Create(-3,-3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(3,3,3),TPoint3D.Create(3,3,-3),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(Sphere1.Position.X,Sphere1.Position.Y,Sphere1.Position.Z),
            TPoint3D.Create(Sphere2.Position.X,Sphere2.Position.Y,Sphere2.Position.Z),1,TAlphaColorRec.Black);
            Context.DrawLine(TPoint3D.Create(Sphere3.Position.X,Sphere3.Position.Y,Sphere3.Position.Z),
            TPoint3D.Create(Sphere2.Position.X,Sphere2.Position.Y,Sphere2.Position.Z),1,TAlphaColorRec.Black);
          finally
            Context.EndScene;
          end;
      end;
      Вот код вращения
      procedure TForm2.Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X,
        Y: Single);
      begin
          if ssleft in shift then
          begin
            Dummy2.RotationAngle.X:=Dummy2.RotationAngle.X-((Y-rot.Y)*0.3);
            Dummy2.RotationAngle.Y:=Dummy2.RotationAngle.Y-((X-rot.X)*0.3);
            Rot:=PointF(X,Y);
          end;
      end;
      Процедура масштабирования
      procedure TForm2.Viewport3D1MouseWheel(Sender: TObject; Shift: TShiftState;
        WheelDelta: Integer; var Handled: Boolean);
      begin
        CameraZ.Position.Z:=CameraZ.Position.Z+WheelDelta/40;
      end;
      На изображениях показано как работает программа


      И ещё один вопрос если позволите. Обнаружил, что если ставить отображение камеры и объектов на viewport3d как screen, то не получается сменить стандартную камеру. Можно ли это исправить?
      Заранее спасибо.
    • От Jeysi Z
      Здравствуйте, для проекта понадобилось рисовать линии в 3d графике, но возникла такая проблема, можете подсказать, что не так?
      Вот часть кода
      procedure TForm2.Sphere1Render(Sender: TObject; Context: TContext3D);
      var v1,v2:TPoint3D;
      begin
        if Context.BeginScene then
        try
          v1:=TPoint3D.Create(Sphere1.Position.X,Sphere1.Position.Y,Sphere1.Position.Z);
          v2:=TPoint3D.Create(Sphere2.Position.X,Sphere2.Position.Y,Sphere2.Position.Z);
          Context.drawline(v1,v2,1,TAlphaColorRec.Black);
        finally
          Context.EndScene;
        end;
      end;
      На изображении результат работы программы.

    • От Maximus
      Доброго всем времени суток. Хочу снова поднять вопрос про отрисовку линий на канве, обсуждавшейся здесь
      С горизонтальными и вертикальными линиями проблем нет, при смещении на половину от толщины линии всё прекрасно выглядит. Однако при отрисовке линий под различными углами такой финт не проходит: слева VCL, справа FMX

      Линия всё так же размазывается, в итоге визуально утолщается и становится не такой чёткой.
      Как всё же добиться такого же результата как на VCL? Интересует только Windows.
      const OFFSET_LINE = 0.5; ... Image.Bitmap.Canvas.BeginScene; Image.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid; Image.Bitmap.Canvas.Stroke.Thickness := 1.0; Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(500.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(10.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(500.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.EndScene;  
    • От jekans
      Подскажите пожалуйста глупому человеку , как можно загрузив изображение:
      buf: TBitmap; buf.LoadFromFile('.bmp'); Определить цвет нужного мне пикселя (X,Y), и нарисовать хотя бы линию этого цвета на форме используя обычный: 
      Canvas.DrawLine    
    • От Brovin Yaroslav
      Официальный сайт: http://sphere-live.com/
      Обзорные статьи: HabraHabr, delphi2010.ru
      Ссылки на приложения: Windows, OSX, Android
       



    • От Geex
      Привет, Всем!
       
       
       
      Заметил странности отображения ломанных линий с помощью DrawPath. При острых углах ломанной она начинает выходить за координаты точек излома. Как на рисунке:

       
      Красным цветом построена линия с помощью DrawLine, зеленой с помощью DrawPath по одним и тем же координатам.
      procedure TFMain.Button1Click(Sender: TObject); var Pa:TPathData; p1,p2,p3,p4:TPointF; begin p1:=PointF(10,10); p2:=PointF(200,20); p3:=PointF(10,30); p4:=PointF(400,40); Pa:=TPathData.Create; Pa.MoveTo(p1); Pa.LineTo(p2); Pa.LineTo(p3); Pa.LineTo(p4); PaintBox.Bitmap.Canvas.BeginScene; PaintBox.Bitmap.Canvas.Stroke.Color:=claGreen; PaintBox.Bitmap.Canvas.Stroke.Thickness:=1;//PenWidth; PaintBox.Bitmap.Canvas.DrawPath(Pa,1.0); PaintBox.Bitmap.Canvas.EndScene; Pa.Free; PaintBox.Bitmap.Canvas.BeginScene; PaintBox.Bitmap.Canvas.Stroke.Color:=claRed; PaintBox.Bitmap.Canvas.DrawLine(p1,p2,1.0); PaintBox.Bitmap.Canvas.DrawLine(p2,p3,1.0); PaintBox.Bitmap.Canvas.DrawLine(p3,p4,1.0); PaintBox.Bitmap.Canvas.DrawLine(p1,p2,1.0); PaintBox.Bitmap.Canvas.EndScene; end; Можно заметить что зеленая линия немножко выходит за красную. Этого можно избежать только если строить линию с разрывами.
      Подозреваю что это связано с радиусом загиба кривой, вот только где его убрать?
      Можно как-нибудь элегантно сделать чтобы кривая линия строилась точно по координатам с помощью DrawPath?
       
    • От Geex
      Приветствую!
      Не понятная ситуация с шириной линии. Рисую горизонтальную линию на канве толщиной толщиной 1 пиксель. 
      Если линия лежит вдоль целых координат, например Y=100 то толщина линии реально получается 2 пикселя.
      А если координаты дробные, например 50.5 то линия в один пиксель. Вот как это выглядит:

      Т.е. я так понимаю, что координаты канвы начинаются не с нуля, а с 0.5.
      Как сделать чтобы отображение целых координат было точно в пиксель?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу