Доброе утро! Из-за ошибок с библиотеками базовой и расширенной геометрии, описанных в этой теме,
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.