Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.87.156] |
|
Сообщ.
#1
,
|
|
|
Добрый день! На RAD Studio 10.3 и GLScene 1.8 я создал проект с двумя формами и возникла проблема добавления точек в куб и сферу, у которых я прописал BlendingMode в bmAdditive. Сначала точки выходили за поверхность объектов, но после уменьшения диапазона генерации координат оказалось, что хотя я вижу пересечение осей у куба и сферы, точки появляются только при очень сильном увеличении, когда грани объектов "проламываются". У пользователя Fosgen (http://delphimaster.net/view/9-1120384424) я нашёл четыре способа установления прозрачности в зависимости от типа видеокарты, но для видеокарты AMD Radeon R7 ни один из них не подошёл. Вдобавок, во втором способе при изменении эмиссии голубого цвета возникла назойливая ошибка, не дающая закрыть программу, а свойство NoZWrite не отображалось в инспекторе объектов для куба. Для какого объекта надо прописывать это свойство? Какие драйвера нужны для AMD Radeon R7, чтобы мой ноут наконец-то "потянул" эти непокорные свойства эмиссии для текстуры объекта, а куб и сфера стали прозрачными (и поверхности фигур видны, и точки через них просвечивались)? Не хочу потрошить торрент-трекеры в поисках сомнительных программ и постоянно натыкаться на фишинговые программы, кейлоггеры, винлокеры и прочую "нечисть", поэтому, если знаете проверенную ссылку, кидайте в тему. Как можно сделать куб и сферу прозрачными в обход свойств текстуры и эмиссии, чтобы при этом и поверхности самих объектов, и точки внутри них были видны?
Исходный код первой формы: 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, Math, 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; GLCamera3: TGLCamera; Button3: TButton; Button4: TButton; 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); procedure Button3Click(Sender: TObject); procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); procedure Button4Click(Sender: TObject); 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} uses Lab2; procedure TForm1.Button1Click(Sender: TObject); begin GLSceneViewer1.Camera:=GLCamera1; Button1.Enabled:=False; Button2.Enabled:=True; Button3.Enabled:=True; end; procedure TForm1.Button2Click(Sender: TObject); begin GLSceneViewer1.Camera:=GLCamera2; Button2.Enabled:=False; Button1.Enabled:=True; Button3.Enabled:=True; end; procedure TForm1.Button3Click(Sender: TObject); begin GLSceneViewer1.Camera:=GLCamera3; Button3.Enabled:=False; Button1.Enabled:=True; Button2.Enabled:=True; end; procedure TForm1.Button4Click(Sender: TObject); begin Form2.Visible:=True; Visible := False; end; procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin if(GLSceneViewer1.MouseInControl=true) then GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120)) 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 GLSceneViewer1.Camera.Move(2* deltaTime); //Движение назад по клавишам ‘ы’ и ‘s’ if (IsKeyDown('ы') OR IsKeyDown('s')) then GLSceneViewer1.Camera.Move(-2* deltaTime); //Поворот влево по клавишам ‘ф’ и’ a’ if (IsKeyDown('ф') OR IsKeyDown('a')) then GLSceneViewer1.Camera.slide(-2* deltaTime); //Поворот вправо по клавишам ‘в’ и ‘d’ if (IsKeyDown('в') OR IsKeyDown('d')) then GLSceneViewer1.Camera.slide(2* deltaTime); //Движение вверх по клавишам ‘u’ и ‘г’ if (IsKeyDown('u') OR IsKeyDown('г')) then GLSceneViewer1.Camera.Lift(0.01); //Движение вниз по клавишам ‘n’ и ‘т’ if (IsKeyDown('n') OR IsKeyDown('т')) then GLSceneViewer1.Camera.Lift(-0.01); if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1; if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2; if (IsKeyDown('b') OR IsKeyDown('и')) then GLSceneViewer1.Camera:=GLCamera3 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 //Если нажата клавиша GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта GLLightSource1.Position:=GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой mx:=x; my:=y; end; end; end. Код второй формы: unit Lab2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Lab1, Vcl.StdCtrls, GLWin32Viewer, GLKeyboard, Math, GLCrossPlatform, GLBaseClasses, GLScene, GLObjects, GLCoordinates, GLCadencer, Vcl.ComCtrls; type TForm2 = class(TForm) GLScene1: TGLScene; GLSceneViewer1: TGLSceneViewer; Button1: TButton; GLCadencer1: TGLCadencer; GLCamera1: TGLCamera; GLLightSource1: TGLLightSource; GLCube1: TGLCube; GLSphere1: TGLSphere; GLCamera2: TGLCamera; Button2: TButton; Button3: TButton; Button4: TButton; TrackBar1: TTrackBar; TrackBar2: TTrackBar; TrackBar3: TTrackBar; procedure Button1Click(Sender: TObject); procedure GLCube1Progress(Sender: TObject; const deltaTime, newTime: Double); procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure TrackBar2Change(Sender: TObject); procedure TrackBar3Change(Sender: TObject); procedure Button4Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public mx,my: Integer; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin Form1.Visible:=True; Form2.Visible:=False; end; procedure TForm2.Button2Click(Sender: TObject); begin Form2.GLSceneViewer1.Camera:=Form2.GLCamera1; Form2.Button2.Enabled:=False; Form2.Button3.Enabled:=True; end; procedure TForm2.Button3Click(Sender: TObject); begin Form2.GLSceneViewer1.Camera:=Form2.GLCamera2; Form2.Button3.Enabled:=False; Form2.Button2.Enabled:=True; end; procedure TForm2.Button4Click(Sender: TObject); var i: Integer; Pt: TGLPoints; begin For i := 1 To 1000 Do Begin Pt := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject); Pt.Colors.Add(RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, 0.5); Pt.Size := 5; Pt.Position.X := RandomRange(-500, 500) / 1000; Pt.Position.Y := RandomRange(-500, 500) / 1000; Pt.Position.Z := RandomRange(-500, 500) / 1000; GLSceneViewer1.Camera.TargetObject.AddChild(Pt); // Вот, дописал наугад, теперь вроде работает. End; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Application.MainForm.Close(); end; procedure TForm2.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin if(Form2.GLSceneViewer1.MouseInControl=true) then Form2.GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120)) end; procedure TForm2.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); begin //Движение вперед по клавишам ‘ц’ и’ w’ if (IsKeyDown('ц') OR IsKeyDown('w')) then Form2.GLSceneViewer1.Camera.Move(2* deltaTime); //Движение назад по клавишам ‘ы’ и ‘s’ if (IsKeyDown('ы') OR IsKeyDown('s')) then Form2.GLSceneViewer1.Camera.Move(-2* deltaTime); //Поворот влево по клавишам ‘ф’ и’ a’ if (IsKeyDown('ф') OR IsKeyDown('a')) then Form2.GLSceneViewer1.Camera.slide(-2* deltaTime); //Поворот вправо по клавишам ‘в’ и ‘d’ if (IsKeyDown('в') OR IsKeyDown('d')) then Form2.GLSceneViewer1.Camera.slide(2* deltaTime); //Движение вверх по клавишам ‘u’ и ‘г’ if (IsKeyDown('u') OR IsKeyDown('г')) then Form2.GLSceneViewer1.Camera.Lift(0.01); //Движение вниз по клавишам ‘n’ и ‘т’ if (IsKeyDown('n') OR IsKeyDown('т')) then Form2.GLSceneViewer1.Camera.Lift(-0.01); if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1; if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2 end; procedure TForm2.GLCube1Progress(Sender: TObject; const deltaTime, newTime: Double); begin Form2.GLCube1.TurnAngle:=Form2.GLCube1.TurnAngle + deltaTime * 100; end; procedure TForm2.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin mx:=x; my:=y; //Запомнить координаты мыши end; procedure TForm2.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Shift<>[] then begin //Если нажата клавиша Form2.GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта Form2.GLLightSource1.Position:=Form2.GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой mx:=x; my:=y; end; end; procedure TForm2.TrackBar1Change(Sender: TObject); begin Form2.GLSceneViewer1.Camera.TargetObject.PitchAngle:=TrackBar1.Position; end; procedure TForm2.TrackBar2Change(Sender: TObject); begin Form2.GLSceneViewer1.Camera.TargetObject.RollAngle:=TrackBar2.Position; end; procedure TForm2.TrackBar3Change(Sender: TObject); begin Form2.GLSceneViewer1.Camera.TargetObject.TurnAngle:=TrackBar3.Position; end; end. Добавлено Вот окно ошибки. Архив с проектом грузите отсюда: http://www.cyberforum.ru/delphi-multimedia...ml#post13844097 Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
Прикреплённая картинка
Добавлено Ссылка на непоместившееся изображение: http://www.cyberforum.ru/attachments/1068373d1569083895 |
Сообщ.
#3
,
|
|
|
Препод сказал - вывести куб и выставить Ambient.Alpha во фронтах в 0,5. Я вернул первоначальный BlendingMode, а потом сделал это сначала через инспектор объектов, а потом через событие OnCreate для второй формы, но это не помогло.
procedure TForm2.FormCreate(Sender: TObject); begin Form2.GLCube1.Material.FrontProperties.Ambient.Alpha:=0.5; Form2.GLSphere1.Material.FrontProperties.Ambient.Alpha:=0.5; end; То же самое через первую форму дало ошибку. |
Сообщ.
#4
,
|
|
|
Замена Radeon HD 5970 выйдет до конца года
AMD успеет до конца этого года выпустить замену видеокарте Radeon HD 5970, которая сохранит двухчиповую компоновку, но будет использовать уже обновлённую архитектуру Southern Islands. Может и частоты сразу будут 1ГГц по чипу, и пропускная способность памяти вырастет в два раза? Сообщения были разделены в тему "spam" |