编程知识 cdmana.com

Mouvement tridimensionnel de la terre, du ciel et de la lune basé sur three.js

Je participe au concours de contributions créatives de la mi - automne,Pour plus de détails, voir:Concours de contributions créatives de la mi - automne

Aperçu en ligne

Les jours ne donnent pas naissance à Newton,L'antiquité est comme une longue nuit —— Le Festival de mi - automne de Newton

1.Le monde réel

D'Aristote“Géocentrique”,A Copernic“Héliocentrique”,Encore à Newton“Gravitation universelle”,Jusqu'à Einstein“Théorie de la relativité”, L'humanité est de plus en plus consciente des lois du Mouvement des corps célestes . Et pour les systèmes à basse vitesse en général, ,Utiliser“Gravitation universelle” La description peut déjà être très précise .

1.1. Yin pousse les fruits

Si“ Yin pousse les fruits ”,“Cause”- Oui.“Gravitation universelle”,“Résultats”- Oui.“ La loi du Mouvement céleste ”, Donc dans la mise en œuvre du Code , Devrait simuler les corps célestes et les forces ,Pour obtenir“ La terre fait un mouvement elliptique autour du soleil ”,“ La lune se déplace aussi elliptiquement autour de la terre ”Conclusions.

Principes:

  1. Chaque instant , Chaque corps céleste a un état , Cet état comprend le vecteur de vitesse 、 Vecteur de position 、Qualité, etc..
  2. Note t 1 t_1 Le soleil du temps 、La terre、 L'état de la lune est S s u n 1 S e a r t h 1 S m o o n 1 S_{sun_1}、S_{earth_1}、S_{moon_1} .
  3. Calcul t 1 t_1 Le moment, La gravité de chaque corps céleste est raisonnable. , Comme la terre F e a r t h 1 F_{earth_1} ( Vecteur de la Force résultante du soleil et de la lune ),En ce moment, Pour obtenir l'accélération instantanée de la terre a e a r t h 1 = F e a r t h 1 / M e a r t h a_{earth_1} = F_{earth_1} / M_{earth} .
  4. Dans un très court laps de temps t △t On y est. t 2 t_2 Le moment,Par v e a r t h 2 = v e a r t h 1 + a e a r t h 1 t v_{earth_2} = v_{earth_1} + a_{earth_1} * △t ,Oui. t 2 t_2 L'état de la terre au moment S e a r t h 2 S_{earth_2} , Comme le soleil. 、La lune.
  5. Donc, à travers les itérations, , Pour simuler “Résultats”.

PS: On suppose que le monde est discontinu. , t △t C'est l'heure de Planck. 1 0 44 10^{-44} Secondes.

1.2. Laplace

Cette section est hors sujet.

