PDA

View Full Version : سوال: تشخیص برخورد



amin1softco
سه شنبه 16 خرداد 1391, 11:11 صبح
به زبان خیلی فارسی و روان و ساده زیر سیکل یکی می تونه الگوریتم های تشخیص برخورد رو تشریح کنه ؟
مثلاً ما یک توپی داریم با یک دیوار برخورد این دوتار ور چطوری شبیه سازی کنیم ؟ :متفکر:

Beginner2013
سه شنبه 16 خرداد 1391, 11:47 صبح
به زبان خیلی فارسی و روان و ساده زیر سیکل یکی می تونه الگوریتم های تشخیص برخورد رو تشریح کنه ؟
مثلاً ما یک توپی داریم با یک دیوار برخورد این دوتار ور چطوری شبیه سازی کنیم ؟ :متفکر:

سلام
نمیشه مثلا با هر حرکتی که توپ انجام میده چک کنیم که آیا موقعیت توپ با موقعیت دیوار یکی شده یا نه.
یعنی مثلا اگه توپ با یک تایمر حرکت می کنه در onTime چک کنیم که توپ موقعیتش با موقعیت دیوار یکی هست یا نه.

amin1softco
سه شنبه 16 خرداد 1391, 15:08 عصر
سلام چرا نشه ؟
من منظورم در openGL بود و فضای سه بعدی در فلش فرمایش شما درسته یعنی قدیما یادمه با as2 برای موی کلیپ با movieClip.onEnterFrame اینکار ها رو می کردیم ولی خوب الان بیشتر از لحاظ علمی می خوام بدونم اینجا از امکاناتی مثب درخت و نور و اینها فک کنم بهتر بشه استفاده کرد ...

pswin.pooya
سه شنبه 16 خرداد 1391, 21:34 عصر
مثلاً ما یک توپی داریم با یک دیوار برخورد این دوتار ور چطوری شبیه سازی کنیم ؟ :متفکر: بهتره از كتابخونه هايي مثل Phsyx استفاده كني. اما اگر اسرار داري كه خودت انجام بدي و يا در سطح آسون مثلا براي برخورد هاي مكعبها و يا frustum cull ميخواي ميتوني از الگوريتم هاي اونها استفاده كني كه توي كتاب زير بخوبي توضيح داده شده:

http://books.google.com/books/about/Real_Time_Collision_Detection.html?id=WGpL6Sk9qNAC

اما اگر برخورد رو براي picking مي خواي ميتوني از الگوريتم ray-picking استفاده كني كه توي نسخه اول كتاب introduction game programming with DirectX 9 توضيح داده شده

soroushp
پنج شنبه 18 خرداد 1391, 08:41 صبح
اینم یک برنامه ساده از تشخیص برخورد :

#include <GL/glut.h>
#include <stdlib.h>



struct Vector
{
int x;
int y;

Vector() {}

Vector(int _x, int _y) { x = _x; y = _y; }
};

Vector operator +(const Vector & a, const Vector & b)
{
Vector c;
c.x = a.x + b.x;
c.y = a.y + b.y;
return c;
}

Vector & operator +=(Vector & a, const Vector & b)
{
a.x += b.x;
a.y += b.y;
return a;
}

struct Rect
{
Vector pos;
Vector size;
};

bool rectCollide(const Rect & a, const Rect & b)
{
if (a.pos.x >= b.pos.x + b.size.x)
return false;
if (a.pos.y >= b.pos.y + b.size.y)
return false;
if (b.pos.x >= a.pos.x + a.size.x)
return false;
if (b.pos.y >= a.pos.y + a.size.y)
return false;
return true;
}



Rect screenRect;
Rect ballRect;
Vector ballVel;
Rect playerRect;
Rect cpuRect;



void glBeginScene()
{
glLoadIdentity();
gluOrtho2D(0, 240, 160, 0);

glClear(GL_COLOR_BUFFER_BIT);
}

void glEndScene()
{
glutSwapBuffers();
}

void glVertex(const Vector & v)
{
glVertex2i(v.x, v.y);
}

