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

JavaScript Discussion :

Réalisation d'un "pseudo" système solaire


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 50
    Points
    50
    Par défaut Réalisation d'un "pseudo" système solaire
    Bonjour,

    Je dois réaliser pour un de mes projet, un pseudo système solaire. Pour le moment tout se passe bien, mes sphères sont la, sont en mouvement. Mais une d'elle doit tourner autour de ma sphere centrale. J'arrive à la faire tournée de haut en bas, de droite à gauche, mais pas en diagonale comme on me le demande (je transmets une image pour bien montrer le chemin voulu).

    Chemin voulu (chemin en rouge) :
    Nom : chemin.jpg
Affichages : 689
Taille : 16,5 Ko

    EDIT : Pour vous éclairer dans ma demande, je vous transmets le code nécessaire, j'ai essayé de retirer le code superflus.

    Voici mon HTML :
    Code html : 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
    <head>
    	<meta charset="UTF-8">
    	<title>Projet</title>
     
    	<link rel="stylesheet" href="style.css">
    	<!-- <link rel="stylesheet" media="screen and (max-height: 750px)" href="style/style_tab.css" /> -->
     
    	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
    	<script type="text/javascript" src="javascript/jquery.js"></script>
    	<script type="text/javascript" src="javascript/sphere_un.js"></script>
     
     
    </head>
    <body>
     
    	<div class="menuSphere">
    		<div class="sphere_un"><canvas id="sphere_un" width="170" height="170" onClick="reseau();"></canvas></div>
        	<div class="sphere_deux"><canvas id="sphere_deux" width="120" height="120"></canvas></div>
        	<div class="sphere_trois"><canvas id="sphere_trois" width="110" height="110"></canvas></div>
    		<div id="sphere_centrale"><img src="images/planete.png" alt="Monde D2SI" class="sphere_centrale"></div>
    	</div>
     
     
     
        <div id="footer"></div>
     
           <script type="text/javascript" src="javascript/javascript.js"></script>
    </body>

    Voici mon code JavaScript (jvascript.js) :
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    var interval_zero 		= setInterval(mouvSphere_centrale,80);
    var autreInterval 		= setInterval(imgCercle_sphereUn, 30);
     
    // Récupération de la position du body
    var pBody = $('body').offset();
     
    // =================================================================================================================================
    // =================================================	SPHERE CENTRALE 	========================================================
    // =================================================================================================================================
     
    // Définition des variables utilies pour le mouvement de la sphere centrale
    var x0,y0,direction0;
    // Récupération de la position de la sphère centrale
    x0 = $('#sphere_centrale').offset();
    // Initialisation de la variable top_centrale avec la valeur de l'offset TOP de la sphere centrale
    top_centrale = x0.top;
    // Initialition de la variable direction0 permettant de faire bouger la sphere ou vers le haut ou vers le bas
    direction0 = 1;
     
    // Appel de la fonction mouvSphere_centrale() permettant le mouvement de la sphere centrale
    function mouvSphere_centrale(){
    	var c;
     
    	// Si la mouvement varie de +2 à +5 ou de -2 à -5, alors le mouvement se fait plus lementement
    	if(x0.top >= (top_centrale+2) && x0.top <= (top_centrale+5) || x0.top >= (top_centrale-5) && x0.top <= (top_centrale-2)){
    		c = 0.5;
    	} else {
    		c = 1;
    	}
     
    	// Si la position atteint position+5 ou position-5, alors on change la direction du mouvement
    	if(x0.top >= (top_centrale+5) && direction0 == 1){
    		direction0 = -1;
    	} else if(x0.top == (top_centrale-5) && direction0 == -1){
    		direction0 = 1;
    	}
     
    	// On attribue la nouvelle position suivant le mouvement à la variable x0.top
    	x0.top = parseFloat(x0.top)+(c*direction0);
     
    	// On envoi au CSS la nouvelle position de la sphere
    	$('.sphere_centrale').css('top', x0.top);
    }
     
    // ================================================================================================
    // =====================================	SPHERE UN 	===========================================
    // ================================================================================================
    var p1,top_un,left_un,direction1;
    p1 = $('#sphere_un').offset();
    top_un = p1.top;
    left_un = p1.left-pBody.left;
    direction1 = 1;
     
    function mouvSphere_un(){
    	var i;
     
    	if(p1.top >= (top_un+6) && p1.top <= (top_un+9) || p1.top >= (top_un-9) && p1.top <= (top_un-6)){
    		i = 0.5;
    	} else {
    		i = 1;
    	}
     
     
    	if(p1.top >= (top_un+9) && direction1 == 1){
    		direction1 = -1;
    	} else if(p1.top == (top_un-9) && direction1 == -1){
    		direction1 = 1;
    	}
     
    	p1.top = parseFloat(p1.top)+(i*direction1);
    	p1.left = parseFloat(left_un)+(i*direction1);
     
    	$('#sphere_un').css('top', p1.top);
    	$('#sphere_un').css('left',p1.left);
    }
    // ================================================================================================
     
    var angleIMG_un = 0;
    s1_width = $('#sphere_un').width();
    s1_height = $('#sphere_un').height();
     
     
    s0_width = $('#sphere_centrale').width();
    s0_height = $('#sphere_centrale').height();
    pos_rel_s1 = $('#sphere_un').offset();
    var pos_temp = pos_rel_s1.left;
    var flag = true;
     
    function imgCercle_sphereUn(){
    	s1_pos = $('#sphere_un').offset();
    	s0_pos = $('#sphere_centrale').offset();
     
    	$("#sphere_un").css({
    		// left:parseInt(330 + (s1_width/20) * Math.cos(angleIMG_un)),
    		left:pos_temp,
    		top:parseInt((top_un-70) + ((s0_height/2)-80) * Math.sin(angleIMG_un))
    	});
     
     
    	if(s1_pos.top > 250){
    		$('#sphere_un').css('width',(s1_width-=0.6)+'px');
    		$('#sphere_un').css('height',(s1_height-= 0.6)+'px');
    	} else if(s1_pos.top <= 250){
    		$('#sphere_un').css('width',(s1_width+=0.6)+'px');
    		$('#sphere_un').css('height',(s1_height+= 0.6)+'px');
    	}
     
    	if(s1_pos.top >= parseInt(top_un+190)){
    		$("#sphere_un").css('z-index',0);
    	} else if(s1_pos.top <= parseInt(top_un-330)){
    		$("#sphere_un").css('z-index',10);
    	}
     
    	if(s1_pos.top >= 280 && s1_pos.top <= 320 && $("#sphere_un").css('z-index') == 0){
    		$("#sphere_un").css('width','70px');
    		$("#sphere_un").css('height','70px');
     
    		s1_width = 70;
    		s1_height = 70;
    	}
     
    	angleIMG_un += 0.015;
     
    	if(flag){	pos_temp+=2 	} else {	pos_temp-=2;	}
    	if(pos_temp >= 700){	flag = false;	} else if(pos_temp <= 0){	flag = true;	}
    }
     
    $(window).load(function(){
    	setTimeout("clearInterval(" + autreInterval + ")", 1000000);
    });
    Pourriez vous m'aider pour faire en sorte que ma sphère prenne le chemin voulu, ou m'orienter pour que je puisse le réaliser. Je ne suis pas super calé en JavaScript, donc peut être que des choses sont manquantes ou mal réalisés, désolé

    Par avance merci

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Salut !

    J’ai à peine regardé ton code car tu utilises la manipulation de style pour le rendu et ça me pique les yeux ! ce genre de réalisation mériterais d’utiliser une techno vectorielle ( le top aurait été WebGL)

    Je vais donc t’aiguiller sur une solution mathématique en utilisant l’algèbre des Quaternion !
    Pourquoi les quaternions, car c’est un modèle mathématique peu connus du commun des développeurs et que je trouve ça injuste

    Bon commençons par exprimer les positions en 3D des 2 satellites par rapport au repère de ta sphère centrale, elles sont opposés et équidistantes, cela donne, alignée par défaut sur l’axe X :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var posSatA = { x: -D , y : 0,  z : 0 };
    var posSatB = { x:  D , y : 0,  z : 0 };
    A chaque frame de rendus il est juste nécessaire de réorienté les positions par un quaternion ! Pour vulgariser, un quaternion représente un axe 3D à partir duquel on applique un angle de rotation , au vue de ton image , l’axe de rotation serait incliné en profondeur vers la gauche donc ce vecteur { x : -1 , y : 1 , z : 1 } mais normalisé !

    Donc la fonction render ressemblerait à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function render()
    {
    	requestAnimationFrame(render);
     
    	renderMainSphere();
    	var quat = new Quaternion({ x : -0.58, y : 0.58, z : 0.58 , angle : Date.now());
    	var psatA =  quat.multiply({ x: -D , y : 0,  z : 0 })
    	renderSatelitte(psatA)
    	var psatb =  quat.multiply({ x: -D , y : 0,  z : 0 })
    	renderSatelitte(psatb)
    }
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

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