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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2019, 19:39   #1
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
Злость Зумирование камеры при вращении колеса мыши в GLScene на Delphi

Доброе утро! Из-за ошибок с библиотеками базовой и расширенной геометрии, описанных в этой теме,
http://www.cyberforum.ru/cpp-builder/thread2496516.html
я перешёл с C++ на Delphi. В методичке из лабораторки и в блоге Артёма Калашника (https://vk.com/notes40524438) было задание - зумировать камеру при вращении колеса мыши с кодом на C++:

Код:
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled)
{
     if(GLSceneViewer1->MouseInControl==true){
       GLCamera1->AdjustDistanceToTarget(Power(1.1,-WheelDelta/120));
     }
}
Я перевёл код на Delphi, но компилятор не увидел функцию Power.

Фрагмент кода:
Код:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if(GLSceneViewer1.MouseInControl=true) then GLCamera1.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120))
 
end;
Я попробовал взять функцию из библиотеки Math, но при запуске проект на колесо мыши по-прежнему не реагирует. Заглянул в инспектор объектов для GLSceneViewer1, а там свойства MouseInControl нет. Убрал условие - на колёсико опять ноль реакции. Прописал свойство MouseInControl насильно равным True в обработчике OnCreate для формы - проект не запустился и компилятор выдал ошибки:

Код:
[dcc32 Error] Lab1.pas(68): E2129 Cannot assign TO a read-ONLY property
[dcc32 Fatal Error] Project1.dpr(5): F2063 Could NOT compile used unit 'Lab1.pas'
Failed
Elapsed TIME: 00:00:01.0
Я даже сам не знаю, в чём дело - или функция не из математической библиотеки нужна, или свойство MouseInControl "кастрировано". Прогуглив, я увидел решение с помощью ScrollBox и TImage, но не знаю, на какой закладке панели компонентов они находятся. А у куба (TGLCube1) и камеры (TGLCamera1) нет свойств Height и Width.

Код:
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  Image1.Width:=Round(Image1.Width/K);
  Image1.Height:=Round(Image1.Height/K);
end;
 
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  Image1.Width:=Round(Image1.Width*K);
  Image1.Height:=Round(Image1.Height*K);
end;
Извините за нубство! Я перешёл на Delphi вынужденно и не хочу возвращаться на C++, т.к. не знаю, где искать библиотеки для базовой и расширенной геометрии на C++, как они называются, какой у них формат файла и куда их "закидывать". А прогуглив название темы на английском, в лучшем случае получал гайд для новичков по GLScene и рецензии от других авторов, для закачки которых надо регистрироваться фиг знает где и покупать у них Premium-аккаунт. Как сделать зумирование камеры при вращении колеса мыши другим путём, в обход функции Power? И из какой библиотеки вообще нужно брать эту функцию? Архив с проектом лежит здесь:
http://www.cyberforum.ru/delphi-mult...ad2499535.html

Исходный код проекта:
Код:
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;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    mx,my: Integer;
  end;
  Coordinates = record
     X,Y,Z: double;
  end;
var
  Form1: TForm1;
  CubeObject: TGLCube;
  SphereObject: TGLSphere;
  dx,dy,dz: Integer;
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.GLCadencer1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
GLCube1.Turn(deltaTime*10);
GLTorus1.Turn(deltaTime*10);
//Движение вперед по клавишам ‘ц’ и’ 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;
 
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  mx:=x; my:=y; //Запомнить координаты мыши
end;
 
procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Shift<>[] then begin //Если нажата клавиша
  GLCamera1.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта
  GLLightSource1.Position:=GLCamera1.Position; //Пусть источник освещения будет рядом с камерой
  mx:=x; my:=y;
  end;
end;
 
end.
Изображения
Тип файла: jpg методичка-из-лабы.jpg (68.1 Кб, 46 просмотров)
Тип файла: jpg Блог Артёма калашника.jpg (50.7 Кб, 44 просмотров)
VolodyaBuzin вне форума Ответить с цитированием
Старый 14.09.2019, 08:39   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Я попробовал сделать через ScrollBox, но увидел, что вложить в него прямо из панели инструментов можно только новый объект, а уже существующие надо сделать дочерними. Я читал, что есть функция AddNewChild, которая прописывается в OnCreate при создании формы, но это сработает только при запуске программы, а при разработке ScrollBox всё равно ляжет поверх GLSceneViewer, даже если последний меньше. Какое свойство отвечает за удочерение объектов по отношению к ScrollBox, где его искать, и что мне нужно - Owner или Parent?
VolodyaBuzin вне форума Ответить с цитированием
Старый 14.09.2019, 14:46   #3
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Прогуглив, я увидел, что проблема наследования решается строкой,

Код:
Daughter.Parent:=Mother;
прописанной для OnCreate. Но это справедливо только для исполнения проекта, а не для разработки. К тому же у GLSceneViewer нет в инспекторе свойства Parent, хотя Height и Width есть. Есть только ParentHint, который берёт только True или False.
VolodyaBuzin вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение камеры при нажатой левой клавише мыши; проблемы с обзором мыши и видимостью указателя VolodyaBuzin Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 13.09.2019 19:21
cxgrid перемещение по прокрутке колеса мыши reihtmonbern Компоненты Delphi 1 26.03.2013 15:48
События колеса мыши без фокуса AVer Общие вопросы Delphi 19 15.11.2012 15:52
Обработка колеса мыши в TScrollBox mutabor Общие вопросы Delphi 6 01.04.2010 10:17
использование колеса мыши Bayazet Общие вопросы Delphi 8 27.01.2009 14:39