See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Collision dans Orbiter !  (Read 3902 times)

0 Members and 1 Guest are viewing this topic.

Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
24 March 2012, 22:58:39
Ca y est, on a LA perle manquante au collier Orbiter ...
Après UCGO, UMMU, DGIV, MULE (oui oui Bibi), voici Basic Collision Detection, un module qui gère les "rebons" entre vaisseaux !
Testé au sol avec le scénario de base, il réagit aux vaisseaux uniquement (pour l'instant je pense), et c'est une très bonne chose dans l'ajout du réalisme.

Apparemment il est très sommaire, et ne réagit pas au mesh mais à un cube.
Selon le fil Orbiter Forum, il se base sur les nom des objets; ainsi un vaisseau ayant "SH-*" comme nom, se verra attribué un pavé de 3x10x7.5 mètres, ainsi de suite pour "GL-*" attribué au DeltaGlider(IV) et "PB-*" pour les vaisseaux monoplaces.

La source est incluse pour quiconque voulant l'améliorer (plutôt une bonne chose), alors, qui mettra les mains dans le cambouis, au moins rien que pour regarder comment c'est codé ?
Téléchargez-le, il en vaut la peine ! :beer:



Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #1 - 24 March 2012, 23:15:47
Merci pour l'info, si Tintin m'en laisse le temps, je teste... :hot:


Mes add-ons sont là !

Offline DagoO

  • Legend
  • ******
  • Posts: 2161
  • Karma: 7
Reply #2 - 25 March 2012, 22:05:51
Je veux pas gâcher l'ambiance, mais cet effet existe déjà depuis quelques années avec Meshland... :)

http:/ /orbides.1gb.ru/orbf/MLVS-WIP-080327.zip

Il fonctionne sous le même principe, il place un cube invisible qui enveloppe tout le vaisseau et on peut rebondir dessus :badsmile:

Je vais quand même essayer celui-là parce que c'est vrai que Meshland est très peu stable.

Merci de la nouvelle en tout cas ;)



Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #3 - 25 March 2012, 23:09:31
La collision par bounding box est une technique très populaire dans les jeux vidéos. Au lieu de calculer chaque triangle, on fait un test pour chaque coins d'un rectangle (8 calculs en tout). Encore plus efficace, une bounding sphere qui nécessite un seul calcul. Chaques techniques a ses avantages (plus de précisions ou moins de temps de calcul).

Un excellent article (en anglais) :
http://www.toymaker.info/Games/html/collisions.html

C'est déjà un bon avancement dans la collision pour Orbiter. Mais pour avoir quelque chose de stable, c'est vraiment du côté de Martin qu'il faut se pencher.


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #4 - 25 March 2012, 23:10:10
Quote
DagoO a écrit:
cet effet existe déjà depuis quelques années avec Meshland... :)
Oui, je connaissait, mais justement il est très peu stable ...

Après avoir bien testé l'add-on, il est préférable de l'enlever pour des voyages avec EVA Ummu, car j'ai là un homme quelque part en orbite autour de Mars, éjecté de Phobos en voulant approcher le DG-IV ^^
Et aussi pour les fusées, car les EAP "vibrent" mais n'ont pas de nouveaux messages :badsmile: à la séparation, et l'EPC rentre dans le 2e étage sinon.

Il faudrait polir la physique, car tout l'effet de "rebond" est restitué au vaisseau "touché" et rien pour le vaisseau "attaquant" (scénario "DGIV docked to ISS" ou je suis resté en orbite alors que après rebonds, l'ISS a fini cramé dans l'Océan Atlantique), et ajouter le transfer en rotation, et voilà une amorce d'anti-tricherie (pour ceux qui ne s'embêtent a passer DANS l'ISS ^^).



Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #5 - 26 March 2012, 00:13:23
Quote
Bibi Uncle a écrit:
Mais pour avoir quelque chose de stable, c'est vraiment du côté de Martin qu'il faut se pencher.
Mouais... A moins qu'il ait changé d'avis, il n'a jamais voulu s'occuper de cela ...:wor:


