besoin d'idee pour réaliser deux actions.

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
UnityNoobUser
Messages : 20
Inscription : 21 Fév 2021 14:54

besoin d'idee pour réaliser deux actions.

Message par UnityNoobUser » 24 Avr 2021 15:14

Salut ,

je fais encore appel a votre aide car je me casse les dents sur deux actions a réaliser mais je ne sais pas comment m'y prendre.

dans mon petit jeux, j'instancie un vaisseau qui part d'une planète A et qui se translate vers une planète B pour l'attaquer et la conquérir.
mon premier prb est le suivant . selon la position orbital de mes deux planètes A et B, il se peut que celles ci soit alignées avec l'étoile centrale (le soleil) et comme mon ou mes vaisseaux font une ligne droite entre les deux planètes il arrive que la trajectoire traverse le soleil ce qui n'est pas très réaliste puisque le vaisseau passe à travers la sphère "soleil".
Comment feriez vous pour lui indiquer qui si il est a une certaine distance du soleil il doit faire une rotation autour puis reprendre la trajectoire initiale ?

Code : Tout sélectionner

// Update is called once per frame
    void Update()
    {
        transform.LookAt(target.transform); // axe Z du Spacecraft en direction de la target

        trajectoire = target.transform.position - transform.position; // calcul de la trajectoire

        if (distanceToPlanet0 <= 6.0f)
        {
            gameObject.transform.RotateAround(planet0.transform.position, new Vector3(x_vector, y_vector, z_vector), 15 * Time.deltaTime);
        }
        else
        {
            transform.Translate(trajectoire.normalized * speed * Time.deltaTime, Space.World); // deplacement vers la target
        }
la bien entendu le vaisseau lorsque qu'il est à la distance indiquée tourne indéfiniment autour du soleil. je pourrai éventuellement lui indiquer de réaliser cette action un certain temps avant de reprendre la trajectoire initiale ce qui permettrait de dévier suffisamment pour ne pas traverser le soleil mais si vous avez une idee pour réaliser cela plus proprement je suis preneur ;)

et second point c'est que bien entendu comme il y a un lookat dans la direction de la target lorsqu'il commence sa rotation autour du soleil, le nez du vaisseau ne pointe plus dans la direction dans laquelle il avance (mais tjrs en direction de la target) et il fait donc un déplacement en crabe ce qui n'est pas très réaliste non plus :(. comment puis je faire pour que l'axe z du vaisseau soit dans le sens de son déplacement lors de cette rotation orbitale temporaire ?)

auriez vous un ou des suggestion à me faire pour m'aidez ?

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 24 Avr 2021 22:37

Bonsoir,

j'ai supposé que les planètes et le soleil sont fixes.

1er problème : éviter le BBQ. Soient A et B les 2 planètes, et S le soleil. On définit D la distance de sécurité autour du soleil.
- j'ajoute un SphereCollider au soleil, dont le rayon est D +Rsoleil.
- je calcule un rayon entre A et B, et je teste avec Collider.Raycast, le collider étant le SphereCollider du soleil. S'il y a une collision, je récupère les coordonnées du point P1, et je lance un second rayon depuis ce point vers la planète B : s'il n'y a pas de collision, c'est que le rayon a tangenté le sphère collider, et j'ignore. S'il y a une collision, je récupère les coordonnées du point P2. Dans ce cas, la trajectoire est le segment [A, P1], puis la courbe (P1,P2), puis le segment [P2,B]. La courbe peut être calculée rigoureusement (intersection du plan ABS et du sphereCollider, soit un cercle), il faut prendre (dans le bon sens) l'arc (P1,P2) sur ce cercle.

2ème problème : LookAt. Je ne comprends pas trop la question, il doit être possible de désactiver le lookAt quand le vaisseau évite le soleil ? A dire vrai, je ne comprends pas l'intérêt du tout. On voyage de A à B, pourquoi regarder B en permanence, puisqu'on on y va tout droit ? A la limite, un lookAt au début du voyage et c'est bon ?

A noter que le calcul est effectué une seule fois au départ du coup. J'utiliserais des coroutines pour gérer le voyage.

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 24 Avr 2021 23:06

Si les planètes bougent, c'est moins facile : je suppose que le mouvement des planètes est géré avec la physique ?

On reprend la même idée : le SphereCollider autour du soleil, mais on calcule dans l'Update (ou mieux une coroutine), et on se base sur le vaisseau et on tient à jour un angle de déviation D par rapport à la direction du vaisseau vers B.
  • D = 0, alpha = 0
  • tir du rayon entre le vaisseau et B
    • 0 ou 1 collision : si D <= 0, on return, sinon D -= alpha
    • 2 collisions :
      • on calcule alpha l'angle entre le soleil, le vaisseau et B
      • D += alpha
On ne fait ce calcul que tous les 100 ou 200 update (dépend de la vitesse du vaisseau)
On peut lisser en ajoutant une partie de l'angle (1/2 ? 1/4 ?)
Dernière édition par jmhoubre le 24 Avr 2021 23:46, édité 1 fois.

UnityNoobUser
Messages : 20
Inscription : 21 Fév 2021 14:54

Re: besoin d'idee pour réaliser deux actions.

Message par UnityNoobUser » 24 Avr 2021 23:38

les planètes A et B sont en mouvement orbitale sur des axes et des vitesses différentes autour du soleil . seul le "soleil" est fixe.

merci pour la suggestion de Collider.Raycast qui peut me permettre de vérifier si collision avec un collider sur le soleil.
mais je ne comprend pas trop le reste de ta suggestion:

Code : Tout sélectionner

private void Update ()
{
	// tir du rayon entre le vaisseau et B : > donc je vérifie avec Collider.Raycast si collision ou pas.
	// 0 collision > si pas de collision on est content le trajet est simple ^^
	{
		// On repart vers B > on continu vers B (avec le lookat et un translate)
 		 lookAt
		translate de forward local
	}
	// 1 collision on ignore > si 1 collision on ignore ? je ne comprend pas cette idée de une ou deux collision. si il n'y a qu'une collision alors c'est une tangente au collider et donc le vaisseau ne traverse pas le soleil ? donc le Collider.Raycast indique le nb de collision avec des colliders. ok vais regarder
	// 2 collisions on évite > c'est la que ça se complique  ::d 
		{
			// calcul de l'angle entre le soleil et B > je ne vois pas comment calculer un angle. le vaisseau , le soleil  et la planete B sont quasi alignés
			// On part vers B en ajoutant l'angle > je ne sais pas comment écrire ça en c#  :triste1: 
		}
}

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 24 Avr 2021 23:48

Je n'avais pas fini :lol:
Je me suis fait une diapo powerpoint pour mieux voir ce que j'imaginais...(mais ca reste en 2D).
La c'est bon j'ai mis à jour.
Je vais voir demain si je peux coder mes élucubrations...

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 24 Avr 2021 23:53

Une des diaps, j'espère que cela aidera un peu :
Image

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 24 Avr 2021 23:57

UnityNoobUser a écrit :
24 Avr 2021 23:38
// calcul de l'angle entre le soleil et B > je ne vois pas comment calculer un angle. le vaisseau , le soleil et la planete B sont quasi alignés
Vector3.angle devrait résoudre ceci.

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: besoin d'idee pour réaliser deux actions.

Message par jmhoubre » 25 Avr 2021 00:04

Idéalement, il me faudrait le code du mouvement de la planète B (je risque de faire différemment).
Je pense que je peux me passer de A (une fois que le vaisseau a décollé, on se moque bien de A, non ?)

Répondre

Revenir vers « Scripting »