0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 206

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

12.09.2019, 10:37. Показов 2369. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2019, 10:37
Ответы с готовыми решениями:

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

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

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

5
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 206
12.09.2019, 10:39  [ТС]
А вот и сам проект.
Вложения
Тип файла: zip lab1-delphi.zip (5.03 Мб, 4 просмотров)
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 206
12.09.2019, 15:14  [ТС]
Также в OnCreate попытался у курсора прописать свойства crDefault и crArrow - не помогло, он по-прежнему исчезает. Как сделать так, чтобы и объект перемещался, и курсор был виден?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 206
13.09.2019, 06:14  [ТС]
Попробовал второй пример с даммикубом, помеченный как "Более простой", отсюда,
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
Сообщений: 206
16.09.2019, 17:11  [ТС]
А корень проблемы был в том, что камера не была привязана к объекту.

Добавлено через 17 минут
Надо брать не прямое название камеры, а то, что в свойстве Camera компонента GLSceneViewer1, если метод будет универсальным.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.09.2019, 20:58
Не очень понял, не работал с этой хреновиной...
Но вот так:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2019, 20:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru