مشکل animation های در firemonkey
با سلام و خسته نباشسد خدمت همه شما دوستان عزیز
نمی دونم تا حالا شما هم امتحان کردین زمانی که دو تا floatanimation روی یک object قرار می دین و با هم start می کنین حالا مثلا با این مشخصات
floatanimation 1
property name= rotationangle.x
start =0
stop =360
floatanimation 2
property name= rotationangle.y
start =0
stop =360
خوب با این فلوت ها جسم باید به همون شکل اولی در بیاد بعد از ایست کامل اما اگه ببینین متوجه می شین اصلاً این شکل نیست؟
نمی دونم باید برای پیدا کردن پاسخم چی رو سرچ کنم اصلاً
نقل قول: مشکل animation های در firemonkey
سلام
لطفاً در مسائلی از این دست پروژه نمونه ای را جهت تست راحتتر ضمیمه کنید.
1 ضمیمه
نقل قول: مشکل animation های در firemonkey
بله دوست خوبم شما درست می گید
مثلاً اینضمیمه 102430
نقل قول: مشکل animation های در firemonkey
فکر کنم اولین نفری باشم که به این موضوع پی بردم.......
نقل قول: مشکل animation های در firemonkey
من توی سیستمم متوجه هیچ تغییری نشدم. میشه دقیق تر توضیح بدین که چه تغییری ایجاد میشه؟
نقل قول: مشکل animation های در firemonkey
ببینین مقادیر فلوت ه ۳۶۰ درجه دور رو نشون میدن خوب با این تفاسیر قانون شی بعذ اژ اجرای انیمیشن باید به شکل اولیه برگرده اما می بینیم که این طور نیست و شکل دارای انحراف است اما زمانی که فقط یک فلوت را استارت می کنیم درست اجرا میشه
نقل قول: مشکل animation های در firemonkey
سلام.
پیدا کردم اشکال از کجاست.
وقتی مقدار X یا Y یا Z رو برای RotationAngle تغییر میدید یک متغیر داخلی در RotationAngle به اسم FSave هست که ابتدا مقدار زاویه ی فعلی رو (آخرین وضعیت دوران) ذخیره میکنه بعد مقداری رو که شما بهش دادید ذخیره میکنه. متغیر FSaveیک جور Offset به حساب میاد و کارش اینه که دوران جدید رو حول محور موضعی خود شی (با استفاده از آخرین وضعیت قبلی) اعمال کنه.
به همین خاطر در هر فریم که شی حول یکی از محور ها دوران داده میشه ، در واقع حول محور X یا Y یا Z خود شی دوران داده میشه (نسبت به آخرین وضعیت قبلی) نه حول محور های مختصات جهانی.
حالا برای این که اون رو گول بزنیم میشه قبل از تغییر زاویه ی جدید اول مقادیر x و Y و Z فعلی رو ذخیره کنیم بعد از تابع ResetRotationAngle استفاه کنیم (تا مقادیر زوایا و offset اونها به صفر تغییرکنه) بعد سه تا مقدار رو به دلخواه تغییر بدیم بعد اون ها رو به ترتیب آخرین محور به اولین محور ست کنیم (چون دوران قبلی روی کارمون تاثیر نگذاره).
نکته : اگر ترتیب دوران x بعد y بعد z رو بخوایم شبیه سازی کنیم اول باید زاویه ی z بعد y بعد x رو ست کنیم، دلیلش اینه که زاویه های موجود تو هر مرحله از ست کردن، روی کارمون تاثیر میگذاره پس ترتیب باید از آخر به اول باشه.
مثلا اگر بخوایم با استفاده از دو تا Trackbar دوران X و Y یک TLayer3D رو تغییر بدیم بر اساس دوران x بعد y بعد z ، کدی مشابه کد زیر می تونیم بنویسیم :
procedure TForm1.TrackBar1Change(Sender: TObject);
var
y, z : Single;
begin
// x = newVal
y := Layer3D1.RotationAngle.Y;
z := Layer3D1.RotationAngle.Z;
Layer3D1.ResetRotationAngle;
Layer3D1.RotationAngle.Z := z;
Layer3D1.RotationAngle.Y := y;
Layer3D1.RotationAngle.X := (Sender as TTrackBar).Value;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
var
x, z : Single;
begin
x := Layer3D1.RotationAngle.X;
// y = newVal
z := Layer3D1.RotationAngle.Z;
Layer3D1.ResetRotationAngle;
Layer3D1.RotationAngle.Z := z;
Layer3D1.RotationAngle.Y := (Sender as TTrackBar).Value;
Layer3D1.RotationAngle.X := x;
end;
برای FloatAnimation هم میتونید مثلا برای مقادیر Value این دو تا Trackbar انیمیشن رو انجام بدید تا OnChange اون ها انجام بشه.