Mes add-ons sont là !

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #6 - 26 March 2012, 01:43:29
Aux dernières nouvelles, tu as raison, il ne veut pas se lancer là-dedans.


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #7 - 16 May 2012, 14:29:48
Quote
Bibi Uncle a écrit:
Aux dernières nouvelles, tu as raison, il ne veut pas se lancer là-dedans.

Up du sujet pour dire que tu as (patiellement) tort car à en croire ce thread OF Martin est en plein boulot d'une détection de collision de type "Convex hull". Regardez l'avancement:
<a href="http://www.youtube.com/watch?v=50K2mjPtMLQ" target="_blank">http://www.youtube.com/watch?v=50K2mjPtMLQ</a>
http://www.youtube.com/watch?v=50K2mjPtMLQ&hd=1



Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #8 - 16 May 2012, 16:32:48
:hot:


Mes add-ons sont là !

Offline La brique volante

  • Legend
  • ******
  • Posts: 1742
  • Karma: 1
Reply #9 - 16 May 2012, 19:18:53
Et les docking ça passe encore avec?
Ou on rebondit avant de pouvoir s'arrimer?



Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #10 - 16 May 2012, 21:41:36
Quote
La brique volante a écrit:
Et les docking ça passe encore avec?
Ou on rebondit avant de pouvoir s'arrimer?

Martin ne semble parler que des planètes ... Alors je pense que la collision vessel->vessel en Convex hull n'est pas faite (du moins pour l'instant !)



Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #11 - 18 May 2012, 13:55:40
Quote
SolarLiner wrote:
Martin ne semble parler que des planètes ... Alors je pense que la collision vessel-&gt;vessel en Convex hull n'est pas faite (du moins pour l'instant !)
Pourtant, sur l'une des 2 videos, il y a une plateforme...


Mes add-ons sont là !

Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #12 - 18 May 2012, 14:04:41
Ce doit être une des vidéos présentation de Visiosad; regarde le titre de ladite vidéo.



Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #13 - 28 May 2012, 00:28:14
Ca ressemble un peu a ça

le code bullet.dll  detection de collision basée sur le size du vaisseau cible

//Chtitte curiosité basée sur un petit calcul de trigo
#define STRICT
#define ORBITER_MODULE
#include "orbitersdk.h"
#include "stdio.h"
// ==============================================================
// Parametres
// ==============================================================

const double bullet_FUELMASS = 30.0;
const double bullet_ISP = 4e5;
const double bullet_MAXMAINTH = 3e5;
const double bullet_MAXHOVERTH = 1.5e5;
const double bullet_MAXRCSTH = 2e2;
const double EXPLODING_SPEED= 0.90; // vitesse de resorbsion d'explosion


// lift coefficient
double LiftCoeff (double aoa)
{
const int nlift = 9;
static const double AOA[nlift] = {-180*RAD,-60*RAD,-30*RAD,-
1*RAD,15*RAD,20*RAD,25*RAD,60*RAD,180*RAD};
static const double CL[nlift] = { 0, 0, -0.1, 0, 0.2, 0.25, 0.2, 0, 0};
static const double SCL[nlift] = {(CL[1]-CL[0])/(AOA[1]-AOA[0]), (CL[2]-CL[1])/(AOA[2]-AOA[1]),
(CL[3]-CL[2])/(AOA[3]-AOA[2]), (CL[4]-CL[3])/(AOA[4]-AOA[3]),
(CL[5]-CL[4])/(AOA[5]-
AOA[4]), (CL[6]-CL[5])/(AOA[6]-AOA[5]),
(CL[7]-CL[6])/(AOA[7]-
AOA[6]), (CL[8]-CL[7])/(AOA[8]-AOA[7])};
for (int i = 0; i < nlift-1 && AOA[i+1] < aoa; i++);
return CL + (aoa-AOA)*SCL;
}


// ==============================================================
// bullet class
// ==============================================================

