GAECHKA
Твоя помощница в решении задач

Graph3D. Анимация стендовой стрельбы по тарелочкам

Обращаюсь к знатокам. Разрабатываю симулятор стендовой стрельбы,
но на первом же этапе получил проблему:
Тарелочка летает, на первых проходах все нормально, но затем качество
прорисовки снижается, все больше мерцаний и затем программа вылетает.
В разных режимах может вылететь на 3-ем, или 13-ом цикле.
Перепробовал менять sleep(), шаг по X, нашел оптимум, но не очень хороший.
Думаю, что прорисовка анимации сильно загружает процессор, до предела, а потом он
сбрасывает программу. Может кто знает в чем дело?

uses Graph3D;
var UFO:Object3D;
var anb:AnimationBase;
//Задаем размеры тарелки с чертежа в мм
var dmm : array [1..5] of real :=(109.5,97.5,89,76.8,59); 
var dmmin : array [1..5] of real :=(104.0,85.0,71,66,0); 
var hmm: array [1..5] of real :=(11,6.5,5.5,5,0.7); 
var Lf:real:=4000;  //Размеры поля в см
var Df:real:=2500;
var m:=3.0; //Масштаб  прорисовки тарелки 
st:string; //Строка для табло
//---------------------------------------------------------------------- 
Function Plate(xst,yst,zst:real):Object3D;  //Рисуем тарелку в см
var r,rin,h : array [1..5] of real;
Begin
for var i:=1 to 5 do
Begin
r[i]:=dmm[i]*m/20; //размер в см
rin[i]:=dmmin[i]*m/20; //Внутренний радиус (приблизительно)
h[i]:=hmm[i]*m/10;
end;
var h0:=h[1]*0.99;  //Чтобы не было дыры при переходе к а2
var a0 := tube(xst,yst,zst,h0,r[1],rin[1],Colors.Red);
var a1 := tube(xst,yst,zst+h0,h[1]-h0,r[1],rin[2],Colors.Red);
var a2 := tube(xst,yst,zst+h[1],h[2],r[2],rin[3],Colors.Red);
var a3 := Cylinder(xst,yst,zst+h[1]+h[2],h[3],r[3],Colors.Red);
Result:=Group(a0,a1,a2,a3);
End;
//-----------------------------------------------------------------
BEGIN
//view3d.ShowCameraInfo := True;
Window.Maximize;
View3D.BackgroundColor := Colors.DeepSkyblue; //Небо
//Распологаем камеру на месте стрелка (+7 м от края поля) на уровне глаз
var PcY:=Df/2+700;
var PcZ:=160;
Camera.Position := P3D(0,PcY,PcZ); 
var Field:=Rectangle3D(0,0,0,Lf,Df,Colors.Green); //Рисуем поле
var Field1:=Rectangle3D(0,Df/2+250,0,Lf,500,Colors.Brown);
For var i:=1 to 21 do //Рисуем столбы
Begin
var hc:=100;
if (i=11) or (i=2) then hc:=200; 
var c:= Cylinder(-2000+(i-1)*200,-1250,0,hc,10,Colors.Brown);
End;
var ab:=20;  //Стартовая высота и координаты
var x0:=Lf/2;
var y0:=0.0;
var z0:=ab;
var c2:=Box(x0,y0,ab/2,ab,ab,ab,Colors.Yellow); //стартовая машинка 
var c1:=Box(-x0,0,ab/2,ab,ab,ab,Colors.Blue); //финиш (отладочный)
var Tab2:=Rectangle3D(-Lf/2+195,-df/2-20,230,540,80,V3D(0,1,0),Colors.Brown); //Табло
var Tab1:=Rectangle3D(-Lf/2+210,-df/2,230,500,60,V3D(0,1,0),Colors.White); //Табло
UFO:=Plate(0,0,0); //Создание тарелки
var anim:= UFO.AnimMoveTo (x0,y0,z0,0.01); // Переход в положение старта
anim.Begin;
var n,np:integer;
 
Repeat
x0:=Lf/2;
y0:=0.0;
z0:=ab;
n+=1;
st:='ПУСКОВ '+n+'  ПОПАДАНИЙ '+np;
var t:= Text3D(-Lf/2+220,-df/2+20,230,st,40,Colors.Black); //Текст табло
Loop 400 do
Begin
x0+=-10; //Простая отладочная траектория тарелки (по прямой)
z0+=3;
if x0 0 then z0+=-6;  //спуск
anb:= UFO.AnimMoveTo (x0,y0,z0,0.0);
anb.Begin;  //Здесь выдает ошибку на 7-14 ом проходе, и это непонятно ???
sleep(25);
var tx:=x0/PcY;
var tz:=(z0-Pcz)/PcY;
Camera.LookDirection := V3D(tx,-1,tz); //Следим за полетом тарелки 
end;
sleep(1000);
anb.Remove;
//Exit;
t.Destroy;
until false;
END.
0
вопрос задан

Источник


0 ответов