ورود

View Full Version : گفتگو: روش صحیح نرمالیز کردن بردار



UfnCod3r
دوشنبه 06 خرداد 1392, 18:10 عصر
ب نظر شما بهترین روش نرمالیز کردن بردار یا امثالش چیه :متفکر: خیلی کنجکاو شدم :متفکر:
من تو چند تا موتوری ک تو سیستم داشتم رو نگا کردم اینم کدها
هرکی ی گندی بالا اورده :قهقهه::متفکر::بامزه::چشمک:

///////////////////OGRE
inline Real normalise()
{
Real fLength = Math::Sqrt( x * x + y * y + z * z );

if ( fLength > Real(0.0f) )
{
Real fInvLength = 1.0f / fLength;
x *= fInvLength;
y *= fInvLength;
z *= fInvLength;
}

return fLength;
}


////////////////SoftPixel
inline vector3d<T>& normalize()
{
T n = X*X + Y*Y + Z*Z;

if (n == static_cast<T>(0.0) || n == static_cast<T>(1.0))
return *this;

n = static_cast<T>(1.0 / sqrt(n));

X *= n;
Y *= n;
Z *= n;

return *this;
}

//////////////////KGE
void Normalize()
{
float length = sqrtf(x*x + y*y + z*z);
length = fEpsilon > length ? fEpsilon : length;
x /= length;
y /= length;
z /= length;
}

////////////////CryEngine
ILINE void Normalize()
{
assert(this->IsValid());
F fInvLen = isqrt_safe_tpl( x*x+y*y+z*z );
x*=fInvLen; y*=fInvLen; z*=fInvLen;
}

///////////////UnrealEngine
UBOOL Normalize()
{
FLOAT SquareSum = X*X+Y*Y+Z*Z;
if( SquareSum >= SMALL_NUMBER )
{
FLOAT Scale = appInvSqrt(SquareSum);
X *= Scale; Y *= Scale; Z *= Scale;
return 1;
}
else return 0;
}

ب نظر شما بهترین و بدترین تو این کد ها کدومه ؟

من خودم اینو نوشتم با این طرز فکر :تشویق::لبخند:
- اگه قراره شرطی بزاریم ک بیشتر از صفر بودن رو بررسی کنه همون بهتر ک مربع طول بردارو بررسی کنیم ن اینکه جزرشو هم بگیرم و بعد بررسی کنیم :متفکر:
- عوض 3 تا تقسیم اول 1 رو تقسیم بر طول کنیم بعد نتیجه رو در x,y,z ضرب کنیم :متفکر:
- اصلا چ کاریه عوض اینکارا از InvSqrt که جان کارمک نوشته استفاده کنیم یا ازrsqrt SSE ک خیلی هم سریع تره:متفکر:
- اصلا چرا بگیم بیشتر از صفر بود جذرو ضرب انجام بشه وقتی بیشتر از 1 باشه یعنی بردار نرمالیز نیست اینطوری ک بهتره :متفکر:
:عصبانی++:


void normalize()
{
float len = x*x + y*y + z*z;
if(len > 1.000003f)
{
len = XRSqrt(len);
x *= len;
y *= len;
z *= len;
}
}


ی نظر فنی در کنید روحمون شاد شه:لبخندساده::شیطان:

FastCode
دوشنبه 06 خرداد 1392, 19:16 عصر
cry از همه سریعتره.
OGRE و KGE رو کلا در نظر نگیری بهتره.
SoftPixel دقیقه ولی سرعتش پایینه.
UNREAL توی شرایط خودش ممکنه از cry سریعتر باشه.
ولی تا benchmark نگیری معلوم نمیشه.
شاید OGRE حتی با اینکه cast داره سریعتر باشه.اینطوری نمیشه با اطمینان چیزی گفت

UfnCod3r
دوشنبه 06 خرداد 1392, 20:09 عصر
بجز کرای و انریل بقیه خوب نیستن . اینا جفتشون از InvSqrt استفاده کردن . (از _mm_rsqrt_ss ک واس SSE هست استفاده کرده بودن )
ولی واس خودم سریع ترینه :شیطان::شیطان::شیطان:

اینو نگا کنید از خنده بمیرین بدون شرح :قهقهه:

void Quaternion::normalise()
{
// Don't normalize if we don't have to
float mag2 = w * w + x * x + y * y + z * z;
if (fabs(mag2) > TOLERANCE && fabs(mag2 - 1.0f) > TOLERANCE) {
float mag = sqrt(mag2);
w /= mag;
x /= mag;
y /= mag;
z /= mag;
}
}

http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_ro tation

سپول
سه شنبه 07 خرداد 1392, 12:43 عصر
اصلا چرا بگیم بیشتر از صفر بود جذرو ضرب انجام بشه وقتی بیشتر از 1 باشه یعنی بردار نرمالیز نیست اینطوری ک بهتره
طول بردار فقط باید 1 باشه تا نرمالیزه باشه، اگه 0.5 هم باشه نرمالیزه نیست !

UfnCod3r
سه شنبه 07 خرداد 1392, 14:54 عصر
ینی الان 0.5, 0.5, 0 نرمالیز نیست و وقتی نرمالیزش می کنیم باید به سمت بالا بشه. 1و1و0 ؟:متفکر::متفکر:

FastCode
سه شنبه 07 خرداد 1392, 15:01 عصر
وقتی 0.5,0.5,0.0 رو normalize میکنیم میشه 0.707,0.707,0.0

UfnCod3r
سه شنبه 07 خرداد 1392, 19:11 عصر
اره
بهر حال وقتی 0.5 , 0.5 , 0 هست چ نیازی ب نرمالیز کردنه دوباره هست :متفکر:

FastCode
سه شنبه 07 خرداد 1392, 19:35 عصر
اره
بهر حال وقتی 0.5 , 0.5 , 0 هست چ نیازی ب نرمالیز کردنه دوباره هست :متفکر:
۱۰۰٪ هست.
یکی از خواص بردار های نرمال اینه که اگر چند بار در یگ بردار ضرب بشن طولش رو تغییر نمیدن.اینطوری اگر ۱۰ تا تبدیل روی یک object انجام بدی محو میشه

pswin.pooya
چهارشنبه 08 خرداد 1392, 11:51 صبح
سلام


OGRE و KGE رو کلا در نظر نگیری بهتره.
آقا منون بدجوری مایه گذاشتی برا ما

__UFNHGGI_H__ (http://barnamenevis.org/member.php?279137-__UFNHGGI_H__)
یه سوال سورس Cry رو از کجا گیر آوردی

UfnCod3r
چهارشنبه 08 خرداد 1392, 12:03 عصر
سورس کامل نیست همون نسخه ای ک برا دانلود هست رو گرفتم البته همونم چیز کمی نداره.
سورس انریل رو خواستی دارم کامل کامله:شیطان::شیطان::شیطان: البته نسخه جدید نیست فکر کنم نسخه 3 هست ولی خب خیلی چیزا داره نسخه های جدیدم همون هستن یکم دست مالی کردن :متفکر:
ی موتور دیگم دیکم دارم مال Havok هست اسمش یادم نیست اون سورسش هست + کتاب خونه های SppedTree, ScaleForm توشه :شیطان:
:شیطان:

FastCode
چهارشنبه 08 خرداد 1392, 13:01 عصر
آقا منون بدجوری مایه گذاشتی برا ما
فکر میکنم خیلی بی ربط نگفتم.


Real(0.0f)
معلوم نیست توی اون تابع یا macro یا copy operator یا هر چیز دیگه ای که هست چه اتفاقاتی میافته.من حدث میزنم اتفاق خوبی نمیافته.
KGE هم که خیلی زیبا تقسیم کرده.

UfnCod3r
چهارشنبه 08 خرداد 1392, 14:10 عصر
اون Real در واقع typedef float Real هست همین.:لبخندساده: