PDA

View Full Version : مشکل animation های در firemonkey



firststep
شنبه 17 فروردین 1392, 20:33 عصر
با سلام و خسته نباشسد خدمت همه شما دوستان عزیز
نمی دونم تا حالا شما هم امتحان کردین زمانی که دو تا floatanimation روی یک object قرار می دین و با هم start می کنین حالا مثلا با این مشخصات
floatanimation 1
property name= rotationangle.x
start =0
stop =360

floatanimation 2
property name= rotationangle.y
start =0
stop =360

خوب با این فلوت ها جسم باید به همون شکل اولی در بیاد بعد از ایست کامل اما اگه ببینین متوجه می شین اصلاً این شکل نیست؟
نمی دونم باید برای پیدا کردن پاسخم چی رو سرچ کنم اصلاً

BORHAN TEC
شنبه 17 فروردین 1392, 20:43 عصر
سلام
لطفاً در مسائلی از این دست پروژه نمونه ای را جهت تست راحتتر ضمیمه کنید.

firststep
شنبه 17 فروردین 1392, 20:59 عصر
بله دوست خوبم شما درست می گید

مثلاً این102430

firststep
شنبه 17 فروردین 1392, 23:04 عصر
فکر کنم اولین نفری باشم که به این موضوع پی بردم.......

BORHAN TEC
شنبه 17 فروردین 1392, 23:44 عصر
من توی سیستمم متوجه هیچ تغییری نشدم. میشه دقیق تر توضیح بدین که چه تغییری ایجاد میشه؟

firststep
یک شنبه 18 فروردین 1392, 02:13 صبح
ببینین مقادیر فلوت ه ۳۶۰ درجه دور رو نشون میدن خوب با این تفاسیر قانون شی بعذ اژ اجرای انیمیشن باید به شکل اولیه برگرده اما می بینیم که این طور نیست و شکل دارای انحراف است اما زمانی که فقط یک فلوت را استارت می کنیم درست اجرا میشه

Ananas
سه شنبه 20 فروردین 1392, 01:44 صبح
سلام.
پیدا کردم اشکال از کجاست.
وقتی مقدار 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 اون ها انجام بشه.