Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 205
1

Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя

12.09.2019, 10:37. Показов 2251. Ответов 5

Author24 — интернет-сервис помощи студентам
Добрый день! У меня есть проект с кубом, кольцом и двумя кнопками из прошлой темы (Обработка событий для кнопок в RAD Studio 10.3), который я перевёл на Delphi и доработал. Я нашёл три гайда по движению объектов с применением клавиатуры и мыши:
https://studfiles.net/preview/7405961/page:6/
https://3d-sandbox.at.ua/news/... 1-02-06-13
https://infopedia.su/3x413c.html
Пример с клавиатурой запустился и работает, но с мышью возникли проблемы. При запуске проекта указатель мыши "прячется", и теперь я не знаю, как сделать его видимым, чтобы дотянуться до кнопок переключения камеры и закрытия проекта, не потеряв прежний функционал. Помогает только клавиатура. Возникла мысль сделать то же самое не при создании формы, а при удержании левой клавиши мыши. Сначала снёс OnCreate и перенёс строку

Delphi
1
GLUserInterface1.MouseLookActive:=true;
в OnMouseMove, но это не помогло. Кнопки переключения камер и движение с помощью клавиатуры работают, но при удержании левой клавиши мыши ничего не происходит. Потом попробовал события OnMouseDown и OnMouseUp. Для OnMouseDown прописал

Delphi
1
if(Button = mbLeft) then GLUserInterface1.MouseLookActive:=true
а для OnMouseUp -

Delphi
1
if(Button = mbLeft) then GLUserInterface1.MouseLookActive:=false
Но опять на перемещение курсора при нажатой левой клавише мыши проект не реагирует. Как сделать так, чтобы курсор прятался и объект перемещался только при нажатой левой клавише мыши, а во всех остальных случаях курсор был виден, а обзор мышью - отключён? С какими событиями работает свойство MouseLookActive компонента TGLUserInterface? И почему оно не работает с событиями OnMouseMove, OnMouseDown и OnMouseUp?

Исходный код проекта на Delphi:
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
85
86
87
unit Lab1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, GLScene, GLCoordinates, GLObjects, GLKeyboard,
  GLWin32Viewer, GLCrossPlatform, GLBaseClasses, GLGeomObjects, Vcl.StdCtrls,
  GLCadencer, GLNavigator;
 
type
  TForm1 = class(TForm)
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    GLCube1: TGLCube;
    GLCamera1: TGLCamera;
    GLLightSource1: TGLLightSource;
    GLCamera2: TGLCamera;
    GLTorus1: TGLTorus;
    GLLightSource2: TGLLightSource;
    Button1: TButton;
    Button2: TButton;
    GLCadencer1: TGLCadencer;
    GLNavigator1: TGLNavigator;
    GLUserInterface1: TGLUserInterface;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Coordinates = record
     X,Y,Z: double;
  end;
var
  Form1: TForm1;
  CubeObject: TGLCube;
  SphereObject: TGLSphere;
  dx,dy,dz: double;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   GLSceneViewer1.Camera:=GLCamera1;
   Button1.Enabled:=False;
   Button2.Enabled:=True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
   GLSceneViewer1.Camera:=GLCamera2;
   Button2.Enabled:=False;
   Button1.Enabled:=True;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  GLUserInterface1.MouseLookActive:=true;
end;
 
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
GLUserInterface1.Mouselook;
GLUserInterface1.MouseUpdate;
//Движение вперед по клавишам ‘ц’ и’ w’
if (IsKeyDown('ц') OR IsKeyDown('w')) then GLCamera1.Move(2* deltaTime);
//Движение назад по клавишам ‘ы’ и ‘s’
if (IsKeyDown('ы') OR IsKeyDown('s')) then GLCamera1.Move(-2* deltaTime);
//Поворот влево по клавишам ‘ф’ и’ a’
if (IsKeyDown('ф') OR IsKeyDown('a')) then GLCamera1.slide(-2* deltaTime);
//Поворот вправо по клавишам ‘в’ и ‘d’
if (IsKeyDown('в') OR IsKeyDown('d')) then GLCamera1.slide(2* deltaTime);
//Движение вверх по клавишам ‘u’ и ‘г’
if (IsKeyDown('u')) OR IsKeyDown('г') then GLCamera1.Lift(0.01);
//Движение вниз по клавишам ‘n’ и ‘т’
if (IsKeyDown('n')) OR IsKeyDown('т') then GLCamera1.Lift(-0.01)
end;
 
end.
Миниатюры
Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя   Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя   Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя  

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2019, 10:37
Ответы с готовыми решениями:

Событие мыши: перемещение мыши при нажатой левой клавиши
Подскажите, пожалуйста как реализовать следующее: При перемещении мыши при нажатой левой клавише...

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

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

Как отследить клик мыши при нажатой клавише Ctrl?
Всем здравствуйте. Нужно выполнить команду только в том случае, если пользователь кликнул по...

5
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 205
12.09.2019, 10:39  [ТС] 2
А вот и сам проект.
Вложения
Тип файла: zip lab1-delphi.zip (5.03 Мб, 4 просмотров)
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 205
12.09.2019, 15:14  [ТС] 3
Также в OnCreate попытался у курсора прописать свойства crDefault и crArrow - не помогло, он по-прежнему исчезает. Как сделать так, чтобы и объект перемещался, и курсор был виден?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 205
13.09.2019, 06:14  [ТС] 4
Попробовал второй пример с даммикубом, помеченный как "Более простой", отсюда,
https://infopedia.su/3x413c.html
но , хотя курсор мыши виден и кнопки переключаются, камера вращается сама по себе без моего ведома. Упорно прогуглив русский и английский сегменты интернета, я нашёл эту ссылку,
https://sourceforge.net/p/glsc... /6dbf2dea/
но не понял, что это за объект CameraTarget. В одном примере слова Camera и Target разделены точкой, а в другом этой точки нет. Прогуглив ещё раз, я наткнулся на блог Артёма Калашника (https://vk.com/note40524438_9176925) и запустил примеры с регуляцией освещения в зависимости от положения камеры и вращением объектов вокруг оси Y. Всё заработало. Вращать ОБЪЕКТЫ я уже умею, но как двигать САМУ КАМЕРУ?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 205
16.09.2019, 17:11  [ТС] 5
А корень проблемы был в том, что камера не была привязана к объекту.

Добавлено через 17 минут
Надо брать не прямое название камеры, а то, что в свойстве Camera компонента GLSceneViewer1, если метод будет универсальным.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.09.2019, 20:58 6
Не очень понял, не работал с этой хреновиной...
Но вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure TForm1.FormCreate(Sender: TObject);
Begin
//
End;
 
Procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
If (Button = mbLeft) Then
  GLUserInterface1.MouseLookActive := True;
End;
 
Procedure TForm1.GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
If (Button = mbLeft) Then
  GLUserInterface1.MouseLookActive := False;
End;
И плюс вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure TForm1.Button1Click(Sender: TObject);
Begin
GLSceneViewer1.Camera := GLCamera1;
GLNavigator1.MovingObject := GLCamera1;
Button1.Enabled := False;
Button2.Enabled := True;
End;
 
Procedure TForm1.Button2Click(Sender: TObject);
Begin
GLSceneViewer1.Camera := GLCamera2;
GLNavigator1.MovingObject := GLCamera2;
Button2.Enabled := False;
Button1.Enabled := True;
End;
Вроде бы уже лучше?
0
18.09.2019, 20:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2019, 20:58
Помогаю со студенческими работами здесь

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)
Уважаемые форумчане, взорвался мозг. Помогите. Есть одна, по мне, невыполнимая, задача, которую я...

Cобытие MouseMove при нажатой левой кнопке мыши
Сделал у PictureBox событие MouseMove. Если просто провести мышкой над PictureBox все срабатывает,...

Прокрутка страницы при нажатой левой кнопке мыши
Есть такой код document.onmousedown = function(e) { e = e || window.event; down = 1; x...

Как поменять указатель мыши при нажатой левой кнопке?
Мне надо, чтобы при нажатии левой кнопки мыши менялся значек указателя. Как это реализовать?

Реализовать перетаскивание квадрата при нажатой левой кнопке мыши, и нажатий на стрелки
Всем привет! Изучаю SFML нашел такую задачу но не получается решить уже второй день. Некорректно...

Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши выключить индикатор NumLock(+Звук),при нажатие право
Не могу решить подскожите кто знает.(Ограничить передвижение курсора мыши левой нижней четвертью...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru