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

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

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

Студворк — интернет-сервис помощи студентам
Добрый день! У меня есть проект с кубом, кольцом и двумя кнопками из прошлой темы (Обработка событий для кнопок в 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
Сообщений: 208
12.09.2019, 10:39  [ТС]
А вот и сам проект.
Вложения
Тип файла: zip lab1-delphi.zip (5.03 Мб, 4 просмотров)
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
12.09.2019, 15:14  [ТС]
Также в OnCreate попытался у курсора прописать свойства crDefault и crArrow - не помогло, он по-прежнему исчезает. Как сделать так, чтобы и объект перемещался, и курсор был виден?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
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
Сообщений: 208
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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru