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;
}
}
ی نظر فنی در کنید روحمون شاد شه:لبخندساده::شیطان:
من تو چند تا موتوری ک تو سیستم داشتم رو نگا کردم اینم کدها
هرکی ی گندی بالا اورده :قهقهه::متفکر::بامزه::چشمک:
///////////////////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;
}
}
ی نظر فنی در کنید روحمون شاد شه:لبخندساده::شیطان: