Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/50: Рейтинг темы: голосов - 50, средняя оценка - 4.78
Заблокирован

3D графика в Lazarus

29.10.2017, 22:06. Показов 11939. Ответов 83
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такое дело, написал тулзу успешно, конические шестерни печатает, в общем она просто вносит корректировку в G-код.
Но аппетиты растут, после русификации, для себя и 3dtoday чисто, Kisslicer 1.5 отруссифицировал, но что-то обламываюсь руссифицировать 1.6, есть задумка, точнее - огромное желание, и алгоритмы генерации свои тоже есть, написать свой слайсер.
Всё это дело я собираюсь состряпать между основными своими делами, которыми сейчас занят.
Ну и вопрос снижения трудозатрат. Вопрос такой -
допустим я научился визуализировать STL модель в окне программы соответствующем. А можно получить с этого отображения имеющимися средствами GLUT или другими, сечение модели, проходящее в координатах X,Y, на высоте Z? Мне это сильно сократит работу, раз в 10 наверное.
Заранее благодарен.

Добавлено через 53 минуты
Теоретически можно, нужно только удалить камеру на определённое расстояние сверху, и задать ей дальность отображения и расстояние на котором модель будет прозрачной - будет получен контур...но тогда станет неясно, где внутреннее пространство контура, а где наружнее. В общем это вопрос к спецам конечно. Слайсер нужен свой позарез.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2017, 22:06
Ответы с готовыми решениями:

Lazarus - Компьтерная графика
Создан графический редактор в лазарусе. Как сделать так, чтобы канва, при раскрытии на весь экран формы, подгонялась под размер окна?? ...

Lazarus - Компьютерная графика
Очень нужна помощь!!! Написать программы в Лазарусе. 1. Изобразить на экране гармонические колебания шара, подвешенного на нити, т.е. по...

Создание графика в Lazarus
Как вывести точку на график в Lazarus?

83
Заблокирован
11.03.2022, 20:19  [ТС]
Студворк — интернет-сервис помощи студентам
выключил в инспекторе объектов онпаинт , а в отладке всё равно работает. виндовс одним словом. полный виндовс. я даже не желаю разбираться что с ним у меня не так.
это запущено в отладчике, мне нет смысла лгать. сели не верите - убедитесь через удалённого помошника. я пока подожду 3 минуты, не стану выключать Lazarus и windows.
Миниатюры
3D графика в Lazarus  
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
11.03.2022, 20:26
Цитата Сообщение от Hretgir Посмотреть сообщение
GLBox.OnPaint := @GLboxPaint;
А в чём смысл такого присваивания вручную? Я эту строку в том проекте убрал.

Добавлено через 4 минуты
Цитата Сообщение от Hretgir Посмотреть сообщение
выключил в инспекторе объектов онпаинт , а в отладке всё равно работает
Ну так вы вручную присвоили обработчик, вот и работает. Только не понятно, зачем вручную.

И то, что присвоено вручную подменяет то, что указано в инспекторе объектов. То есть, создали обработчик в инспекторе объектов, вписали туда код, а потом в OnCreate формы переопределили обработчик - будет работать тот последний.
0
Заблокирован
11.03.2022, 20:43  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
А в чём смысл такого присваивания вручную? Я эту строку в том проекте убрал.
я этого присваивания не делал. это с примера на сайте. ну по крайней мере сегодня пример этот такой был там.
Цитата Сообщение от AzAtom Посмотреть сообщение
Ну так вы вручную присвоили обработчик, вот и работает.
нет я ничего вручную не делал.
я скопировал код, при компиляции выскочила ошибка, тогда я нажал в инспекторе объектов онпаинт, что делал всегда.
откомпилировалось и запустилось. тогда я отключил онапинт в инспекторе объектов - и оно всё равно рабтает.

Добавлено через 1 минуту
Цитата Сообщение от AzAtom Посмотреть сообщение
вписали туда код
я ничего там руками не трогал, и даже не копипастил, кроме кода целиком.
А нет, там нет процедуры вот этой
Pascal
1
2
3
4
procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
 
