Aller au contenu


Collision explosion


  • Vous ne pouvez pas répondre à ce sujet
7 réponses à ce sujet

#1 olihya

    Ceinture Jaune

  • Members
  • 28 messages

Posté 18 août 2009 - 10:08

Bonjour,
J'aimerai déclencher une explosion lorsque mon vaisseau percute un obstacle dans ma scene3D.
Je me demande comment faire pour déclencher l'explosion au moment et à l'endroit de l'impact.
Voici le code que j'ai mis:

Lingo


global gModelPartSys
on createParticules me


sysPartRes = sprite(1).member.newModelResource("RSP",#particle)
sysPartRes.emitter.mode = #burst
-- vitesse min et max
sysPartRes.emitter.minSpeed = 20
sysPartRes.emitter.maxSpeed = 30
-- nombre de particules
sysPartRes.emitter.numParticles = 250
-- angle et direction
sysPartRes.emitter.angle = 20
sysPartRes.emitter.direction = vector(0,0,10)
-- gravité
sysPartRes.gravity = vector(0,-0.2,0)
-- durée de vie
sysPartRes.lifetime = 3000
-- degré d'oppacité
sysPartRes.blendRange.start = 50
sysPartRes.blendRange.end = 0
-- couleur
sysPartRes.colorRange.start = rgb(0,0,0)
sysPartRes.colorRange.end = rgb(255,0,0)
-- activer système de particule défini
sysPart = sprite(1).member.newModel("SP",sysPartRes)
syspart.transform.position=vector (0, -30, -500 )

end



Avez-vous une idée? icon_question.gif
Bonne soirée

#2 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 19 août 2009 - 07:29

Salut olihya,

Tout dépend du système de collision utilisé...
Mais normalement ils sont tous capable de détecter la collision (heureusement) et de te renvoyer le point de rencontre précis.
Si tu veux "refaire" un test après collision, tu peux facilement lancer un rayon (getModelsUnderRay()) du vaisseau A vers le vaisseau B et récupérer le point d'impact.

#3 olihya

    Ceinture Jaune

  • Members
  • 28 messages

Posté 19 août 2009 - 09:40

Citation (glurp @ Aug 19 2009, 08:29 AM)
Salut olihya,

Tout dépend du système de collision utilisé...
Mais normalement ils sont tous capable de détecter la collision (heureusement) et de te renvoyer le point de rencontre précis.
Si tu veux "refaire" un test après collision, tu peux facilement lancer un rayon (getModelsUnderRay()) du vaisseau A vers le vaisseau B et récupérer le point d'impact.

Salut Glurp,
Merci pour ta réponse. icon_idea.gif
Voici mon système de collision:

Lingo


-- Gestionnaire de contrôle des collisions
on GererCollision me
-- affectation à la variable "collisionList" du rayon lancé suivant -Z
collisionListe = Scene.modelsUnderRay(boite1.worldPosition,-boite1.transform.zAxis,#detailed)
-- Si le rayon rencontre un objet (détection d'une collision) alors appel du gestionnaire de collision
if (collisionListe.count) then
me.TestCollision(collisionListe[1])
end if
end

-- Gestionnaire de récupération des valeurs utiles de la collision
on TestCollision me, d1

-- affectation à la variable "dist1" de la distance de collision par rapport à l'objet
-- défini dans la liste de collision
dist1 = d1.distance
-- affectation à la variable "dist2" de de la distance de collision - la longueur de la boite "pBox"
dist2 = dist1 - Boite1.resource.length/2
-- envoie des valeurs vers les champs d'affichage "dist1" et "dist2" dans la scène
put dist1 into field "dist1"
put dist2 into field "dist2"
if dist2<30 then
sound(1).stop()

if value (field"champScore")> value (field "score5") then
sound(1).stop()
put value (field "champScore") into field "scoreObt"
put "" into field "nomJoueur"
go to frame 25
else
go to frame 23
end if
end if
end

Est-ce en utilisant #isectPosition? icon_question.gif
Mais avec #isectPosition cela donne le point central alors que l'obstacle occupe une surface.
De plus je me demande comment créer le système de particule uniquement au moment de l'impact? icon_question.gif
Cela revient à créer un objet pendant l'exécution de la scène.
Est-ce possible? icon_question.gif
Bonne journée




#4 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 19 août 2009 - 11:31

Oui, c'est bien isectPosition qui te renvoit (je cite) "la position du point d’intersection dans l’univers".
Et isectNormal la direction de ce vecteur.
Si isectPosition ne renvoit pas le point correct, vérifie si tu n'effectues pas tes tests sur des dummy qui n'ont pas tout à fait la même taille et forme que tes models.

Et pour les particules, tu peux bien sûr les créer à la volée, mais cela risque de faire "caler" le framerate sur les vieilles machines.

#5 olihya

    Ceinture Jaune

  • Members
  • 28 messages

Posté 21 août 2009 - 08:29

Citation (glurp @ Aug 19 2009, 12:31 PM)
Oui, c'est bien isectPosition qui te renvoit (je cite) "la position du point d’intersection dans l’univers".
Et isectNormal la direction de ce vecteur.
Si isectPosition ne renvoit pas le point correct, vérifie si tu n'effectues pas tes tests sur des dummy qui n'ont pas tout à fait la même taille et forme que tes models.

Et pour les particules, tu peux bien sûr les créer à la volée, mais cela risque de faire "caler" le framerate sur les vieilles machines.

Bonjour,
Merci pour ta réponse Glurp icon_biggrin.gif
En fait j'ai caché le système de particule dans la scène et je le déplace vers la collision:

Lingo


posVais = member("Scene").model("boite1").worldPosition
t1 = posVais.x
t2 = posVais.y
t3 = posVais.z-20

Member("Scene").model("explo").transform.position = vector(t1,t2,t3)
Mais maintenant, je suis confronté à un autre problème.
J'aimerai qu'il y est un petit temps d'attente le temps de bien voir l'explosion de particules avant de passer à la prochaine frame.
Avez-vous une piste icon_question.gif
Bonne journée

#6 olihya

    Ceinture Jaune

  • Members
  • 28 messages

Posté 21 août 2009 - 09:17

Citation (olihya @ Aug 21 2009, 09:29 AM)
Bonjour,
Merci pour ta réponse Glurp icon_biggrin.gif
En fait j'ai caché le système de particule dans la scène et je le déplace vers la collision:

Lingo


posVais = member("Scene").model("boite1").worldPosition
t1 = posVais.x
t2 = posVais.y
t3 = posVais.z-20

Member("Scene").model("explo").transform.position = vector(t1,t2,t3)
Mais maintenant, je suis confronté à un autre problème.
J'aimerai qu'il y est un petit temps d'attente le temps de bien voir l'explosion de particules avant de passer à la prochaine frame.
Avez-vous une piste icon_question.gif
Bonne journée

Je pense que je me suis mal exprimé concernant le passage à la prochaine frame.
Voici le code:

Lingo


if dist2<20 then
member("Scene").model("boite1").translate(0,0,10)
posVais = member("Scene").model("boite1").worldPosition
t1 = posVais.x
t2 = posVais.y
t3 = posVais.z-20

Member("Scene").model("explo").transform.position = vector(t1,t2,t3)
sound(1).stop()

if value (field"champScore")> value (field "score5") then
sound(1).stop()
put value (field "champScore") into field "scoreObt"
put "" into field "nomJoueur"
go to frame 25
else
go to frame 23
end if
end if
end
Lorsque la collision est détectée, je déplace l'explosion à l'endroit de l'impact.
Ensuite j'arrête le son et renvoi sur les frames concernant le score.
Mais j'aimerai faire une temporisation avant que cela renvoi sur les frames de "score" afin de bien voir l'explosion de particules.
Quelle est la meilleure méthode icon_question.gif

#7 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 21 août 2009 - 07:44

Salut,

Tu as deux possibilités ;

- Soit tu crées un compteur qui s'inscrémente (si tu as 25 i/s, compte 40 millisecondes par frame, donc pour deux seconde d'attente tu incrémentes jusqu'à 50)
- Soit tu utilises un "objet de temporisation", càd un timeout qui, au bout de 2000 millisecondes, appelle une fonction contenant ton dernier "if"

Lingo



on enterFrame me

if dist2<20 then
member("Scene").model("boite1").translate(0,0,10)
posVais = member("Scene").model("boite1").worldPosition
t1 = posVais.x
t2 = posVais.y
t3 = posVais.z-20

Member("Scene").model("explo").transform.position = vector(t1,t2,t3)
sound(1).stop()

new timeout("monTimeOut", 2000, #goToScore, me)

end if

end

on goToScore me

if value (field"champScore")> value (field "score5") then
put value (field "champScore") into field "scoreObt"
put "" into field "nomJoueur"
go to frame 25
else
go to frame 23
end if

timeout("monTimeOut").forget

end



#8 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 24 août 2009 - 06:58

Citation (glurp @ Aug 19 2009, 04:01 PM)
Et pour les particules, tu peux bien sûr les créer à la volée, mais cela risque de faire "caler" le framerate sur les vieilles machines.


Pour des particules codé maison, tu peux essayer avec un meshDeform qui fait bouger des petits carrés, ça évitera de faire ramer le cpu avec une tonne d'appels de shader.

Tu transformes la vertexList du mesh en une seule opération avec les opérations sur les list (tu crées une liste de même taille avec les vecteurs accélération et une autre avec les vecteurs vitesse), il n'y a aucune boucle de calcul à faire ça va donner un truc genre

-- accélérationList préparée: une suite de vector(0,0,-gravite)
-- positionList préparée: une copie de la vertexList du mesh
-- speedList initiale préparée: vecteurs vitesses générés avec un algo (genre random, etc)

-- sur chaque enterFrame:

speedList = accelerationList + speedList -- on incrémente les vecteurs vitesse
positionList = speedList + positionList -- on incrémente les vecteurs position
explosion.meshDeform.mesh[1].vertexList = positionList -- on update la vertexList







1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS - Tel. 0826 466 613 - Fax. 01 72 70 31 38

FFP