PDA

View Full Version : follow کردن دوربین از پشت ؟



seyedVB
پنج شنبه 10 اردیبهشت 1388, 15:26 عصر
سلام .

فرض کنید ما یک ماشین داریم . و می خوایم دوربین پشت ماشین باشه .

یعنی ماشین که می چرخه ، دروبینم به طور طبیعی باش بچرخه ، ( اینه مشکل من )

نظر شما در این مورد / ؟

pswin.pooya
پنج شنبه 10 اردیبهشت 1388, 17:43 عصر
خوب این که خیلی راحته. تو کدوم محیط کار می کنی.

میزان چرخش رو یکسان در نظر بگیر و میزان انتقال رو متفاوت. اول rotation رو انجام بده بعد از اول translation.

seyedVB
پنج شنبه 10 اردیبهشت 1388, 17:50 عصر
مشکل من اینه که Camera دور محور خودش می چرخه .
محیط :
C#.net

pswin.pooya
پنج شنبه 10 اردیبهشت 1388, 19:07 عصر
نمی دونم دایرکت ایکس چه جوری کار میکنه. ولی توی OpenGL اینکار خیلی راحته. اگه اول انتفال بدی بعد به چرخونی دور خودش میچرخه و بر عکس اگه اول بچرخونی بعد انتقال بدی دور محور میچرخه. یعنی تو هر دو حالتم درو محورها میچرخه ولی جابجا کردن دستور چرخش و انتقال نتیجه های متفاوتی رو میده.

kochol
جمعه 11 اردیبهشت 1388, 20:31 عصر
سلام
باید از دوربین سوم شخص استفاده کنی.

روش کار این طوری است که باید دوربین رو دور یک نقطه بچرخونی این کدی است که من از اون تو موتورم استفاده کردم.

فکر کنم بتونی استفاده کنی.


// *********** ****** ** **** *** ******
// Charkhondan dorbin be dore yek noghte
// *********** ****** ** **** *** ******
void Camera::RotateAroundPoint(float angle, math::Vector *Center, math::Vector Axis)
{
if (!Center)
Center = &m_vLook;

math::Vector vNewPos,
vPos = m_vPos - (*Center);

float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);

// Find the new x position for the new rotated point
vNewPos.x = (cosTheta + (1 - cosTheta) * Axis.x * Axis.x) * vPos.x;
vNewPos.x += ((1 - cosTheta) * Axis.x * Axis.y - Axis.z * sinTheta) * vPos.y;
vNewPos.x += ((1 - cosTheta) * Axis.x * Axis.z + Axis.y * sinTheta) * vPos.z;

// Find the new y position for the new rotated point
vNewPos.y = ((1 - cosTheta) * Axis.x * Axis.y + Axis.z * sinTheta) * vPos.x;
vNewPos.y += (cosTheta + (1 - cosTheta) * Axis.y * Axis.y) * vPos.y;
vNewPos.y += ((1 - cosTheta) * Axis.y * Axis.z - Axis.x * sinTheta) * vPos.z;

// Find the new z position for the new rotated point
vNewPos.z = ((1 - cosTheta) * Axis.x * Axis.z - Axis.y * sinTheta) * vPos.x;
vNewPos.z += ((1 - cosTheta) * Axis.y * Axis.z + Axis.x * sinTheta) * vPos.y;
vNewPos.z += (cosTheta + (1 - cosTheta) * Axis.z * Axis.z) * vPos.z;

m_vPos = (*Center) + vNewPos;

CalcViewMatrix();

} // Rotate Around A Point