void glDrawRect(const Rect & r)
{
glBegin(GL_TRIANGLE_STRIP);
glVertex(r.pos);
glVertex(r.pos + Vector(r.size.x,0));
glVertex(r.pos + Vector(0,r.size.y));
glVertex(r.pos + Vector(r.size.x,r.size.y));
glEnd();
}



void bounceInside(const Rect & b, Rect & r, Vector & v)
{
if (v.x > 0 && r.pos.x + r.size.x >= b.pos.x + b.size.x)
{
v.x = -v.x;
r.pos.x = b.pos.x + b.size.x - r.size.x;
}
else if (v.x < 0 && r.pos.x <= b.pos.x)
{
v.x = -v.x;
r.pos.x = b.pos.x;
}

if (v.y > 0 && r.pos.y + r.size.y >= b.pos.y + b.size.y)
{
v.y = -v.y;
r.pos.y = b.pos.y + b.size.y - r.size.y;
}
else if (v.y < 0 && r.pos.y <= b.pos.y)
{
v.y = -v.y;
r.pos.y = b.pos.y;
}
}

int randvel()
{
return rand() % 3 + 1;
}

int randvel2(int x)
{
if (x < 0)
return -randvel();
if (x > 0)
return randvel();
return 0;
}

void bounceOutside(const Rect & b, Rect & r, Vector & v)
{
if (rectCollide(b, r))
{
if (v.x < 0)
r.pos.x = b.pos.x + b.size.x;
else
r.pos.x = b.pos.x - r.size.x;
v.x = randvel2(-v.x);
v.y = randvel2(v.y);
}
}



void inputCpu(Rect & player, const Rect & ball, const Vector & vel)
{
if ((player.pos.x - ball.pos.x) * vel.x < 0)
return;
int py = player.pos.y + player.size.y / 2;
int by = ball.pos.y + ball.size.y / 2;
int delta = by - py;
if (delta < 0)
player.pos.y -= 2;
else if (delta > 0)
player.pos.y += 2;
}



void init()
{
screenRect.pos.x = 0;
screenRect.pos.y = 0;
screenRect.size.x = 240;
screenRect.size.y = 160;

ballVel.x = 2;
ballVel.y = 3;
ballRect.pos.x = 120;
ballRect.pos.y = 80;
ballRect.size.x = 4;
ballRect.size.y = 4;

playerRect.pos = Vector(16,40);
playerRect.size = Vector(8,32);
cpuRect.pos = Vector(240-8-16,100);
cpuRect.size = Vector(8,32);
}

void display()
{
}

void update()
{
inputCpu(playerRect, ballRect, ballVel);
inputCpu(cpuRect, ballRect, ballVel);

ballRect.pos += ballVel;

bounceInside(screenRect, ballRect, ballVel);
bounceOutside(playerRect, ballRect, ballVel);
bounceOutside(cpuRect, ballRect, ballVel);

glBeginScene();
glDrawRect(ballRect);
glDrawRect(playerRect);
glDrawRect(cpuRect);
glEndScene();
}



int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(240, 160);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("PONG");
glutDisplayFunc(display);
glutIdleFunc(update);
init();
glutMainLoop();
return 0;
}

amin1softco
پنج شنبه 18 خرداد 1391, 10:44 صبح
اینقدر خوشم میاد از بچه هایی که همین طرح رو داخل یک کره پیاده می کنند !!!!
یعنی داخل یک کره یک همچین طرحی باشه مثلاً دوربین داخل یک کره باشه این توپه با دیواره ها برخورد کنه و بر گرده!!!

mbgame
شنبه 24 تیر 1391, 17:29 عصر
یک طرح برای collision detection وجود داره که از تکنیک رنگ پیکسلها استفاده میکنه ,و برخورد آنها را تشخیص میده مثلا بازی nfs با این تکنیک نوشته شده! من قبلا کدهاشو داشتم ولی الان هر چی میگردم پیدا نمیکنم! تو وب میتونی کدها رو پیدا کنی.
good luck!