end;
это добавилось через инспектор объектов.
в примере этого нет. но что интересное, что когда я отключаю это в инспекторе объектов - оно работает всё равно, так как есть в коде.
вот код примера
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, OpenGLContext, gl;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure GLboxPaint(Sender: TObject);
  private
    GLBox: TOpenGLControl;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure TForm1.GLboxPaint(Sender: TObject);
begin
  glClearColor(0.27, 0.53, 0.71, 1.0); // Set blue background
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;
  glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);
    glVertex3f( 0.0, 1.0, 0.0);
    glColor3f(0, 1, 0);
    glVertex3f(-1.0,-1.0, 0.0);
    glColor3f(0, 0, 1);
    glVertex3f( 1.0,-1.0, 0.0);
  glEnd;
  GLbox.SwapBuffers;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  GLbox := TOpenGLControl.Create(Self);
  GLbox.AutoResizeViewport := true;
  GLBox.Parent             := Self;
  GLBox.MultiSampling      := 4;
  GLBox.Align              := alClient;
  GLBox.OnPaint            := @GLboxPaint; // for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
  GLBox.invalidate;
end;
 
end.

я сейчас посмотрю как это в линукс. в общем я выхожу с windows.
0
Заблокирован
11.03.2022, 20:55  [ТС]
А вот как это выглядит в Linux
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, OpenGLContext, gl;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    OpenGLControl1: TOpenGLControl;
    procedure FormCreate(Sender: TObject);
    procedure GLboxPaint(Sender: TObject);
  private
       GLBox: TOpenGLControl;
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 procedure TForm1.GLboxPaint(Sender: TObject);
begin
  glClearColor(0.27, 0.53, 0.71, 1.0); // Set blue background
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;
  glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);
    glVertex3f( 0.0, 1.0, 0.0);
    glColor3f(0, 1, 0);
    glVertex3f(-1.0,-1.0, 0.0);
    glColor3f(0, 0, 1);
    glVertex3f( 1.0,-1.0, 0.0);
  glEnd;
  GLbox.SwapBuffers;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  GLbox := TOpenGLControl.Create(Self);
  GLbox.AutoResizeViewport := true;
  GLBox.Parent             := Self;
  GLBox.MultiSampling      := 4;
  GLBox.Align              := alClient;
  GLBox.OnPaint            := @GLboxPaint; // for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
  GLBox.invalidate;
end;
Миниатюры
3D графика в Lazarus  
0
Заблокирован
11.03.2022, 20:59  [ТС]
В общем так:
в windows у меня код вот так выглядит, выше код примера в предыдущем сообщении. а в самом виндовс код совсем не такой как в примере.
Сейчас в винду перезайду.
0
Заблокирован
11.03.2022, 21:10  [ТС]
сорь за задержку - винда обновы ставила, уже не выключалась без них.
код не привожу, он скриншоте.
вот так это в виндовс.
Миниатюры
3D графика в Lazarus  
0
Заблокирован
11.03.2022, 21:11  [ТС]
в виндовс вообще левая пустая процедура, и без неё никак. и соответственно код, и в инспекторе объектов разное.
ну в общем как-то так. и если я в инспекторе объектов в виндовс отключаю онпаинт - то всё равно работает. хотя может оно и должно работать. но в общем по разному, и в линукс правдоподобнее - без лепнины лишней в коде.
поэтому уж если что-то делать, то я лучше в линукс буду это делать.
0
Заблокирован
12.03.2022, 11:41  [ТС]
Есть небольшой вопрос.
Создаю на этой форме TPageControl, перетаскиваю в инспекторе объектов в него компонент
TOpenGLControl, собираю проект, но увы - треугольник рисуется на всю форму.
Это вообще реализуемо?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.03.2022, 12:01
Нормально работает.
Надо проект смотреть. Что-то не так там.
0
Заблокирован
12.03.2022, 12:14  [ТС]
Это в Linux
Вложения
Тип файла: 7z OpenGLExpirement (1-я копия).7z (264.7 Кб, 3 просмотров)
0
Заблокирован
12.03.2022, 13:02  [ТС]
Такое впечатление что что-то не доделано мной.
Где-то что-то надо подключать.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.03.2022, 13:03
Hretgir, что-то, проект не открывается в Lazarus под Windows...

В процедуре OnFormCreate надо почистить:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
begin
  GLbox := TOpenGLControl.Create(Self);
  GLbox.AutoResizeViewport := true;
//  GLBox.Parent             := Self; // Эта строка пересаживает GLBox на форму
  GLBox.MultiSampling      := 4;
  GLBox.Align              := alClient;
  GLBox.OnPaint            := @GLboxPaint; // for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
  GLBox.invalidate;
end;
1
Заблокирован
12.03.2022, 13:18  [ТС]
У меня так ошибку выдает при запуске
"Control "" has no parent window
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.03.2022, 13:24
Hretgir, точно, это же ты создаёшь новый TOpenGLControl, не смотря на то, что на форме, вернее, на TabSheet1 уже есть один.
Вот так можно попробовать:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenGLControl1.AutoResizeViewport := true;
  OpenGLControl1.MultiSampling      := 4;
  OpenGLControl1.Align              := alClient;
  OpenGLControl1.OnPaint            := @GLboxPaint; // Можно назначить обработчик через инспектор объектов, а эту строку убрать
//  OpenGLControl1.Invalidate; // Вроде, это не нужно
end;
Вообще, все эти действия можно сделать через инспектор объектов, и убрать FormCreate.
0
Заблокирован
12.03.2022, 15:20  [ТС]
попробую, но больше похоже что не нужно это
GLBox.Align := alClient;

Добавлено через 5 минут
//OpenGLControl1.Invalidate; - вообще никакой роли не сыграло
//GLBox.Align := alClient; - открыло в левом верхнем углу игнорировав TPageControl
У меня такое ощущение что надо где-то привязать к странице.

Добавлено через 11 минут
GLBox.OnPaint := @GLboxPaint; // for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
GLBox.invalidate;
убирал и вместе и по отдельности - тогда не рисует просто.

Добавлено через 1 час 35 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Hretgir, точно, это же ты создаёшь новый TOpenGLControl,
Цитата Сообщение от AzAtom Посмотреть сообщение
TForm1.FormCreate
у меня такое ощущение, что эта процедура создаёт новую форму, на которой нет ни TPageControl ни в кладок, есть только OpenGL контрол, и она его рисует с размахом на всю форму, и никакого нового OpenGLControl она не создаёт.
0
Заблокирован
12.03.2022, 15:31  [ТС]
Цитата Сообщение от Hretgir Посмотреть сообщение
у меня такое ощущение, что эта процедура создаёт новую форму, на которой нет ни TPageControl ни в кладок, есть только OpenGL контрол, и она его рисует с размахом на всю форму, и никакого нового OpenGLControl она не создаёт.
ЧТД
Кликните здесь для просмотра всего текста
procedure TForm1.FormCreate(Sender: TObject);
begin
GLbox := TOpenGLControl.Create(Self);
GLbox.AutoResizeViewport := true;
GLBox.Parent := Self;
GLBox.MultiSampling := 4;
GLBox.Align := alClient;
GLBox.Parent :=TabSheet1;//----------------------------------------------------------------------------------------------------вот это
GLBox.OnPaint := @GLboxPaint; // for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
GLBox.invalidate;
Миниатюры
3D графика в Lazarus  
0
Заблокирован
12.03.2022, 15:35  [ТС]
Рейтинг темы я вернул на место, потому что он куда-то исчез после того как я решил проблему.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.03.2022, 15:39
Цитата Сообщение от Hretgir Посмотреть сообщение
у меня такое ощущение, что эта процедура создаёт новую форму, на которой нет ни TPageControl ни в кладок, есть только OpenGL контрол, и она его рисует с размахом на всю форму, и никакого нового OpenGLControl она не создаёт.
Нет. Эта процедура создает новый объект TOpenGLControl, который находится прямо на форме и занимает всю клиентскую область, закрывая собой все остальные PageControl и т.д.

Вот строка GLBox.Parent :=TabSheet1; теперь "селит" этот объект на TabSheet1.