Notre monde (L'univers) Essentiellement composé de particules ,Par“ Yin pousse les fruits ” Le principe de :

  1. Hypothèses t 1 t_1 Le moment, Monstre cosmique (Laplace) Connaître l'état actuel du Mouvement de toutes les particules .
  2. Donc, après une heure de Prak, t 2 t_2 , Laplace devrait être capable de calculer l'état actuel du Mouvement des particules .
  3. Itérations constantes, Laplace connaît le Mouvement des particules à tout moment dans le futur. .

Alors notre vie est sûre. , Parce que l'homme est fait de particules , Depuis votre naissance , L'état des particules est déterminé , Dans les yeux de Laplace , C'est le destin. .

Mais en raison de l'incertitude de la mécanique quantique, , Tout le monde a l'air d'avoir une chance. .Prends - le.“ Expérience d'interférence à double fente ”Dis.

 Interférence à double fente .jpg

Supposons que les franges interférentes représentent différentes classes , D'un point de vue probabiliste, , La probabilité de tomber dans la classe moyenne est plus élevée , Et cette probabilité est certaine . Parce que la lumière a la dualité onde - particule , Supposons que chacun de nous soit un photon. , Comment chaque photon peut - il savoir à quelle classe il appartient? ? Qui contrôle le destin des photons? ? C'est peut - être le plaisir de la vie. .

PS: Tu crois en la vie? ?

2. Monde simulé

Le monde réel est plus difficile à simuler avec le Code , Autant pousser les fruits avec des fruits. .

  1. La terre tourne autour du soleil. , La Lune tourne autour de la terre .
  2. Pour plus de simplicité , Changer le rail elliptique en cercle (Paresseux.).
  3. Il suffit donc d'utiliser l'équation conique pour décrire le mouvement d'un corps céleste. .

3. Classe céleste Star

La classe céleste est simplement définie comme suit:

class Star {
  name: string;
  image: any;
  raduis: number;
  position: number[];
  cita: number;
  T: number = 0;
  R: number = 0;
  mesh: any 
  constructor(
    name: string,
    image: any,
    raduis: number,
    position: number[],
    cita: number,
    T?: number,
    R?: number
  ) {
    this.name = name;
    this.image = image;
    this.raduis = raduis;
    this.position = position;
    this.cita = cita;
    this.T = T || 0;
    this.R = R || 0;
  }
}
Copier le Code
Propriétés Description
name Nom du corps céleste
image Images cartographiques
raduis Rayon céleste
position Position du corps céleste
cita Angle de rotation
T Période de révolution
R Rayon de rotation

Tableau de lune Tai Di

const stars = [
  new Star('Sun', require('./texture/sun.jpg'), 100, [0, 0, 0], 0),
  new Star(
    'Earth',
    require('./texture/earth.jpg'),
    50,
    [650, 0, 0],
    0,
    30,
    650
  ),
  new Star('Moon', require('./texture/moon.jpg'), 30, [800, 0, 0], 0, 5, 150),
];
Copier le Code

PS: Supposons que le soleil ne bouge pas. , Et occupe la place de Tianyuan [ 0 , 0 , 0 ] [0,0,0] .

4.SimpleSceneIntroduction

Parce que chaque fois que j'ai écrit sur three.jsApplication de, Toujours écrire le même code , Comme une caméra. 、Éclairage、Renderer, Il y a aussi des processus d'initialisation , J'ai donc écrit un article basé sur reactDenpmSacsimple-scene-react.

SimpleScene Lumière globale intégrée 、Caméra、Renderer, En plus du rendu .Peut passeruseDefaultLight={false} useDefaultCamera={false} Désactiver la configuration , Pour une utilisation spécifique, voir /example.

Exemple

Initialisation

Réplique officielle de l'échantillon

Terra Moon trisomic Movement

Carte Flying Line

PS:Bienvenue à tous.

5.Éclairage

SimpleScene Lumière ambiante globale intégrée new THREE.AmbientLight(0xffffff, 0.8), Pour simuler l'effet de la lumière du soleil ,In [ 0 , 0 , 0 ] [0,0,0] Ajout initial d'une source lumineuse ponctuelle , Pour une meilleure texture , Lumière horizontale ajoutée .

  const addLight = (scene: THREE.Scene) => {
    //  La lumière ambiante existe par défaut   new THREE.AmbientLight(0xffffff, 0.8);
    //  Si vous ne voulez pas l'utiliser  useDefaultLight = false
    // Source lumineuse ponctuelle
    let point = new THREE.PointLight(0xedf069, 2);
    point.position.set(0, 0, 0);
    scene.add(point);
    // Lumière directionnelle
    let directionalLight = new THREE.DirectionalLight(0xffffff, 0.4);
    directionalLight.position.set(600, 600, 600);
    scene.add(directionalLight);
  };
Copier le Code

addLightInbeforeRender Exécuter dans le rappel .

6.animateAnimation

animate Rappel à chaque fois requestAnimationFrameExécution intermédiaire.

 let delta = clock.getDelta();
Copier le Code

delta Intervalle par image ,Environ 1 / 60 0.0167 1/60≈0.0167

6.1. Autorotation

Pour la simplicité(Paresseux.), Chaque corps céleste a la même vitesse de rotation .

    stars.forEach(star => {
      if (star.mesh) {
        star.mesh.rotation.y += delta;
      }
    });
Copier le Code

6.2. La terre tourne autour du soleil

Parce que le mouvement xz En plan ,Alors...y Les coordonnées sont toujours 0. L'équation de coordonnées du cercle est : [ R c o s ( c i t a ) , R s i n ( c i t a ) ] [R*cos(cita),R*sin(cita)] , Cycle de rotation TCorrespondant à2*Math.PI, Changement à chaque cycle citaJuste la valeur.,Et puis seloncita Pour mettre à jour la position de la terre .

    //  La terre tourne autour du soleil 
    let earth = stars[1];
    if (earth.mesh) {
      earth.cita += (delta * 2 * Math.PI) / earth.T;
      earth.mesh.position.set(
        earth.R * Math.cos(earth.cita),
        0,
        earth.R * Math.sin(earth.cita)
      );
    }
Copier le Code

6.3. La Lune tourne autour de la terre

La position de la lune est relative à celle de la terre ,Alors...position Il faut ajouter une position terrestre .

    //  La Lune tourne autour de la terre 
    let moon = stars[2];
    if (moon.mesh) {
      moon.cita += (delta * 2 * Math.PI) / moon.T;
      moon.mesh.position.set(
        moon.R * Math.cos(moon.cita) + earth.R * Math.cos(earth.cita),
        0,
        moon.R * Math.sin(moon.cita) + earth.R * Math.sin(earth.cita)
      );
    }
Copier le Code

Code détaillé

7.Conclusion

Dieu dit:: Il doit y avoir une lune blanche sur terre. , Et puis il y a Newton. .

版权声明
本文为[Touffes terrestres]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210914164425958c.html

Scroll to Top