 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 17.01.2005, 19:10 Titel: Kollisionserkennung. |
|
|
Hallo,
ich suche eine Möglichkeit, Kollisionen in eines meiner Programme einzubauen. Da ich diesmal alles ein wenig anders gemacht habe, weiss ich nicht ganz wie ich nun eine Kollisionserkennung zustande bringen soll.
Ich habe hier mal ein bisschen Code und möchte wissen wie ich die Bilder "Sun" und "Planet" miteinander Kollidieren lassen soll.
Hier kommt alles was zum Spiel gehört rein:
CPP: | class C3DScenario
{
public:
CStarfield* Starfield;
CPlanetMovement_Graphics* PlanetMovement_Graphics;
D3DXVECTOR3 SunVector;
D3DXVECTOR3 PlanetVector;
// Winkelgrößen für die Positionsbeschreibung der Erde
float Winkelgeschwindigkeit;
float Ortswinkel;
float x;
float y;
float z;
C3DScenario()
{
x = 0.0f;
y = 0.0f;
z = 50.0f;
Starfield = new CStarfield;
PlanetMovement_Graphics = new CPlanetMovement_Graphics;
Winkelgeschwindigkeit = 0.0035f; // 0.2° pro Frame
Ortswinkel = 0.0f;
}
~C3DScenario()
{
SAFE_DELETE(Starfield)
SAFE_DELETE(PlanetMovement_Graphics)
}
void New_Scene(void)
{
// Bewegung der Erde
Ortswinkel += Winkelgeschwindigkeit;
// Hinweis: Die z-Komponente des Planeten-Ortsvektors sorgt für eine perspektivische Bewegung
PlanetVector = D3DXVECTOR3(10.0f*cosf(Ortswinkel), 6.0f*sinf(Ortswinkel), 30.0f+10.0f*sinf(Ortswinkel) );
SunVector = D3DXVECTOR3(x , y, z);
if(PressSameKeyD == TRUE)
{
x += 0.5f;
}
if(PressSameKeyA == TRUE)
{
x -= 0.5f;
}
if(PressSameKeyS == TRUE)
{
y -= 0.5f;
}
if(PressSameKeyW == TRUE)
{
y += 0.5f;
}
if(PressMouseButton1 == TRUE)
{
z += 1.0f;
}
if(PressMouseButton2 == TRUE)
{
z -= 1.0f;
}
Starfield->Render_Starfield();
PlanetMovement_Graphics->Render_Sun(&SunVector);
PlanetMovement_Graphics->Render_Planet(&PlanetVector);
}
};
C3DScenario* Scenario = NULL; |
Und hier werden die Objekte "Sun" und "Planet" 'vorbereitet':
CPP: | class CPlanetMovement_Graphics
{
public:
D3DXMATRIX VerschiebungsMatrix;
CTexturPool* PlanetTextur;
CTexturPool* SunTextur;
VERTEXBUFFER QuadVB;
CPlanetMovement_Graphics()
{
D3DXMatrixIdentity(&VerschiebungsMatrix);
PlanetTextur = new CTexturPool;
sprintf(PlanetTextur->Speicherpfad, "Graphic/Erde.bmp");
PlanetTextur->CreateTextur();
SunTextur = new CTexturPool;
sprintf(SunTextur->Speicherpfad, "Graphic/Sonne.bmp");
SunTextur->CreateTextur();
g_pd3dDevice->CreateVertexBuffer(4*sizeof(COLOREDVERTEX),
D3DUSAGE_WRITEONLY, D3DFVF_COLOREDVERTEX,
D3DPOOL_MANAGED, &QuadVB, NULL);
COLOREDVERTEX* pColVertices;
QuadVB->Lock(0, 0, (VOID**)&pColVertices, 0); // Quad erzeugen
pColVertices[0].position = PlayerVertikaleOriginal-PlayerHorizontaleOriginal;
pColVertices[0].color = D3DCOLOR_XRGB(255,255,255);
pColVertices[0].tu = 0.0f;
pColVertices[0].tv = 0.0f;
pColVertices[1].position = -PlayerVertikaleOriginal-PlayerHorizontaleOriginal;
pColVertices[1].color = D3DCOLOR_XRGB(255,255,255);
pColVertices[1].tu = 0.0f;
pColVertices[1].tv = 1.0f;
pColVertices[2].position = PlayerVertikaleOriginal+PlayerHorizontaleOriginal;
pColVertices[2].color = D3DCOLOR_XRGB(255,255,255);
pColVertices[2].tu = 1.0f;
pColVertices[2].tv = 0.0f;
pColVertices[3].position = -PlayerVertikaleOriginal+PlayerHorizontaleOriginal;
pColVertices[3].color = D3DCOLOR_XRGB(255,255,255);
pColVertices[3].tu = 1.0f;
pColVertices[3].tv = 1.0f;
QuadVB->Unlock();
}
~CPlanetMovement_Graphics()
{
SAFE_DELETE(PlanetTextur)
SAFE_DELETE(SunTextur)
SAFE_RELEASE(QuadVB)
}
void Render_Sun(D3DXVECTOR3* pPosition)
{
VerschiebungsMatrix._41 = pPosition->x;
VerschiebungsMatrix._42 = pPosition->y;
VerschiebungsMatrix._43 = pPosition->z;
g_pd3dDevice->SetTransform( D3DTS_WORLD, &VerschiebungsMatrix);
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pd3dDevice->SetTexture( 0, SunTextur->pTexture );
g_pd3dDevice->SetStreamSource( 0, QuadVB, 0, sizeof(COLOREDVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_COLOREDVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
g_pd3dDevice->SetTexture( 0, NULL );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
}
void Render_Planet(D3DXVECTOR3* pPosition)
{
VerschiebungsMatrix._41 = pPosition->x;
VerschiebungsMatrix._42 = pPosition->y;
VerschiebungsMatrix._43 = pPosition->z;
g_pd3dDevice->SetTransform( D3DTS_WORLD, &VerschiebungsMatrix);
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pd3dDevice->SetTexture( 0, PlanetTextur->pTexture );
g_pd3dDevice->SetStreamSource( 0, QuadVB, 0, sizeof(COLOREDVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_COLOREDVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
g_pd3dDevice->SetTexture( 0, NULL );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
}
};
CPlanetMovement_Graphics* PlanetMovement_Graphics = NULL; |
Vielen Dank für eure Hilfe,
JkerryZ |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 17.01.2005, 19:16 Titel: |
|
|
schmeiß mal den ganzen renderkram raus, der irritiert. so kann ich net arbeiten und dann fragste mal nach was gaaaaanz konkretem!
Factorydesign? Kollisionsmanagement? beste Methoden für Kollisionserkennungen usw.
Deine Fragestellung ist leider etwas brach
Edit:
Beantworte folgende Fragen:
Worum geht es? Indoor, Outdoor, Nodoor?
Was soll kollidieren?
Wieviele Triangles ca.?
Welche Patterns benutzt du?
2D / 3D?
API?
usw.
Mehr Infos  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.01.2005, 20:13 Titel: |
|
|
Da ne Sonne und nen Planet vereinfacht ne Kugel darstellen musst du nur überprüfen ob die Entfernung von Sonne zu Planet kleiner als beide radien (Sonne und Planet) ist dann haste ne Kollision. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:05 Titel: |
|
|
@ Fallen, wie soll ich das mit der Enfernung machen?
Soll ich z.B. zwei Variablen angeben (entfernung_x und entfernung_y) und wenn die sich verändern die Werte vergrößern/vekleinern und wenn die Werte 0 sind als Kollsion werten? Das wär doch aber ziemlich unpraktisch...
@ Patrick, es Geht um eine Kollisionserkennung zwischen zwei BMP-Dateien.
Patterns, kein Plan was das ist.
2D Objekte im 3D-Raum.
Api: Direct 3D.
Indoor/Outdoor, gibts eigentlich nicht, da es nur 2D ist. Also wohl Nodoor.
So und dann hier nochmal der Kram ohne das Gerender:
CPP: | class C3DScenario
{
public:
CStarfield* Starfield;
CPlanetMovement_Graphics* PlanetMovement_Graphics;
D3DXVECTOR3 SunVector;
D3DXVECTOR3 PlanetVector;
// Winkelgrößen für die Positionsbeschreibung der Erde
float Winkelgeschwindigkeit;
float Ortswinkel;
float x;
float y;
float z;
C3DScenario()
{
x = 0.0f;
y = 0.0f;
z = 50.0f;
Starfield = new CStarfield;
PlanetMovement_Graphics = new CPlanetMovement_Graphics;
Winkelgeschwindigkeit = 0.0035f; // 0.2° pro Frame
Ortswinkel = 0.0f;
}
~C3DScenario()
{
SAFE_DELETE(Starfield)
SAFE_DELETE(PlanetMovement_Graphics)
}
void New_Scene(void)
{
// Bewegung der Erde
Ortswinkel += Winkelgeschwindigkeit;
// Hinweis: Die z-Komponente des Planeten-Ortsvektors sorgt für eine perspektivische Bewegung
PlanetVector = D3DXVECTOR3(10.0f*cosf(Ortswinkel), 6.0f*sinf
(Ortswinkel), 30.0f+10.0f*sinf(Ortswinkel) );
SunVector = D3DXVECTOR3(x , y, z);
// Tastenabfrage.
// Render-Zeug.
}
};
C3DScenario* Scenario = NULL; |
|
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 37 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:13 Titel: |
|
|
Ich denke, du willst das wohl dreidimensional darstellen, nimmst aber Billboards statt Kugeln zu rendern. Fallen hat recht. Nimm die Mittelpunkte, die sind dann wohl vPos + Hoehe/2, und da du den Kugelradius weißt, sind die Mittelpunkte bei einer Kollision weniger voneinander entfernt als die Summe der Radien beträgt. Das ist einfach da nimmste D3DXVec3Length oder wie die heißt (schau einfach in der DXSDK Hilfe). Den Vector den du übergibst kriegst du aus D3DXVECTOR3(vPos2.x -vPos1.x, vPos2.y -vPos1.y, vPos2.z -vPos1.z).
Der Rückgabewert ist glaub ich float. _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:29 Titel: |
|
|
HomeLess_PunkDrummer
Au wei... wer zieht den dafür ne Wurzel? Nee nee nee, da stecken wir aber besser nochmal den Kopf ins Mathebuch
CPP: | // ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Testet ob sich 2 Spheren schneiden.
// ///////////////////////////////////////////////////////////////////////////
template<<typename T>typename T> inline bool sphereHitsSphere (const vector<<T>T>& sphereA, const T& radiusA,
const vector<<T>T>& sphereB, const T& radiusB)
{
// Quadrat der Entfernung berechnen und entscheiden, ob eine Kollision vorliegt.
return ((sphereA - sphereB).lengthSqr() <= math::square<<T>T>(radiusA + radiusB));
} |
_________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 37 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:32 Titel: |
|
|
Was wurzel? Wo denn? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.01.2005, 18:35 Titel: |
|
|
D3DXVec3Length zieht gleich die Wurzel, besser wäre D3DXVec3LengthSq _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 37 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:38 Titel: |
|
|
AARGH. Okay...
Ich wollts halt übersichtlich und leicht verständlich halten  _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:42 Titel: |
|
|
HomeLess_PunkDrummer hat Folgendes geschrieben: | Ich wollts halt übersichtlich und leicht verständlich halten  |
D3DX leicht verständlich und übersichtlich? *ROFL*
Der ist gut, den muss ich mir merken
Benutzung ist umständlich und Du siehst nicht was da drin passiert Bist also besser mit eigenen Klassen dran  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 37 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:47 Titel: |
|
|
Menno...  _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:48 Titel: |
|
|
HomeLess_PunkDrummer hat Folgendes geschrieben: | Menno...  |
Und man sollte nicht in Sachen rumstochern die am Sterben sind *ggg* Mit eigenem Kram ist man vieeeeel flexibler Kanns nur empfehlen  _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:51 Titel: |
|
|
äh, ich machs wegen der Lizensscheiße! -Eigene Matrix und Vectornekalsse, außerdem kapiert man wie es genau geht! BTW: Will mir vieleicht jemand erklären wie man die Determinante enier Matirx berechnet?  _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 37 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:53 Titel: |
|
|
Patrick hat Folgendes geschrieben: | HomeLess_PunkDrummer hat Folgendes geschrieben: | Menno...  |
Und man sollte nicht in Sachen rumstochern die am Sterben sind *ggg* Mit eigenem Kram ist man vieeeeel flexibler Kanns nur empfehlen  |
Aber ich brauch doch zumindest für Zugriff auf den Grafikbuffer D3D oder OGL? Oder kann man das auch selbst tun?. Theoretisch schon sonst gäbs kein OpenGL oder? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 18.01.2005, 18:55 Titel: |
|
|
Jonathan_Klein
CPP: | // ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Gibt die Determinante dieser Matrix wieder
// ///////////////////////////////////////////////////////////////////////////
template<<typename T>typename T> inline T matrix<<T>T>::getDeterminante (void) const
{
// Determinante berechnen
return (_11 * (_22 * _33 - _23 * _32) -
_12 * (_21 * _33 - _23 * _31) +
_13 * (_21 * _32 - _22 * _31));
} |
HomeLess_PunkDrummer
Was hat D3DX mit dem FrameBuffer der GraKa zu tun? Nothing, Nada, Nichts. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|