В дизайне на TabSheet уже стоит один объект TOpenGLControl под названием OpenGLControl1. А потом при запуске программы в рантайме создаётся второй объект GLBox типа TOpenGLControl и перекрывал собой всё, что есть на форме. О чём я и толкую уже которое сообщение.
1
Заблокирован
12.03.2022, 15:42  [ТС]
Решения я не знал, оно найдено мной после обнаружения поисковиком вот этого
При запуске выводится сообщение 'Class "TOpenGLControl" not found'
Pascal
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormCreate(Sender: TObject);
 
begin
  // Создание контекста воспроизведения OpenGL и привязка его к панели на форме
  OpenGLControl1:=TOpenGLControl.Create(Self);
  with OpenGLControl1 do begin
    Name:='OpenGLControl1';
    Align:=alClient;
    Parent:=Panel1;
  end;
Добавлено через 1 минуту
Цитата Сообщение от AzAtom Посмотреть сообщение
Нет. Эта процедура создает новый объект TOpenGLControl, который находится прямо на форме и занимает всю клиентскую область, закрывая собой все остальные PageControl и т.д.
Вот строка GLBox.Parent :=TabSheet1; теперь "селит" этот объект на TabSheet1.
ясно, спасибо за пояснение.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.03.2022, 15:45
Лучший ответ Сообщение было отмечено Hretgir как решение

Решение

Вот этот код нормально работает. Не надо вручную создавать ничего, просто в design-time поставить на форму TOpenGLControl и всё:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
// Подключение библиотек. Для работы C OpenGL необходимы OpenGLContext, GL, GLU
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, ComCtrls, OpenGLContext, GL, GLU;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    OpenGLControl1: TOpenGLControl;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure OpenGLControl1Paint(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    fleft, fright, ftop, fbottom: GLdouble;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
 
begin
  fleft := -1;
  fright := 1;
  ftop := 1;
  fbottom := 0;
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if Key = ord('Q') then fleft := fleft + 0.1;
  if Key = ord('W') then fleft := fleft - 0.1;
  if Key = ord('O') then fright := fright + 0.1;
  if Key = ord('P') then fright := fright - 0.1;
 
  Caption := Format('%.2f, %.2f, %.2f, %.2f', [fleft, fright, fbottom, ftop]);
 
  OpenGLControl1.Invalidate;
end;
 
procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
//  OpenGLControl1.
  glClearColor (0.2, 0.4, 0.6, 0); // цвет фона
  glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета
  glMatrixMode(GL_MODELVIEW);  // Выбор видовой матрицы
  glLoadIdentity();   //  Установка в единичные значения
//  glOrtho(-0.5, 1, 0, 1, -1 ,1); // Установка проекции окна
  glOrtho(fleft, fright, fbottom, ftop, -1 ,1); // Установка проекции окна
  //glTranslatef(0.5,0.5,0);  // Сдвиг
  //glRotatef(10, 0, 0, 0);   // Вращение
  glBegin(GL_TRIANGLES);      // Рисование треугольника
    glColor3f(1, 0, 0);     // Красный
    glVertex3f(0.0, 1.0, 0.0 ); // Верх треугольника (Передняя)
    glColor3f(0, 1, 0);
    glVertex3f( -1.0, -1.0 , 0.0);
    glColor3f(0, 0, 1);
    glVertex3f( 1.0, -1.0, 0.0);
  glEnd;
  OpenGLControl1.SwapBuffers; // Отрисовка из буффера
end;
 
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2022, 15:45

Построение графика кубической функции в Lazarus
Помогите, пожалуйста, написать программу для построения графика функции y=x^3

Установка ZEOS в Lazarus, работа с PostgressSQL в Lazarus
Не получается никак установить компонент ZEOS в Lazarus открываю пакет с Zeos, нажимаю компилировать, потом установить в течение...

В чём разница между Lazarus Linux i386 RPM и Lazarus Linux i386 DEB
Здравствуйте. Установил в виртуалке Ubuntu и хочу "покрутить" в ней Lazarus. Судя по отзывам, менее проблематичной является установка...

Не инициализируется графика в Lazarus
Вот пример обычного кода: Uses Graph; Var GraphDriver, GraphMode: integer; Begin GraphDriver:=detect; ...

Рисование графика: обработка новых входящих данных и движение графика на форме
Подскажите каким способом можно вывести график частью главного окна программы, при чем график получает данные *в живую* с устройства по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru