IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Newton Discussion :

[Newton] Camera controlé par les forces


Sujet :

Newton

  1. #1
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut [Newton] Camera controlé par les forces
    Bonjour à tous,

    Je suis en train de faire une camera controlé par les forces comme me l'a conseillé bafman dans un autre post. J'ai donc englobé ma camera par une sphere. Tant que la sphere n'est pas dans sont etat d'equilibre, j'arrive à la controler. Mais dès que cet etat est atteint, je n'arrive pas à faire rappliquer une force à la sphere. Or cet etat peut arriver assez souvent vu qu'au final la sphere sera controlé par le clavier. Si l'utilisateur n'appuie sur aucune touche, la sphere ne doit pas bouger.

    En ecrivant ce post, j'ai découvert un autre probleme lié au déplacement de ma sphere. Lorsque j'appuie sur une touche du clavier, j'applique une force à la sphere. Ca a pour consequence de la déplacer. Lorsque je relache la touche, la sphere devrait s'arreter mais elle continue sa course jusqu'a rencontrer un objet. Je précise que ma sphere est en l'air et ne touche pas le sol.

    Donc voila je cherche des solutions ou des pistes pour ces 2 problemes.

    Merci

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    la camera doit elle accélérer progressivement de 0 à 100km/h, ou doit elle passer directement de 0 à 100 km/H ?
    je dirais la 2ième car tu dis qu'elle doit s'arréter net quand on lâche l'accélérateur

    dans ce cas il faut simplement modifier la linearvelocity et ne pas utiliser de force

    (les forces appliquent une accélération qui fait augmenter linéairement la vitesse)

    j'ai trouvé: il y a la fonction NewtonBodySetVelocity

  3. #3
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par acx01b Voir le message
    la camera doit elle accélérer progressivement de 0 à 100km/h, ou doit elle passer directement de 0 à 100 km/H ?
    je dirais la 2ième car tu dis qu'elle doit s'arréter net quand on lâche l'accélérateur

    dans ce cas il faut simplement modifier la linearvelocity et ne pas utiliser de force

    (les forces appliquent une accélération qui fait augmenter linéairement la vitesse)

    j'ai trouvé: il y a la fonction NewtonBodySetVelocity
    J'ai viré mes forces et les ai remplacé par une velocity mais je vois pas trop la différence. Ma sphere continue de se déplacer tant qu'elle ne rencontre pas d'osbtacles.

  4. #4
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    touche haut enfoncée: setvelocity(100)
    touche haut relachée: setvelocity(0)

    normalement la camera ne devrait pas bouger si aucune force n'est appliquée et que sa vitesse est 0

  5. #5
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    ce que j'avais fait sur un projet (avec ODE mais ce ne change pas grand chose), c'est que tant que la camera touche une surface avec une normale vers le haut (donc le sol), je remettais la vitesse à 0 et j'appliquais une force pour déplacer la sphère. par contre, si la sphère ne touche pas le sol, alors je laissait la vitesse, comme ca, la sphère pouvait chuter.

  6. #6
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par acx01b Voir le message
    salut

    touche haut enfoncée: setvelocity(100)
    touche haut relachée: setvelocity(0)

    normalement la camera ne devrait pas bouger si aucune force n'est appliquée et que sa vitesse est 0
    Merci ca marche nickel.

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par drcd Voir le message
    Merci ca marche nickel.
    mais ca ne prend pas en compte la notion de chute de la camera

  8. #8
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    C'est bon j'ai fini ma camera.
    Elle gere les deplacement à pieds(strafing comprit), le saut l'accroupi.

    Pour la faire, j'ai d'abord créé 2 material (un pour la sphere, un pour la map). Voici les valeurs que j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Collidable = 1
    Softness=0.5
    Elasticity=0.0
    Friction static=0.3
    Friction dynamique=0.25
    Dans la callback OnApplyForceAndTorque, je defini un vecteur force comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float force[3]={0.0f,-fMasse*9.81,0.0f};
    Lorsqu'une des touche qui controle la camera est pressée, j'ajoute un 2e vecteur force à celui ci. Ca me permet de ne gerer qu'une seule force tout en conservant les déplacement en diagonale.
    Lorsqu'aucune touche n'est pressée, je place la velocity à 0en x et en z.

    Voila le code complet de la fonction, ca peut toujours servir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    float fMasse;
    	float InertieX,InertieY,InertieZ;
     
    	NewtonBodyGetMassMatrix (m_pBody, &fMasse, &InertieX, &InertieY, &InertieZ);
     
    	float force[3]={0.0f,-fMasse*9.81,0.0f};
     
    	GSEPOINT3D Direction=GSECamera->GetVectorDirection();
     
    	//Gestion des deplacement à terre
    	if(GSEKeyboard->IsPressed(KeyboardUp))
    	{
    		force[0]+=Direction.x*WalkingSpeed;
    		//force[1]=Direction.y*1000000.0;
    		force[2]+=Direction.z*WalkingSpeed;
    	}
     
    	if(GSEKeyboard->IsPressed(KeyboardDown))
    	{
    		force[0]+=Direction.x*(-1*WalkingSpeed);
    		//force[1]=Direction.y*(-1000000.0);
    		force[2]+=Direction.z*(-1*WalkingSpeed);
    	}
     
    	GSEPOINT3D tmp;
    	tmp.CrossProduct(Direction,GSEPOINT3D(0.0,1.0,0.0));
     
    	if(GSEKeyboard->IsPressed(KeyboardLeft))
    	{
    		tmp*=-1;
    		force[0]+=tmp.x*(WalkingSpeed);
    		//force[1]=tmp.y*(1000000.0);
    		force[2]+=tmp.z*(WalkingSpeed);
    	}
     
    	if(GSEKeyboard->IsPressed(KeyboardRight))
    	{
    		force[0]+=tmp.x*(WalkingSpeed);
    		//force[1]=tmp.y*(1000000.0);
    		force[2]+=tmp.z*(WalkingSpeed);
    	}
     
    	//Gestion du saut
    	float vel[3];
    	vel[0]=0.0;
    	vel[1]=0.0;
    	vel[2]=0.0;
     
    	GSEMATRIX4X4 matrice;
    	NewtonBodyGetMatrix(m_pBody,&matrice.entries[0]);
     
    	if(matrice.entries[13]>=JumpHeightMax)
    	{
    		Wait=true;
    	}
     
    	if(matrice.entries[13]<=MinHeight)
    	{
    		HasJumped=false;
    		Wait=false;
    	}
     
    	if((GSEKeyboard->IsPressed(KeyboardJump))&&(matrice.entries[13]<JumpHeightMax)&&(!Wait))
    	{
    		force[0]+=JumpForce.x;
    		force[1]+=JumpForce.y;
    		force[2]+=JumpForce.z;
    		HasJumped=true;
    	}
     
    	if(HasJumped)
    	{
    		vel[0]=GravityForce.x;
    		vel[1]=GravityForce.y;
    		vel[2]=GravityForce.z;
    	}
     
    	//Gestion du crounch
    	if((GSEKeyboard->IsPressed(KeyboardCrounch))&&(matrice.entries[13]>=CrounchHeightMin))
    	{
    		force[0]+=CrounchForce.x;
    		force[1]+=CrounchForce.y;
    		force[2]+=CrounchForce.z;
    		IsCrounch=true;
    	}
     
    	if((!GSEKeyboard->IsPressed(KeyboardCrounch))&&(IsCrounch))
    	{
    		vel[0]=GravityForce.x;
    		vel[1]=-1.0*GravityForce.y;
    		vel[2]=GravityForce.z;
    	}
     
    	if(matrice.entries[13]>=MinHeight)
    	{
    		IsCrounch=false;
    	}
     
    	if((!GSEKeyboard->IsPressed(KeyboardUp))||
    	   (!GSEKeyboard->IsPressed(KeyboardDown))||
    	   (GSEKeyboard->IsPressed(KeyboardLeft))||
    	   (GSEKeyboard->IsPressed(KeyboardRight)))
    	{
    		NewtonBodySetVelocity(m_pBody,&vel[0]);
    	}
     
    	NewtonBodySetForce (m_pBody, force);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. controle des E/S par les systéme d'exploitation
    Par ilias20 dans le forum Windows
    Réponses: 1
    Dernier message: 24/03/2009, 11h39
  2. comment cree un trait controlé par les touches clavier
    Par Invité dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 20/11/2008, 15h32
  3. [VBA-E] Modifier les propriétés d'un control par une routine
    Par formath dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/03/2007, 10h45
  4. Copies de flots en passant par les itérateurs
    Par Christophe Brun dans le forum C++
    Réponses: 7
    Dernier message: 02/07/2003, 11h41
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo