Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2019, 13:15   #1
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
Злость Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя

Добрый день! У меня есть проект с кубом, кольцом и двумя кнопками из темы,
http://www.cyberforum.ru/cpp-builder/thread2496516.html
который я перевёл на Delphi и доработал. Я нашёл три гайда по движению объектов с применением клавиатуры и мыши:
https://studfiles.net/preview/7405961/page:6/
https://3d-sandbox.at.ua/news/dvizhe.../2011-02-06-13
https://infopedia.su/3x413c.html
Пример с клавиатурой запустился и работает, но с мышью возникли проблемы. При запуске проекта указатель мыши "прячется", и теперь я не знаю, как сделать его видимым, чтобы дотянуться до кнопок переключения камеры и закрытия проекта, не потеряв прежний функционал. Помогает только клавиатура. Сначала я в OnCreate попытался у курсора насильно прописать свойства crDefault и crArrow - не помогло, он по-прежнему исчезает. Потом возникла мысль сделать то же самое не при создании формы, а при удержании левой клавиши мыши. Первым делом я снёс OnCreate и перенёс строку

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

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

Код:
if(Button = mbLeft) then GLUserInterface1.MouseLookActive:=false
Но опять на перемещение курсора при нажатой левой клавише мыши проект не реагирует. Упорно прогуглив русский и английский сегменты интернета, я нашёл эту ссылку,
https://sourceforge.net/p/glscene/di...read/6dbf2dea/
но не понял, что это за объект CameraTarget. В одном примере слова Camera и Target разделены точкой, а в другом этой точки нет. Попробовал второй пример с даммикубом, помеченный как "Более простой", отсюда,
https://infopedia.su/3x413c.html
Но , хотя курсор мыши виден и кнопки переключаются, камера вращается сама по себе без моего ведома. Прогуглив ещё раз, я наткнулся на блог Артёма Калашника (https://vk.com/note40524438_9176925) и запустил примеры с регуляцией освещения в зависимости от положения камеры и вращением объектов вокруг оси Y. Всё заработало. Вращать ОБЪЕКТЫ я уже умею, но как двигать САМУ КАМЕРУ, чтобы курсор прятался и объект перемещался только при нажатой левой клавише мыши, а во всех остальных случаях курсор был виден, а обзор мышью - отключён?

Исходный код проекта на Delphi:
Код:
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.
Изображения
Тип файла: jpg куб-дельфи.jpg (25.4 Кб, 29 просмотров)
Тип файла: jpg куб-и-кольцо.jpg (32.4 Кб, 27 просмотров)
Тип файла: jpg кольцо-вторая-камера.jpg (43.5 Кб, 28 просмотров)
VolodyaBuzin вне форума Ответить с цитированием
Старый 13.09.2019, 13:20   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Архив с проектом не загрузился, качайте здесь:
http://www.cyberforum.ru/delphi-mult...ad2499206.html
VolodyaBuzin вне форума Ответить с цитированием
Старый 13.09.2019, 16:35   #3
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Пожалуйста, отзовитесь и киньте ссылки с примерами кода для моего случая! На киберфоруме мне вчера не ответили, и мне надоело огибать пороги поисковых систем и других форумов, переводить и перефразировать запрос с этой темой.
VolodyaBuzin вне форума Ответить с цитированием
Старый 13.09.2019, 19:21   #4
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

С какими событиями работает свойство MouseLookActive компонента TGLUserInterface? И почему оно не работает с событиями OnMouseMove, OnMouseDown и OnMouseUp?
VolodyaBuzin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заставить функцию выполняться при нажатой кнопке мыши Arassir JavaScript, Ajax 3 02.11.2011 17:44
нажатие левой кнопки мыши beygul Помощь студентам 6 13.05.2010 20:04
Программное перемещение указателя мыши по экрану. LENINGOLD Общие вопросы Delphi 3 30.11.2009 01:58
PopupMenu левой кнопкой мыши Pinya Компоненты Delphi 3 22.08.2008 19:23