class bullet: public VESSEL2 {
public:
bullet (OBJHANDLE hVessel, int flightmodel)
: VESSEL2 (hVessel, flightmodel) {}

void clbkSetClassCaps (FILEHANDLE cfg);
void clbkPostStep (double simt, double simdt, double mjd);
void clbkPreStep (double simt, double simdt, double mjd);;
void Timestep (double simt);
void Explode (void);
OBJHANDLE targetHandle;
THRUSTER_HANDLE th_main, th_hover;


// Detection de collision
void DetectCollision();
void DureeProximiteVaisseau();
double VarDureeProxiVaisseau;
double dPrevStep;
double DeltaTaille;
double DistanceMiniVaisseau(OBJHANDLE *vHandle);
protected:
double explode_proc;
};


// --------------------------------------------------------------
// carractéristiques du projectile
// --------------------------------------------------------------
void bullet::clbkSetClassCaps (FILEHANDLE cfg)
{
SetSize (0.5); // taille du projectile
SetEmptyMass (50.0); // masse a vide
SetCW (0.3, 0.3, 0.6, 0.9); // etc etc .......
SetWingAspect (0.7);
SetWingEffectiveness (2.5);
SetAlbedoRGB (_V(0.77,0.20,0.13));
SetCrossSections (_V(10.5,15.0,5.8 ) );
SetRotDrag (_V(3.6,3.6,3.35));
SetPMI (_V(2.28,2.31,0.79));
SetTrimScale (0.05);
SetCameraOffset (_V(0,0.8,0));
SetLiftCoeffFunc (LiftCoeff);
SetTouchdownPoints (_V(0,-1.5,2), _V(-1,-1.5,-1.5), _V(1,-1.5,-1.5));

// declaration du reservoir
PROPELLANT_HANDLE hpr = CreatePropellantResource (bullet_FUELMASS);


// ***************** definition des propulseurs*******************

th_main = CreateThruster (_V(0,0,-0.5), _V(0,0,1), bullet_MAXMAINTH, hpr, bullet_ISP);
CreateThrusterGroup (&th_main, 1, THGROUP_MAIN);
SURFHANDLE tex = oapiRegisterExhaustTexture ("SANFIRE" ) ;//nom de la texture utilisée pour le
propulseur
principal
AddExhaust (th_main, 6, 3, _V(0,0.0,0.0), _V(0,0,-1), tex);

th_hover = CreateThruster (_V(0,0,-0.5), _V(0,0,0), bullet_MAXMAINTH, hpr, bullet_ISP);
CreateThrusterGroup (&th_hover, 1, THGROUP_HOVER);
SURFHANDLE tex4 = oapiRegisterExhaustTexture ("SANBOOM" ) ;//nom de la texture utilisée pour
l'explosion
AddExhaust (th_hover, 6, 6, _V(0.0,0.0,0.0), _V(0,0,1), tex4);

//chargement du mesh
AddMesh ("bullet" );
}
void bullet::DetectCollision()
{
double DMin, TailleVaisseau; // declare les variables
OBJHANDLE VaissADminiHandle; // declare le handle du vaisseau A Distance minimale
char minh[128]; //declare la variable pour stoker le nom du vaisseau
DeltaTaille = GetSize(); //recupére la valeur du setsize
DMin = DistanceMiniVaisseau(&VaissADminiHandle); //lance le calcule de proximité
oapiGetObjectName (VaissADminiHandle, minh, 128 ); // recupére le nom du fameux vaisseau
if (VaissADminiHandle == NULL) //evidement si y'en a pas
return; //pas la peine de faire le reste

TailleVaisseau = oapiGetSize(VaissADminiHandle); // si y'a on lui demande sa taille la prochaine fois
j'utiliserais
//aussi la crossection pour étre plus precis
if (DMin < ((TailleVaisseau+DeltaTaille)/2)) // je l'ai ou je l'ai pas
{
SetThrusterGroupLevel (THGROUP_MAIN, 0.0); // YEP ! je l'ai STOOOOOOOOOOP!
}
}

//calcul et recherche de la distance mini
double bullet::DistanceMiniVaisseau(OBJHANDLE *vHandle)
{
char monmien[256];
char monautre[256];
strcpy (monmien, GetName()); //nom du projectile courrant
OBJHANDLE myHandle = oapiGetVesselByName (monmien);
VECTOR3 relativeXYZ;
double Distance, distancecalcul;
int VCount;
Distance = -1; // initialise la distance
*vHandle = NULL;

VCount = oapiGetVesselCount(); //retourne le nombre de vaisseaux presents
for (int i=0; i<VCount; i++) //pour le vaisseaux n
{
targetHandle = oapiGetVesselByIndex(i); //donne le handle du vaisseaux n
oapiGetObjectName (targetHandle, monautre, 128 ); //recupére le nom du vaisseaux n
int result = strncmp (monmien, monautre, 6);
// compare sur les 6 premier carractéres ; les nom des vaisseaux "bullet" sont une
concaténation,
// du nom du vaisseaux tireur, du numero de projectile et du mot bullet.
// si les 6 premier carractéres sont egaux strncmp retourne 0, il est inutile de tester la collision

if (result != 0)
{
if (myHandle != targetHandle) // vas pas tester la distance entre moi et moi, quand méme

{
try //bon on tente le coup avec celui la try introduit un bloc de code
//susceptiblede générer des exceptions auquelles le programme doit réagir
{
oapiGetRelativePos(myHandle, targetHandle, &relativeXYZ); // retourne la position relative
entre moi et l'autre
distancecalcul = sqrt(relativeXYZ.x*relativeXYZ.x + relativeXYZ.y*relativeXYZ.y +
relativeXYZ.z*relativeXYZ.z); //la trigo ya que ça de vrai
//la condition if suivante compare la distance calculée du vaisseaux n à celle du vaisseaux n-1
//c'est un filtre qui ne conserve que le handle et la distance du vaisseaux le plus proche
if ((distancecalcul < Distance) || (Distance < 0))
{
Distance = distancecalcul;
*vHandle = targetHandle;
}
}
catch (...) // viens tout de suite aprés "try"
{
//traite les exeptions au cas ou yen aurais
}
}
}
}

return Distance; //retourne la disdance mini
}

// --------------------------------------------------------------
// mise a jour graphique
// --------------------------------------------------------------
void bullet::clbkPreStep (double simt, double simdt, double mjd)
{
DetectCollision(); // y a quelqu'un au bout du fil ??? autant le faire avant la mise à jour
}
void bullet::clbkPostStep (double simt, double simdt, double mjd)
{
char name[256]; // prepare la variable
strcpy (name, GetName()); //je m'appelle comment deja ?
OBJHANDLE hV = oapiGetVesselByName (name); //et mon handle c'etais comment ?
if (GetFuelMass() == 0) //t'as raté et ya pu de jus
{
oapiDeleteVessel(hV); // bye bye !!!
}
if (GetThrusterGroupLevel (THGROUP_MAIN) < 1.0 ) //si stooop on l'a eu
{
double LF = simdt * EXPLODING_SPEED; //ben boom !!!!!
SetThrusterGroupLevel(THGROUP_HOVER,(explode_proc = max (0.0, explode_proc-LF)));
}else explode_proc = 1.0;
if (explode_proc == 0.0)
{
oapiDeleteVessel(hV); //puis bye bye !!!!
}

}

// les grands classiques
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
return new bullet (hvessel, flightmodel);
}

// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------
DLLCLBK void ovcExit (VESSEL *vessel)
{
if (vessel) delete (bullet*)vessel;
}

et le code pour tirer des projectiles

void monvaisseau::firebullet (void)
{
//preparation de paramétres des projectiles voir code SRB Atlantis et la doc du SDK
pour la création des parametre vs de VESSELSTATUS2
VESSELSTATUS2 vs;
VESSELSTATUS2::FUELSPEC fuel;
VESSELSTATUS2::THRUSTSPEC thrust;
memset (&vs, 0, sizeof(vs));
vs.version = 2;
GetStatusEx (&vs);
vs.flag = VS_FUELLIST | VS_THRUSTLIST;
//position locale de la bouche du 1er canon x y z, c'est un vecteur
VECTOR3 ofs = { 1.5, 1.3,6.7};;
//position locale de la bouche du 2éme canon x y z
VECTOR3 ofs2 = {-1.5, 1.3,6.7};; //warning il y a rotation a 180°
VECTOR3 rofs, rvel = {vs.rvel.x, vs.rvel.y, vs.rvel.z};
VECTOR3 vel = {0,-1,0};
Local2Rel (ofs, vs.rpos);
GlobalRot (vel, rofs);
vs.rvel.x = rvel.x+rofs.x;
vs.rvel.y = rvel.y+rofs.y;
vs.rvel.z = rvel.z+rofs.z;
vs.vrot.x = 0.0;
vs.status = 0;
//reserve l'espace memoire pour le nom du projectile 1
char name[256];
//reserve pour le nom du projectile 2
char name2[256];
//reserve pour le mot "bullet"
char cbuf[256];
//incrémente le compteur de projectiles
nbr = nbr +1;
//crée le nom du 1er vaisseaux projectile
sprintf(cbuf, "%d", nbr); //stocke dans cbuf le n°
strcat (cbuf, "bullet"); //concaténe le n° et "bullet"dans la méme chaine cbuf
strcpy (name, GetName());
strcat (name, cbuf);
//concaténe le n° nom du vaisseaux tirreur et cbuf
//le nom "name" du premier projectile sera monvaisseauXbullet
oapiCreateVesselEx (name, "bullet", &vs); //utilise le Dll "bullet" pour créer le projectile
OBJHANDLE hV = oapiGetVesselByName (name); // handle hv du projectile
VESSEL *v = oapiGetVesselInterface (hV); // capture l'interface du projectile créé
v->SetThrusterGroupLevel (THGROUP_MAIN, 1.0); //télécommande l'allumage du 1er projectile

//rotation de 180° pour que le second ne parte pas en marche arriére
Local2Rel (ofs2, vs.rpos);
vs.arot.z -= 2*PI;
//incrémente le compteur de projectiles
nbr = nbr +1;
sprintf(cbuf, "%d", nbr);
strcat (cbuf, "bullet");
strcpy (name2, GetName()); strcat (name2, cbuf);
//le nom "name2" du 2éme projectile sera monvaisseauX+1bullet
oapiCreateVesselEx (name2, "bullet", &vs);
OBJHANDLE hV2 = oapiGetVesselByName (name2);
VESSEL *v2 = oapiGetVesselInterface (hV2);
v2->SetThrusterGroupLevel (THGROUP_MAIN, 1.0); //télécommande l'allumage du 2éme projectile
}

le resultat
http://www.dailymotion.com/korben62/video/2988683

pour le code du bullet et le code de tir, voir treads:
Orbiter aux pruneaux !!!
LETHAL BULLET
Star Wars The Final Battle

Je suis assez étonné que personne encore ne l'ai encore exploité




Offline cslevine

  • Legend
  • ******
  • Posts: 3621
  • Karma: 17
Reply #14 - 03 June 2012, 12:27:17
et imaginons le jour où l'on pourrait installer même simplement des genres de "plateformes" en hauteur,
sous forme de meshs simple :
on pourrait ainsi se poser en vertical par exemple sur le toit d'un immeuble.

et ce sans devoir utiliser Orulex - au comportement assez aléatoire

Bon ça serait sous l'ajout d'une balise quelconque dans un ficher de base
genre "SOLIDCUBE" avec des coordonnées + une hauteur donnée.

ça permettrait des petits défis supplémantaires


« Last Edit: 03 June 2012, 12:27:17 by cslevine »