jeudi 17 novembre 2011

Comment sauver et ouvrir les préférences du joueur dans Unity?

Il existe deux méthodes dont je connais l'existence pour enregistrer des données dans Unity:
  • la classe PlayerPrefs de Unity;
  • le XML.
PlayerPrefs est idéal pour enregistrer une petite quantité de données. La taille maximale permise est de 1 MO. Le site d'Unity pour cette classe est:
http://unity3d.com/support/documentation/ScriptReference/PlayerPrefs.html .
Le XML est plus versatile que PlayerPrefs. Vous pouvez enregistrer la quantité d’informations que vous voulez avec le format que vous voulez. Je vous réfère à ce site si vous voulez plus d'information sur le XML avec Unity:
http://answers.unity3d.com/questions/8480/how-to-scrip-a-saveload-game-option.html .

Dans ce tutoriel, je vais me concentrer uniquement sur PlayerPrefs. Cette classe offre trois fonctions pour mémoriser des données: SetFloat, SetInt et SetString et trois fonctions pour lire: GetFloat, GetInt et GetString. Disons que dans notre jeu, nous voulons sauver le nom du joueur qui est stocké dans la variable playerName, le code C# sera:
 PlayerPrefs.SetString( "PlayerName", playerName );
Le premier paramètre est la clé qui va permettre de retrouver la valeur et le second, la variable que nous voulons enregistrer. PlayerPrefs est un dictionnaire. Nous lui fournissons une valeur et une clé. Pour lire le nom du joueur, le code est simplement:
 playerName  = PlayerPrefs.GetString( "PlayerName");
Il n'y a rien de plus à faire. Unity se charge automatiquement d'enregistrer dans un fichier les valeurs de PlayersPrefs lors de la fermeture du jeu, que ce soit sur Windows ou en mode Web. Par contre, il est possible de forcer l'enregistrement à l'aide de la fonction:
 PlayerPrefs.Save();
Passons à un exemple concret pour voir comment appliquer PlayerPrefs dans une application. Voici un simple cube avec un bouton qui change sa couleur aléatoirement:
Unity Web Player | WebPlayer
-->

Le bouton change la couleur du cube. Si vous rafraîchissez la fenêtre, le cube réapparaît avec la dernière couleur choisie. Voici le script utilisé:
 
using UnityEngine;
using System.Collections;

/**
 * Change the color of a cube and save the data using PlayerPrefs.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class StatsMenu : MonoBehaviour 
{
 //The current color of the cube.
 Color _current = new Color(1,1,1,1);

 // Use this for initialization
 void Start () 
 { 
  //Load the saved color.
  Load();
  
  //Change the shader to transparent diffuse.
  this.renderer.material.shader = Shader.Find("Transparent/Diffuse");
  
  //Apply the current color to our cube.
  this.renderer.material.color = _current;
 }
 
 /**
  * Show a button to change the color and 4 labels to show
  * the color RGBA component.
  */
 void OnGUI ()
 {
  GUI.BeginGroup( new Rect(50,50, 200,150) );
  GUI.Box( new Rect(0,0, 200,150), "Change Color" );
   
  if ( GUI.Button( new Rect( 10,25,100, 20), "Change Color" ) )
  {
   ChangeColor();
   AutoSave();
  }
  
  ShowColor();
  
  GUI.EndGroup();
 }
 
 /**
  * Show the current color used on your cube.
  */
 void ShowColor()
 {
  GUI.Label( new Rect( 10, 50, 150,20), "Red: " + _current.r );
  GUI.Label( new Rect( 10, 75, 150,20), "Green: " + _current.g );
  GUI.Label( new Rect( 10, 100, 150,20), "Blue: " + _current.b );
  GUI.Label( new Rect( 10, 125, 150,20), "Alpha: " + _current.a );
 }
 
 /**
  * Change the color to a random one.
  */
 void ChangeColor()
 {
  _current = new Color( Random.value, Random.value, Random.value, Random.value );
   
  this.renderer.material.color = _current;
 }
 
 /**
  * Save the color with the PlayerPrefs class.
  */
 void AutoSave()
 {
  PlayerPrefs.SetFloat( "Color_Red", _current.r );
  PlayerPrefs.SetFloat( "Color_Green", _current.g);
  PlayerPrefs.SetFloat( "Color_Blue", _current.b );
  PlayerPrefs.SetFloat( "Color_Alpha", _current.a );
 }
 
 /**
  * Load the color with the PlayerPrefs class.
  */
 void Load()
 {
  if ( PlayerPrefs.HasKey("Color_Red") )
  {
   _current.r = PlayerPrefs.GetFloat( "Color_Red" );
  }
  
  if ( PlayerPrefs.HasKey("Color_Green") )
  {
   _current.g = PlayerPrefs.GetFloat( "Color_Green");
  }
  
  if ( PlayerPrefs.HasKey("Color_Blue") )
  {
   _current.b = PlayerPrefs.GetFloat( "Color_Blue" );
  }
  
  if ( PlayerPrefs.HasKey("Color_Alpha") )
  {
   _current.a = PlayerPrefs.GetFloat( "Color_Alpha" );
  }
 }
 
}

Ce script est appliqué sur le cube. La classe PlayerPrefs est limitée dans ces capacités. Heureusement, il existe une extension nommée PlayerPrefsX qui étend les capacités de PlayerPrefs. Ce script est à l'adresse suivante:
http://www.unifycommunity.com/wiki/index.php?title=ArrayPrefs#C.23_-_PlayerPrefsX.cs .

Bonne programmation!

lundi 14 novembre 2011

Polyhedron Shower

Après avoir créé le code pour l’instanciation d'un cube, je n'ai pas pu m'arrêter et j'ai continué à ajouter du code. Voici le résultat:
-->

  • RandomObjectCreator.cs: crée les polygones à partir d'un tableau de Transform, les places de manières aléatoires et leurs donnent une vitesse et une rotation aléatoire.
  • RandomColorMaterial.cs: change la couleur et la transparence du matériel. Les belles couleurs viennent de se simple script!
  • Timer.cs: C'est une classe utilitaire qui indique si le délai est écoulé en appelant la fonction trigger.
  • PointLightAtCenter.cs: ce script ajoute une lampe au centre de mes polyèdres. Ce sont ces petites lampes qui ajoutent l'ambiance et font ressortir les couleurs.
  • BounceBack.cs: ce script inverse la vitesse des polyèdres lorsqu'il dépasse une certaine distance du centre.
RandomObjectCreator.cs

using UnityEngine;
using System.Collections;

/**
 * Choose randomly a polyhedron and instantiate it at a random position with
 * a random rotation. After that, add a RigidBody and assign a random force and
 * a random torque to move and rotate the polyhedron.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class RandomObjectCreator : MonoBehaviour 
{
 
 
 public Transform[] _prefab;
 public float _force = 10;
 public float _radius = 10;
 
 // Use this for initialization
 void Start () 
 {
  
 }
 
 // Update is called once per frame
 void Update () 
 {
  
  if ( Input.GetKey("space") )
  {
   //Create a random position.
   //The insideUnitSphere return a random position inside a sphere of radius 1.
   Vector3 rndPos = Random.insideUnitSphere * 10;
   
   //Create a random rotation.
   Quaternion rndRotation = Random.rotation;
   
   //Choose randomly between the array of object
   int choice = (int) Mathf.Floor(Random.Range( 0.0f, _prefab.Length -.0000001f ) );
   
   //Instantiate a new object at a random position with a random rotation.
   Transform newGameObj = Instantiate( _prefab[choice], rndPos, rndRotation) as Transform; 
   
   //Rename the game object.
   newGameObj.name = "Allo";
   
   //Add a rigid body to the object.
   newGameObj.gameObject.AddComponent();
   
   //Remove the gravity.
   newGameObj.gameObject.rigidbody.useGravity = false;
   
   //Change the mass of the object to 1.
   newGameObj.gameObject.rigidbody.mass = 1.0f;
   
   //Add a random impulse to the rigidbody.
   newGameObj.gameObject.rigidbody.AddForce(new Vector3( Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force) ), 
                                                 ForceMode.Impulse);
   
   //We add a random torque to the rigidbody to make him rotate!!!
   newGameObj.gameObject.rigidbody.AddTorque(new Vector3( Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force) ), 
                                                 ForceMode.Impulse);
  }
  else if ( Input.GetKey("q") )
  {
   Application.Quit();
  }
  else if ( Input.GetKeyDown("return") )
  {
   GameObject[] objs = GameObject.FindGameObjectsWithTag ("Block");
   foreach ( GameObject obj in objs)
   {
    Destroy(obj);
   }
  }
 }

}

Licence Creative Commons
RandomObjectCreator.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.  

RandomColorMaterial.cs

using UnityEngine;
using System.Collections;

/**
 * Randomly assign a color and an alpha to the material of the object.
 * 
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class RandomColorMaterial : MonoBehaviour
{

 
 // Use this for initialization
 void Start ()
 {
  
  Shader shader1 = Shader.Find("Transparent/Diffuse");
  
  this.renderer.material.shader = shader1;
  
  //Set the main color of the material
  this.renderer.material.color = CreateRandomColor();
  
 }
 
 private Color CreateRandomColor()
 {
  float r = Random.value;
  float g = Random.value;
  float b = Random.value;
  float a = Random.Range(.4f,1f);
  
  return new Color( r, g, b, a );
 }
}
Licence Creative Commons
RandomColorMaterial.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.

Timer.cs

using System;
using UnityEngine;

/**
 * Timer with a delay. When the delay is over by, the trigger properties will
 * return true.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
namespace Utils
{
 public class Timer
 {
  private float _timer;
  private float _delay;
  
  
  public void Start(  )
  {
   this.Reset();
  }
  
  public void Start( float delay )
  {
   _delay = delay;
   this.Reset();
  }
  
  public float time
  {
   set { _timer = value; } 
  }
  
  public float delay
  {
   get { return _delay; }
   set { _delay = value; }
  }
  
  public void Reset()
  {
   _timer = Time.time; 
  }
  
  public bool overBy
  {
   get { return (Time.time - _timer) >= _delay; }
  }
  
  public bool underBy
  {
   get { return (Time.time - _timer) < _delay; }
  }
  
  /**
   * When called, this properties return if the timer is overBy or underBy and
   * reset the timer.
   */
  public bool trigger
  {
   get
   {
    if ( overBy )
    {
     Reset();
     return true; 
    }
    else
    {
     return false;
    }
   }
  }
  
 } //End class
} //End namespace


Licence Creative Commons
Timer.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.
 
PointLightAtCenter.cs

using UnityEngine;
using System.Collections;

/**
 * Add a point like in the center of an object.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class PointLightAtCenter : MonoBehaviour
{
 public float _range = 5f;
 
 // Use this for initialization
 void Start ()
 {
  //Add a point light in the center of the object.
  Light spot = this.gameObject.AddComponent();
  spot.type = LightType.Point;
  spot.range = _range;
  spot.intensity = 2;
 }

}


Licence Creative Commons
PointLightAtCenter.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.
 
BounceBack.cs
 
using UnityEngine;
using System.Collections;
using Utils;

/**
 * Inverse the velocity of an object that is at a distance greater
 * than the specified radius.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class BounceBack : MonoBehaviour 
{
 
 public float _radius = 50;
 
 private Timer _timeToReturnBack = new Timer( );
 
 void Start()
 {
  _timeToReturnBack.Start( .2f );
 }
 
 // Update is called once per frame
 void Update () 
 {
  if ( this.transform.position.x * this.transform.position.x +
       this.transform.position.y * this.transform.position.y +
       this.transform.position.z * this.transform.position.z > _radius * _radius &&
       _timeToReturnBack.trigger )
  {
   this.rigidbody.velocity = -this.rigidbody.velocity;
  }
 }
}

Licence Creative Commons
BounceBack.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.

Comment instancier des objets dans Unity 3D?

Unity 3D est un engin de jeux complets avec un éditeur. Si Unity vous est totalement inconnu, je vous recommande de visiter leur site: http://unity3d.com/. Ce tutoriel assume que vous avez déjà un peu joué avec Unity 3D et que vous êtes familier avec l'interface. Les scripts sont en C#. Le but du tutoriel est d'apprendre à instancier des objets durant l'exécution du jeu et non dans l'éditeur.
L'éditeur d'Unity.
La première étape consiste à créer un nouveau projet dans Unity. Je l'ai appelé "RandomObjectsCreator". À la création du projet, Unity crée les répertoires Assets, Library et Temp. Le répertoire Assets sert de librairie pour les objets que nous ajoutons aux jeux. C'est le seul des trois répertoires que nous allons utiliser.

L'instanciation d'objet dans Unity se fait à l'aide de prefabs. Prefab est la version raccourcie de Préfabriquée. Le prefab est l'équivalent d'un plan de construction. L'objet a telle forme, telle couleur et va réagir de telle et telle façon dans telles et telles conditions. Une fois le prefab créé, il est possible de créer des milliers de versions du même objet à l'intérieur du jeu et chaque objet aura la forme et le comportement spécifié dans le prefab.

Pour créer un prefab, aller dans l'onglet Projet->click droit->Create->Prefab. Renommer ce prefab "Cube".
Menu pour la création d'un prefab.
L'icône du prefab est une boîte blanche vide. Cette icône indique que le prefab est vide. Pour le remplir, nous allons ajouter un cube à la scène. Dans le menu supérieur: GameObject->Create Other->Cube.
Création d'un cube dans Unity.
Dans le menu "Hierarchy", sélectionnez Cube et glissez le sur le prefab Cube. L'icône du prefab devient une boîte bleue, indiquant que le prefab contient un objet. Vous pouvez maintenant effacer le Cube de la scène. Si vous glissez le prefab Cube sur la scène, un cube apparaît! Magika!
Ajout d'un objet au prefab.
Il est temps de créer notre script. Dans le tab "Project", click droit->Create->C# Script. Nommons-le: "RandomObjectsCreator". En double cliquant sur le script, l'éditeur par défaut de Unity ouvre le script. Dans mon cas, c'est MonoDevelop qui est ouvert. Unity a créé automatiquement une classe nommée RandomObjectsCreator avec la fonction Start et la function Update:

using UnityEngine;
using System.Collections;

public class RandomObjectsCreator : MonoBehaviour 
{

 // Use this for initialization
 void Start () 
 {
 
 }
 
 // Update is called once per frame
 void Update () 
 {
 
 }
}

La classe hérite de la classe générique MonoBehavior. Les scripts attachés sur des objets dans la scène doivent obligatoirement hériter de MonoBehavior pour fonctionner. La classe MonoBehavior permet d'accéder aux propriétés et aux composants de l'objet auquel est attaché le script.

Le code pour instancier un prefab est:
Instantiate( _prefab, position, rotation);
La fonction Instantiate va créer un clone du prefab contenu dans la variable _prefab, l'afficher dans la scène à la position "position" avec la rotation "rotation" et va retourner une référence de l'objet avec le type Object. Le type Object est le type de base en C#. Dans le précédent code, nous n'avons pas mis de variable pour récupérer la référence à l'objet. Pour ce faire, le code sera:
Transform newGameObj = 
     Instantiate( prefab, position, rotation) as Transform; 
Transform est un type générique d'Unity qui permet d'accéder à toutes les propriétés de l'objet de la scène. Le as Transform est un casting. Instantiate retourne une référence de type Object. Or, nous voulons une référence de type Transform. Nous indiquons la transformation de la référence de type Object en une référence de type Transform avec le as Transform. Il est à remarquer que cette notation est identique à la suivante:
Transform newGameObj = 
     (Transform)Instantiate( _prefab, position, rotation); 
Personnellement, je préfère le as, car c'est plus proche de l'anglais que l'opérateur de casting avec parenthèse.

Pour faire apparaître un cube, le joueur doit peser sur la touche espace. Le code est entré dans la fonction Update qui est appelée chaque fois que l'écran est rafraichi. La commande nécessaire est:
Input.GetKey("space");
Cette fonction retourne vrai si la touche espace est enfoncée et faux autrement. La position de notre cube sera choisi aléatoirement dans une sphère d'un rayon déterminé par la variable _radius:
Vector3 rndPos = Random.insideUnitSphere * _radius;
et avec une rotation aléatoire:
Quaternion rndRotation = Random.rotation;
Le script complet est le suivant:
using UnityEngine;
using System.Collections;

public class RandomObjectsCreator : MonoBehaviour 
{
 public Transform _prefab;
 public float _radius = 10;
 
 // Update is called once per frame
 void Update () 
 {
  if ( Input.GetKey("space") )
  {
   //Create a random position.
   //The insideUnitSphere return a random position inside a sphere of radius 1.
   Vector3 rndPos = Random.insideUnitSphere * _radius;
   
   //Create a random rotation.
   Quaternion rndRotation = Random.rotation;
   
   //Instantiate a new object at a random position with a random rotation.
   Transform newGameObj = Instantiate( _prefab, rndPos, rndRotation) as Transform; 
  }
 }
}

Ce script doit être attaché à un GameObject dans la scène pour fonctionner. Nous allons créer un GameObject vide. Dans le menu GameObject->Create Empty.Un objet nommé GameObject est crée. Renommons le ObjectsCreator. Sélectionner ObjectsCreator et glisser le script RandomObjectsCreator dans l'onglet Inspector. Le script contient deux variables prefab, radius. Glisser le prefab Cube sur le none à droite de la variable prefab. Le nom Cube apparaît avec une icône de manipulateur 3D.
Ajout d'un script et assignation de la variable prefab aux prefab Cube.
Appuyer sur Play et ensuite sur la touche "espace". Des cubes vont apparaître aléatoirement à l'écran. Je vous recommande d'ajouter une lampe directionnelle dans la scène pour embellir votre rendu.
-->

Comment insérer un jeu Unity dans Blogger?

Lorsque je pose cette question sur Internet, je me retrouve sur des sites qui proposent des Gadgets à ajouter à Blogger. J'ai essayé plein de combinaisons et rien ne marche. Au final, la solution est simple. Lorsque vous compilez votre jeu sous Unity pour le Web, Unity crée un fichier .unity3d et un fichier .html. Le fichier .html contient ceci:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Unity Web Player | WebPlayer</title>
  <script type="text/javascript" src="http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject.js"></script>
  <script type="text/javascript">
  <!--
  function GetUnity() {
   if (typeof unityObject != "undefined") {
    return unityObject.getObjectById("unityPlayer");
   }
   return null;
  }
  if (typeof unityObject != "undefined") {
   unityObject.embedUnity("unityPlayer", "WebPlayer.unity3d", 680, 550);
   
  }
  -->
  </script>
  <style type="text/css">
  <!--
  body {
   font-family: Helvetica, Verdana, Arial, sans-serif;
   background-color: white;
   color: black;
   text-align: center;
  }
  a:link, a:visited {
   color: #000;
  }
  a:active, a:hover {
   color: #666;
  }
  p.header {
   font-size: small;
  }
  p.header span {
   font-weight: bold;
  }
  p.footer {
   font-size: x-small;
  }
  div.content {
   margin: auto;
   width: 550px;
  }
  div.missing {
   margin: auto;
   position: relative;
   top: 50%;
   width: 193px;
  }
  div.missing a {
   height: 63px;
   position: relative;
   top: -31px;
  }
  div.missing img {
   border-width: 0px;
  }
  div#unityPlayer {
   cursor: default;
   height: 550px;
   width: 550px;
  }
  -->
  </style>
 </head>
 <body>
  <p class="header"><span>Unity Web Player | </span>WebPlayer</p>
  <div class="content">
   <div id="unityPlayer">
    <div class="missing">
     <a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now!">
      <img alt="Unity Web Player. Install now!" src="http://webplayer.unity3d.com/installation/getunity.png" width="193" height="63" />
     </a>
    </div>
   </div>
  </div>
  <p class="footer">« created with <a href="http://unity3d.com/unity/" title="Go to unity3d.com">Unity</a> »</p>
 </body>
</html> 
Effacer les styles css, ils vont bousiller la mise en page de votre page. Dans Blogger, ouvrer un nouveau message et aller dans Modifier le code HTML. Coller ce code HTML (sans les styles). Une icône de Unity va apparaître, mais pas le jeu. Dans le code HTML, à l'endroit où est écrit:
if (typeof unityObject != "undefined") {
     unityObject.embedUnity("unityPlayer", "WebPlayer.unity3d", 680, 550);
}
remplacez "WebPlayer.unity3d" avec le lien Web où est hébergé votre jeu. Bon, si vous êtes comme moi, vous n'avez pas vraiment d'hébergeur, alors quoi faire? J'utilise Google Sites pour ce faire. Je me suis créé une page Web nommée FractalGameLab. Je vais dans Google Sites, dans les outils de gestion et j'importe le .unity3d. Je copie ensuite le lien pour télécharger la ressource et je remplace WebPlayer.unity3d par ce lien. Voilà! Le tour est joué. Pour prouver que ça marche, voici une démo de jeu que j'ai fait avec le livre de "Développez des jeux 3D avec Unity" par Will Goldstone.
Unity Web Player | WebPlayer
-->
Unity Web Player | WebPlayer

Quels sont les bons sites pour apprendre Blender?

Blender 3D est un logiciel Open Source de modélisation 3D. Ce logiciel est extrêmement puissant et permet de réaliser de superbes images de synthèse. De plus, il est possible d'y ajouter des greffons en Python et de programmer ces propres greffons! Pour vous mettre en appétit, voici un rendu que j'ai créé à partir d'un tutoriel avec Blender:
"Shaken, not stirred" martini dans Blender.

De tout les logiciels que j'ai utilisé dans ma vie, Blender est le plus difficile à apprendre. La difficulté principale consiste à apprendre les innombrables raccourcis clavier et de les utiliser dans le bon ordre. Blender utilise les trois boutons de la souris en combinaison des touches Ctrl, Shift et Alt. Au début, c'est extrêmement mêlant. Simplement bouger un cube est une tâche héroïque. Les raccourcis et les menus changent dépendant du contexte! Apprendre Blender est un peu comme réapprendre à taper au clavier. C'est difficile au début, mais une fois appris, le récompense est immense. Dans le cas de Blender, la récompense est une productivité considérablement accrue.

Pour débuté Blender, je vous recommande fortement de suivre la série de tutoriels par Neal Hirsig. Je dirais même que pour un débutant, ce tutoriel est essentiel et incontournable. Ces tutoriels ont une superbe progression commençant par la base de la manipulation des objets jusqu'à l'ajout des textures et des effets de particules. La coupe de Martini que j'ai créée vient d'un de ces tutoriels.

Par la suite, je recommande d'écouter les vidéos sur Blender Cookie. Le site possède des tutoriels sur la modélisation, la création de texture, la création de modèles pour Unity 3D, le scipting en Python dans Blender, etc. Le site est une ressource fantastique pour le débutant, tout comme pour le modeleur plus avancé.

Bonne modélisation à tous!

jeudi 25 août 2011

Comment publier du beau code dans Blogger?

Je voulais faire un tutoriel en ActionScript 3, lorsque j'ai réalisé que copier du code dans Blogger donne un résultat médiocre. Par exemple, si je prends un code en AS3 et que je le copie entre des balises <code>, j'obtiens le résultat suivant:
package
{
    import flash.display.Sprite;
    import flash.events.Event;
  
    /**
     * ...
     * @author
     */
    public class Main extends Sprite
    {
       
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
       
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
        }
       
    }
   
}

Le résultat est horrible! De plus, je n'ai pas la coloration syntaxique. Heureusement, un très dévoué codeur, M. Alex Gorbatchev, a développé un outil nommé Syntax Highlighter. Ce petit logiciel écrit en JavaScript lit le code entré entre des balises <pre>, le met en forme et le colorie en fonction du modèle de format choisi. Par exemple, si j'aime le code sous Eclipse, il est possible de lui dire d'afficher du code comme sous Eclipse. Le même code avec Syntax Highlighter ressemble à ceci:
package 
{
  import flash.display.Sprite;
  import flash.events.Event;
 
  /**
   * ...
   * @author
   */
  public class Main extends Sprite 
  {
  
    public function Main():void 
    {
      if (stage) init();
      else addEventListener(Event.ADDED_TO_STAGE, init);
    }
  
    private function init(e:Event = null):void 
    {
      removeEventListener(Event.ADDED_TO_STAGE, init);
      // entry point
    }
  } 
}
Quelle amélioration!

Pour installer SyntaxHighlighter, j'ai suivi les instructions de ce site: http://www.commonitman.com/2010/09/how-to-use-syntax-highlighter-3-in.html. La procédure est:
  1. Allez dans Blogger->Tableau de bord->Présentation
  2. Effectuez une copie de sauvegarde avec le lien "Télécharger le modèle dans son intégralité" (optionnel)
  3. Choisissez l'onglet "Modifier le code HTML"
  4. Cherchez la balise </head>
  5. Juste au-dessus de cette balise, copier le code suivant:
    <!-- Syntax Highlighter Additions START -->
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
     
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
     
    <script language='javascript' type='text/javascript'>
    SyntaxHighlighter.config.bloggerMode = true;
    SyntaxHighlighter.all();
    </script>
    <!-- Syntax Highlighter Additions END -->
    
  6. Enregistrer le modèle.
Pour ajouter du code, ajouter la balise <pre class="brush[nom de la brosse];[paramètre de la brosse]> et fermer avec </pre>. Le nom brosse est étrange. En réalité, le nom de la brosse est le nom du code utilisé. Par exemple, pour le code en AS3, la balise est:
< pre class="brush:as3">
   Insérer le code ici.
< /pre >
Pour ajouter un langage, ajouter des lignes au code HTML. La liste des langages supportés se trouve ici.

Amusez-vous bien à publier vos codes!

vendredi 12 août 2011

Comment insérer des équations dans Blogger (partie 2)?

Dans le précédent billet, nous avons vu comment insérer des équations dans du HTML en MathML en utilisant le LaTeX. Le résultat fonctionne pour Firefox seulement. La meilleure méthode consiste à transformer les équations en image et ensuite à les insérer dans le document HTML. Heureusement pour nous, c'est très facile à faire avec les suites bureautiques d'aujourd'hui.

La suite Office 2007 permet d'exporter des fichiers en format .htm. Toutes les équations sont transformées en image .gif et .png. Word crée les deux en même temps. Importez les images dans Blogger et le tour est joué. Le résultat est une équation de ce genre:
Magnifique! Je dois avouer qu'hier, avec mon LaTeX, je me suis compliqué la vie.

Ce n'est pas tout le monde qui a Office ou supporte d'utiliser Office. Dans ce cas, tourner vous vers LibreOffice! La procédure est la même que pour Office. Écrivez vos équations et enregistrez le fichier en format .html. LibreOffice va générer vos équations en format .gif. L'équation précédente générée par LibreOffice ressemble à ceci:
Comparons les deux suites pour la qualité graphique de l'image créée.
Avec Office 2007.

Avec LibreOffice.
Le gagnant est clairement MS-Word. Je suis déçu de la qualité graphique des équations générées par LibreOffice. En terme d'écriture d'équation, je préfère LibreOffice. J'ai mis 2 fois plus de temps dans MS-Word pour taper la même formule que dans LibreOffice. LibreOffice permet d'entrer des commandes comme pour le LaTeX, ce qui accélère grandement la saisit d'équations. Si quelqu'un sait comment augmenter la qualité des équations dans LibreOffice, faites le moi savoir.

jeudi 11 août 2011

Comment insérer des équations dans Blogger (Partie 1)?

Certaines personnes m'ont posé des questions qui vont probablement nécessiter d'écrire quelques équations. Le HTML ne permet pas d'écrire des équations aussi facilement que LibreOffice ou Microsoft Word (Word est pénible pour des équations complexes. La notation de LibreOffice est supérieure.). Le site Math in HTML (and CSS) résume bien la situation. Il parle d'un langage d'équations nommé MathML qui permet d'écrire des équations. Voici un exemple d'équation écrite avec MathML:
 a+ß=y (1)  Le code pour cette équation est:
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
 <mtable>
  <mtr>
   <mtd>
    <mrow><mi>a</mi><mo>+</mo>< mi>ß</mi><mo>=</mo><mi>y</mi>
    </mrow>
   </mtd>
   <mtd>(1)
   </mtd>
  </mtr>
 </mtable>
</math>

Ouf!!! C'est vraiment pénible! Par exemple en latex, le code serait:
\begin{equation}
\alpha+\beta=\gamma
\end{equation}

Ce qui est beaucoup plus beau et concis.

Je vais être franc, j'ai triché pour écrire le code en MathML. Je ne connais pas MathML et je n'ai aucune intention de l'apprendre. C'est trop complexe. J'ai utilisé un programme nommé LyX. J'ai exporté en XHTML et copier le code dans Blogger. LyX est un traitement de texte WYSIWYM (What You See Is What You Mean) avec une interface graphique qui montre un résultat approximatif du document. Voici une image de l'écran de LyX:
Interface du programme LyX.
LyX formate le texte avec le langage LaTeX. Les formules sont écrites en entrant les commandes LaTeX appropriées. Pour notre formule, nous choisissons dans le menu Insérer->Maths->Formule hors ligne et  entrons \alpha+\beta=\gamma. Le plus beau avec LyX est qu'il n'est pas nécessaire de connaître le LaTeX pour obtenir de fabuleuses équations. Le menu en bas permet au débutant d'entrer tout les symboles qu'il désire comme avec Microsoft Word. Bien entendu, la connaissance de LaTeX accélère grandement la vitesse de saisi des formules.

Une fois les formules créées. Il faut les exporter en HTML. Dans le menu Fichier, sélectionner Exporter et LyXHTML. LyX va générer un fichier XHTML avec votre formule écrire en MathML!  Ouvrer ce fichier avec votre éditeur de texte favori (dans mon cas Notepad++). Repérer la balise <math display="block" xmlns="http://www.w3.org/1998/Math/MathML"> Copier le code à partir du début de cette balise jusqu'à la balise de fermeture </math>. Dans Blogger passer en mode "Modifier le code HTML" et copier le code. Votre formule va apparaître dans votre texte. Cette méthode marche même pour des systèmes d'équations complexes sauf si vous êtes dans Internet Explorer... ou Chrome... Je suis tellement habitué à Firefox que j'oublie les autres fureteurs. IE ne supporte pas par défaut MathML et WebKit le supporte pour les versions 5 et plus. Je dois utiliser des images pour mes équations. Je vais continuer mes recherches et revenir avec une alternative dans le prochain billet.

Anecdote LaTeX.
J'étais au cinéma avec un ami pour voir le film Furtif. Furtif est un film d'action avec Jessica Biel qui raconte l'histoire de trois pilotes choisis pour un programme de développement de drone de combat intelligent. Le drone se nomme E. D. I. Le cerveau d'Edi est une grosse boule censée être un ordinateur quantique. À un moment dans le film, il montre le code source d'Edi. Et quand j'ai reconnu le langage, je me suis mis à rire! J'étais le seul dans la salle à rire et les gens ont dû me trouver étrange. Le langage était LaTeX! Un langage de traitement de texte pour programmer un drone de combat! Oh boy! Pas surprenant qu'Edi soit devenu fou.
Le drone E.D.I., probablement la dactylo la plus chère de l'histoire.

mardi 9 août 2011

Quel logiciel utiliser pour faire un jeu sur le Web pour 0$?

Bon, il y a plusieurs façons de le faire. Je vous présente ici les alternatives que je connais qui ne requièrent pas l'achat de logiciel. La première alternative consiste à développer en ActionScript 3 avec FlashDevelop et le Flex SDK Open Source d'Adobe (voir billet sur Comment programmer en Flash pour 0$). La seconde alternative est d'utiliser la version gratuite d'Unity. Unity est un engin de jeux 3D complet avec un éditeur avancé qui permet d'essayer le jeu en cours de développement. Il y a deux types de scripts pour créer la logique du jeu: le UnityScript qui ressemble au Javascript et le C#, qui est un clone de Java par Microsoft. Pour être plus précis, il utilise Mono, qui est la version libre du C#. La syntaxe du langage reste la même. Voici un lien vers un jeu que j'ai fait à l'aide du livre Développez des jeux 3D avec Unity par Will Goldstone:
Unity Web Player | WebPlayer
-->
Si vous ne voyez rien, allez télécharger le Unity Web Player.
Bon, un jeu n'est pas que du code. Il faut ajouter des graphiques et du son. Pour les graphiques, il y a plusieurs alternatives. La plus simple est d'utiliser le logiciel Open Source GIMP. GIMP est un logiciel de modification d'images comme Photoshop qui fonctionne sous Windows et Linux. Et bien, presque comme Photoshop. Il y a une différence majeure: les boîtes à outils sont flottantes. Si vous voulez une expérience plus Photoshop, je vous recommande GIMPshop. C'est toujours GIMP, mais avec une disposition plus classique des outils. Personnellement, je préfère le GIMP classique.
10 Capture d'image
20 Éditer l'image dans GIMP
Goto 10

Un programme que j'ai découvert et que j'aime particulièrement est Inkscape. C'est un logiciel de dessin vectoriel Open Source qui fonctionne sous Windows, Linux et Mac. D'ailleurs, mon logo a été créé avec ce logiciel.
Fenêtre principale d'Inkscape.
L'avantage du dessin vectoriel est de permettre de redimensionner son image sans perdre de qualité. GIMP est un logiciel de dessin dit matriciel. Le logiciel joue avec les pixels de l'image. Une fois l'image crée, un redimensionnement va réduire la qualité de l'image. Ce problème ne survient pas avec le vectoriel.

Pour les modèles 3D et les animations, il y a le puissant Blender. Ce logiciel est probablement un des joyaux du monde Open Source. Encore une fois, il fonctionne sous Windows et Linux. Avec Blender, il est possible de créer n'importe quel objet 3D, de l'éclairer, de le texturer et de l'animer.
L'interface de Blender est sobre et sans prétention.
Le focus est sur le modèle à créer.
Voici un film fait avec Blender:
Blender a été conçu pour les professionnels de la 3D et est très difficile à apprendre. Personnellement, la première fois que j'ai essayé Blender, je n'ai réussi à rien faire. Je n'arrivais même pas à tourner le cube, ni à zoomer et à dézoomer. Les fonctions de Blender sont activées par des raccourcis clavier. L'apprentissage de ces raccourcis est essentiel pour naviguer dans Blender. La philosophie du logiciel est: une main sur le clavier, l'autre sur la souris, ce qui assure une grande efficacité pour les initiés. Je vous recommande de lire un livre sur Blender ou de faire les tutoriels de base avant d'essayer de modéliser. Vous allez sauver beaucoup de temps et de frustration.

Finalement, pour le son, je recommande le logiciel Open Source Audacity. Ce logiciel fonctionne sous Windows, Linux et Max. Audacity est un éditeur et enregistreur de son audio.
(Source: http://audacity.sourceforge.net)
Je vous souhaite bien du plaisir dans la création de vos jeux.

samedi 6 août 2011

Comment programmer en Flash pour 0$?

Je commence avec une question facile, car je connais déjà la réponse. Il est possible de développer en Flash sans payer un sou à Adobe, et ce en toute légalité. Quoi? Comment est-ce possible si Adobe offre Flash CS 5.5 pour 700 $ pour la version complète et Flash Builder à 700 $?

Ce qui est peu connu est qu'Adobe a créé un SDK (Software Develpment Kit) Open Source. Voici d'ailleurs l'adresse: http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK

Le Flex SDK offre des codes précompilés écrits en ActionScript 3. L'ActionScript 3 est le langage utilisé pour développer en Flash. Ce langage est similaire au JavaScript, mais avec une différence de taille: il faut déclarer le type des variables. Habituellement, le typage des variables a pour résultat un accroissement des performances.

À partir du SDK, vous pouvez utiliser Notepad++ pour écrire votre code en ActionScript 3 et le compiler avec le compilateur AS3 mxml en ligne de commandes. Disons que ce n'est pas la manière la plus efficace pour coder. Il nous faudrait ce qui s'appelle un environnement de développement intégré (IDE pour Integrated Development Environment). Heureusement, il en existe plusieurs qui sont gratuits. Je connais Eclipse et FlashDevelop qui sont deux IDE Open Source. Oui, encore de l'Open Source. J'aime beaucoup l'Open Source.

Eclipse est le couteau suisse de la programmation. Il est possible de programmer dans presque n'importe quel langage simplement en ajoutant des extensions à Eclipse. Nous reviendrons dans le futur sur Eclipse, notamment pour la programmation en C++, en Java et en Python. Pour l'ActionScript, mon expérience m'a appris qu'Eclipse n'est pas idéal. FlashDevelop est de loin un produit supérieur.

FlashDevelop est disponible ici. L'installateur de FlashDevelop est très simple et devrait demander d'installer le Flex SDK. Une fois installer, vous êtes prêt à programmer en Flash, gratuitement et légalement.
Un aperçu de FlashDevelop.
Dans les prochains billets, je vous montrerai comment installer FlashDevelop et comment coder des programmes simples en ActionScript 3.

vendredi 5 août 2011

Qu'est-ce qu'explique la relativité générale et la mécanique quantique?

La relativité générale traite de la gravité uniquement. La relativité considère la gravité comme une déformation de l'espace-temps à quatre dimensions dans lequel nous vivons. Toute masse ou forme d'énergie (c'est la même chose: E=mc^2) contribue à la courbure de l'espace. La trajectoire d'un objet dans l'espace est affectée par la déformation de l'espace, comme montré sur la figure ci-dessous:
Déformation de l'espace-temps en présence d'un corps massif.
(Source http://www.jf-doucet.com/approche/Produits/Decouverte/Matiere_noire/Matiere_noire.htm)
La relativité pose les hypothèses que l'espace-temps est continu et que la matière est continue. C'est un modèle dit classique à l'instar de la théorie quantique qui considère la matière comme étant discontinue. La relativité générale a survécu à tous les tests expérimentaux qui lui ont été soumis. Cette théorie est la seconde plus solide théorie physique de l'histoire. La première étant la mécanique quantique.

La mécanique quantique décrit les interactions de la matière. Elle suppose que la matière est constituée d'objets pouvant se comporter comme une particule et comme une onde. En mécanique quantique, l'énergie est discontinue pour les particules liées. Un électron dans un atome est lié au noyau. Une particule dans un atome ne peut prendre que certaines valeurs discrètes d'énergie, nommé quanta. La mécanique quantique prédit superbement les interactions résultant des forces faible, forte et électromagnétique, mais pas la gravité.

Pourquoi la relativité est utilisée pour les distances très grandes et la mécanique quantique pour l'infiniment petit? La gravité est une force excessivement faible. C'est difficile à croire à notre échelle. Cette force nous semble considérablement forte lorsque nous essayons de nous lever le matin. Penser qu'il faut l'équivalent de toute la masse de la Terre pour générer la force de gravité que nous ressentons. Maintenant, prenez un aimant. Il est tout petit et pourtant il génère une force considérable. Si la Terre et les humains étaient des aimants, nous serions réduits en purée par la force d'attraction. Donc, à l'échelle microscopique, la force de gravité est négligeable face aux autres forces. Par contre, à notre échelle, la force de gravité domine.

Minute papillon! Tu dis que la gravité est plus faible que les autres forces, mais qu'elle domine à notre échelle. Comment est-ce possible? Les autres forces ont une charge. C'est la clé. La force électromagnétique peut être positive ou négative et la force forte a des couleurs comme charge. À l'intérieur d'un atome, un électron ressent la force électromagnétique des protons. C'est pourquoi il reste dans l'atome. Par contre, à l'extérieur de l'atome, la charge des électrons annule la charge des protons. Le résultat est que la force électromagnétique est considérablement réduite à l'extérieur de l'atome par l'annulation des charges. Il en va de même pour la force forte (c'est plus complexe que cela, mais l'argument tient). Bref, la portée de la force électromagnétique et forte est courte. La gravité n'a pas de charge et ne peut être annulée. Avec l'accumulation de particule, la force de gravité augmente sans blocage. Habituellement, plus la distance est grande et plus il y a de particules. Donc, la gravité prend le dessus si la distance est suffisamment grande.

Il est inutile de considérer la relativité générale à l'échelle atomique. La force de gravité est si faible à cette échelle que le résultat ne changera pas. De même, il est inutile d'utiliser la mécanique quantique à grande échelle, car cette théorie se réduit aux modèles classiques. Personne n'utilise la mécanique quantique pour résoudre des problèmes mécaniques. Pourquoi? Parce que c'est plus pratique d'utiliser les lois de Newton ou la relativité générale et que le résultat est suffisamment précis.

Il y a un bémol à ce que je viens de dire. À la longueur de Planck, une longueur ridiculement petite (1,6x10^-35m!!!), la gravité est significative. Un modèle combinant la mécanique quantique et la relativité générale est nécessaire. Or, la relativité générale considère la matière comme continue et la mécanique quantique non! Les physiciens travaillent depuis 40 ans à unifier la relativité générale et la mécanique quantique. La théorie des cordes est un candidat à cette unification. Bon, la question est: qui se préoccupe de distance si petite? Dans la vie de tous les jours: personne! Par contre, si vous êtes intéressez à savoir si se fameux trou noir permet de faire des bons dans l'espace-temps comme dans Star-Trek ou si vous voulez savoir l'histoire des touts premiers instants de notre univers, ce genre de détails est crucial. Et qui sait, peut-être découvrirons-nous l'hyper espace ou l'antigravité.

mardi 2 août 2011

Qu'est-ce que l'antimatière?

L'antimatière est constituée d'antiparticules. Une antiparticule est une particule avec une charge électrique inverse. Par exemple, un électron a une charge électrique de -1 et un proton une charge de +1. L'antiparticule de l'électron est le positron avec une charge de +1. De même, un anti proton a une charge de -1. Le neutron est neutre et est, par conséquent, sa propre antiparticule.

Une collision entre une particule et une antiparticule provoque l'annihilation des deux particules en libérant une quantité d'énergie formidable fournit par la relation d'Einstein E=mc^2. L'énergie est transportée par un photon. De même, si une région de l'espace possède une énergie suffisante, des paires de particules et d'antiparticules peuvent se créer spontanément. Un exemple de se phénomène survient lors de la propagation d'un laser intense dans le vide. Si le laser est suffisamment puissant, des paires électrons/positrons seront créées dans le faisceau. De même, à la suite de collisions de particules dans les accélérateurs, des paires de particules/antiparticules sont créées.

Au premier instant de l'univers, la température était tellement élevée que des paires de particules et antiparticules se créaient spontanément et s'annihilaient. Lorsque la température a diminué, la densité d'énergie n'était plus suffisante pour produire spontanément des paires de particules. Les particules et les anti particules se sont annihilé en partie. Mais voilà, les antiparticules ne sont pas exactement le miroir des particules. Elles ne réagissent pas exactement comme les particules lorsqu'elles interagissent avec la matière. Le résultat est un léger avantage pour la matière. L'avantage est de seulement 1 par milliard. Donc, pour chaque milliard d'annihilations matière antimatière, 1 particule a survécu. Le reste est sous forme d'énergie, soit sous forme de photon ou de neutrinos ou sous forme de particules exotiques dont nous ne connaissons pas la nature. Les chercheurs tentent de comprendre mieux les mécanismes qui créent cette dissymétrie entre la matière et l'antimatière.

vendredi 29 juillet 2011

Pourquoi faut-il accélérer les particules pour les voir?

L'accélérateur de particules fait gagner de la vitesse à des particules. Les nouvelles particules sont produites lors des collisions entre le faisceau de particules énergétique avec une cible fixe ou avec un faisceau de particules se propageant sens inverse. La collision de deux faisceaux se propageant en sens inverse libère deux fois plus d'énergie qu'avec une cible fixe. Pour faire une analogie, une collision entre deux automobiles venant en sens inverse cause plus de dommage qu'une voiture qui entre dans un mur ou un arbre (quoi que l'arbre objectera à cet argument).

Dans le monde des physiciens, une collision est en fait une interaction. Les particules n'entrent pas en collision comme des autos. Dans le modèle standard des particules, les particules sont des points de tailles infinitésimales. La probabilité d'un face à face entre deux particules est donc nulle. Dans la théorie des cordes, se sont des cordes. La taille des cordes est de 1x10^-35m!!! La taille d'un atome est de 1x10^-10m. Même selon la théorie des cordes, la probabilité de collision physique entre particules est infime. Les particules interagissent et ce sont ces interactions à hautes énergies qui créent de nouvelles particules. Par exemple, un photon d'une énergie d'environ 1000 MeV interagissant avec un noyau peut produire une paire électron-positron.

Les protons, les électrons, les neutrons ainsi que les photons sont visibles à la température ambiante. Inutile de les accélérer et de créer une collision pour les voir. La plupart des autres particules ont une durée de vie limitée. L'antimatière est un bon exemple. Une particule d'antimatière se désintègre au contact de la matière. Il est possible d'observer de l'antimatière dans le vide pour de courts instants avant qu'elle ne s’annihile sur une paroi ou avec une impureté du vide. Il faut produire ces particules pour les observer, ce qui implique de l'énergie, ce que fournissent les accélérateurs. Le muon est un autre exemple de particules de courte durée. Sa durée de vie est de l'ordre du micron.

Le boson de Higgs aurait une masse autour de 140 GeV selon les dernières estimations théoriques. Une masse est la même chose que de l'énergie en raison de l'équation E=mc^2. Rappelons qu'un électron dans un plasma à 10 000 K a une énergie de 1 eV. C'est très très chaud 10 000K! C'est deux fois la température de la surface du soleil. Alors, essayer d'imaginer 140 milliards de fois cette énergie. Pour voir le boson de Higgs, 140 GeV sont nécessaires à sa création. Le LHC prévoit en produire 7 TeV. La création de particules est un processus aléatoire. Ce n'est pas parce que 140 GeV sont mis en jeu dans la collision qu'un Higgs sera produit. Loin de là. Il y aura une gerbe de millions de particules et, parfois, un Higgs apparaîtra, s'il existe. Les scientifiques doivent analyser des millions, voire des milliards de collisions pour identifier avec certitude le signal d'une seule particule.

Finalement, il y a les quarks. Les quarks constituent les protons et les neutrons. La théorie des quarks se nomme la chromodynamique quantique et a été développée par Murray Gell-Mann. Les quarks ont une charge et aussi une couleur, qui est un type de charge, mais pour la force forte. Le nom chromo vient de couleur, d'où chromodynamique, la dynamique des couleurs (j'aime le choix des noms pour cette théorie). Les quarks sont liés entre eux par la force forte par l'entremise des gluons. Les gluons portent bien leur nom. Ils sont tellement efficaces à lier les quarks, qu'il n'est possible de voir des quarks libres qu'à de très très hautes énergies sous forme de plasma quark-gluon. Pour des températures plus faibles, les quarks forment des particules lourdes nommées hadron. En étudiant les hadrons, les physiciens sont parvenus à comprendre la dynamique des quarks, sans vraiment les voir.

jeudi 28 juillet 2011

Qu'arrive-t-il lorsque des particules sont ralenties?

Ralentir une particule dans le vide réduit sa vitesse et son énergie cinétique. Si la particule est seule, il ne se passe pas grand-chose, elle est juste ralentie. Par contre, si un groupe de particules est ralenti, des phénomènes intéressants se produisent. Ralentir des particules est équivalant à réduire la température du système. La température est une mesure statistique du mouvement aléatoire des particules. La température n'a pas de sens pour une seule particule. Il faut un groupe suffisamment grand de particules pour définir une température.

Lorsque la température diminue, les atomes se condensent en liquide et ensuite cristallisent pour former un solide. Pour beaucoup d'éléments et de composé, c'est tout ce qui se passe en refroidissant. L'hélium agit bizarrement. Lorsque refroidit en deçà de 2,17 K, l'hélium perd sa viscosité et ne ressent plus aucune friction. Le liquide s'échappe du contenant en grimpant les parois! Voici un vidéo explicatif de la superfluidité:

Pour d'autres composés, comme le mercure, une chute de température entraîne de la supraconductivité. La résistance électrique disparaît et les électrons circulent sans aucune résistance. De plus, aucun champ électrique ne peut pénétrer le supraconducteur. Voici un vidéo illustrant cette propriété:
Le supraconducteur est le rectangle gris. La pastille ronde est un aimant. Comme le supraconducteur repousse les lignes de champ magnétique, l'aimant flotte sur le supraconducteur. Le liquide versé est de l'azote liquide pour refroidir le supraconducteur.

Un solide devient supraconducteur lorsque les électrons libres de son réseau cristallin s'associent en paire dite de Cooper. Les électrons sont des fermions. Ils n'aiment pas être dans le même état quantique que leurs voisins. En coopérant deux à deux, les électrons agissent comme des bosons, qui aiment être identiques à leurs voisins. Le moment magnétique des paires de Cooper est nul, ce qui leur permet de circuler dans le solide sans rencontrer aucune résistance.

mercredi 27 juillet 2011

L'accélération magnétique est-elle la seule manière d'accélérer des particules?

Non, ce n'est pas la seule manière, mais c'est celle qui permet actuellement d'obtenir les plus grandes énergies de collisions. D'autres possibilités existent. Par exemple, en créant une différence de potentiel entre deux points, il est possible d'accélérer une particule chargée comme un électron, un proton ou un ion. Une différence de potentiel se créé lorsqu'un objet est chargé électriquement. Un bon exemple est lorsque vous frottez un ballon sur votre tête. Le ballon se charge d'électron et colle à vos cheveux. Un générateur de Van de Graaff fonctionne en chargeant une sphère de métal avec des électrons. Lorsque la tension est suffisante, la boule se décharge dans la plus petite. L'université Laval a longtemps utilisé un générateur de Van de Graaff comme accélérateur de particules.
Principe de base d'un générateur Van de Graaf.
(Source: Wikipedia)
Un Van de Graaff est fascinant par sa simplicité. Sur le diagramme, nous voyons une courroie qui monte les charges vers le dôme de métal. C'est littéralement un monte-charge!!! La courroie est recouverte de petites lanières de métal, qui frotte à la base et se charge d'électricité statique. La courroie monte les charges qui s'accumulent sur le dôme. Quand vous frottez votre ballon sur votre tête, vous faites exactement comme un Van de Graaff!

Il y a une autre méthode prometteuse pour accélérer des particules. Elle consiste à accélérer des particules avec l'aide de laser ultra puissant. La méthode se nomme l'accélération laser. L'accélération laser nécessite un plasma. Un plasma est produit lorsque la matière est tellement chaude, que les électrons se libèrent des atomes. Le milieu est alors composé d'électrons libres et d'ions, qui sont des atomes chargés positivement.
Le soleil est une immense boule de plasmas.
(Source:www.myoo ps.org)
Pour obtenir une accélération laser, nous produisons une onde plasma en tirant dans le plasma avec le laser le plus intense possible. Le champ laser crée une séparation de charges dans le plasma qui se propage dans le milieu; une onde plasma. Il est préférable aussi que l'impulsion soit ultra-courte. L'onde plasma va se propager dans le milieu à la vitesse de groupe du laser dans le milieu. Bref, à la vitesse de la lumière dans le plasma. Une fois l'onde produite, certains électrons surfent sur l'onde plasma et gagnent de la vitesse, beaucoup de vitesses. Les électrons peuvent atteindre une énergie de 200 MeV en 2mm !!! L'électron volt est une mesure d'énergie. Un électron dans un plasma à 10000 K a une énergie d'un ou deux eV. Après son "surf" il a multiplié son énergie par 200 millions!!! Et ce, en 2 mm! C'est une accélération de 1 suivi de 22 zéro fois la gravité actuelle!
Surfons la vague pour atteindre des énergies supérieures!
(Source: www.xarj.net)
Les chercheurs tentent maintenant d'obtenir le GeV. L'accélération laser ne s'aligne pas pour concurrencer les grands accélérateurs. Cette technique est utilisée en radiothérapie pour produire des électrons et des protons de hautes énergies pour tuer les tumeurs. L'avantage est que l'accélération laser donne des faisceaux de particules quasi mono énergétiques et est plus compact qu'un accélérateur de particules.

lundi 25 juillet 2011

Qu'est-ce que la théorie des cordes?

La théorie des cordes est une théorie qui tente d'unifier la mécanique quantique et la relativité générale en une seule théorie. Elle postule que les particules sont des cordes. La mécanique quantique conçoit les particules comme des points de taille infinitésimale. Les différents modes de vibrations des cordes engendrent les différentes particules. Un des aspects controversé de la théorie des cordes est qu'elle nécessite au minimum dix dimensions pour engendrer toutes les particules et les interactions. Des variantes de la théorie nécessitent 23 dimensions! Et comble, il n'y avait pas une, mais 5 théories des cordes!
Heille, man! Les physiciens en fument du bon,
moi, je suis juste capable de voir 5 dimensions!
Dix dimensions n'étant pas assez, Edward Witten en a ajouté une autre! Il a montré que les cinq théories des cordes étaient des approximations d'une théorie générale à 11 dimensions nommé M théorie. Pourquoi le M? Personne ne le sait, sauf Ed Witten. Plus amusant encore, personne n'a jamais formulé la théorie M. Les théoriciens savent qu'elles existent, mais ne sont pas capable de l'écrire.
Vous ne saurez jamais ce que veux dire le M! Ha ha ha!
(Source: http://www.sns.ias.edu/~witten/)
Notre univers a quatre dimensions: trois d'espaces et une de temps. Comment l'univers peut-il avoir 11 dimensions sans que nous le sachions? Les théoriciens se sont grattés pas mal la tête pour arriver à une explication de ce paradoxe. Il y a deux hypothèses envisagés: les dimensions supplémentaires sont repliés sur elle même ou nous vivons dans un sous espace d'un espace à 11 dimensions et n'en voyons que quatre!

Des dimensions qui se replient sur elle-même? Heu... Oui, c'est mêlant. Prenez un ruban de Möbius. Habituellement, un ruban a deux faces. Si vous le twister et le coller, vous obtenez un ruban de Möbius. Si vous suivez une face, vous revenez à votre point de départ. Il n'y a plus qu'une seule face!
Magika! Il n'y a plus qu'une face!
(Source: http://en.wikipedia.org/wiki/M%C3%B6bius_strip)
Donc, une dimension qui se replie est un peu comme un ruban de Möbius. Si vous marchez, vous allez éventuellement revenir à votre point de départ. Dans la théorie des cordes, les dimensions cachées se replient sur elle-même rapidement. Pour être précis, elles se replient sur une distance plus courte que la longueur de Planck. Cette distance est tellement petite que nous ne sentons pas les dimensions cachés. Seules les cordes qui sont de l'ordre de la longueur de Planck les sentent. Maintenant, essayer d'imaginer 6 dimensions repliés sur elle-même. Apparemment, ça ressemble à cela:
Un Calabi-Yau, un ruban de Möbius sur les stéroïdes.
(Source: http://en.wikipedia.org/wiki/File:Calabi-Yau.png)
La seconde façon de ne percevoir que 4 dimensions sur 11 est... de vivre sur une des cordes. Plus précisément, sur un brane. Voilà, les cordistes se sont aperçus que leur théorie supportait d'autres objets que les cordes, comme des membranes, c'est-à-dire des objets à deux dimensions. Il est possible d'avoir des cordes, des membranes, des tribranes, etc jusqu'à 11. Le mot brane vient de la fin du mot membrane. Donc, un n-brane est une membrane en n dimensions.
Brane! Brane!
Selon la seconde hypothèse, notre univers est un 4-brane qui flotte dans un espace à 11 dimensions. Comme le brane a 4 dimensions, nous ne voyons que 4 dimensions, sauf pour la gravité, qui selon certaine variante, s’échapperait vers des dimensions supérieures, expliquant sa faible intensité.

La théorie des supercordes a supplanté la théorie des cordes en incluant la supersymétrie. La supersymétrie implique une relation profonde en les bosons et les fermions. Les bosons sont les particules responsables des forces et les fermions constituent les particules de matières. La supersymétrie implique que chaque fermion possède un super partenaire qui est un boson et que chaque boson possède un super partenaire qui est un fermion. Cette hypothèse est très séduisante pour les théoriciens, car elle permet d'unifier les forces à haute énergie de manière élégante. Par contre, aucune mesure expérimentale n'a confirmé cette hypothèse.

Est-ce que la théorie des cordes est une théorie sérieuse. Oui, c'est un sujet hyper chaud de la physique théorique depuis plus de 30 ans. Elle ne fait pas l'unanimité parmi la communauté scientifique. De grand physiciens, dont Richard Feynman ont critiqués la théorie des supercordes pour n'avoir apporté aucune prédiction expérimentale. Dernièrement, Lee Smolin a vertement critiqué la quantité de ressources attribué à la recherche sur la théorie des cordes en rapport avec sa capacité de prédiction dans son livre The Trouble With Physics.

Une théorie concurrente de la théorie des cordes est la gravitation quantique à boucle. Il y aussi la théorie d'Anthony Garrett Lisi qui utilise un espace mathématique particulier. Je vous recommande de regarder son Ted Talk (lien Lisi Ted Talk). C'est fascinant. L'avantage de sa théorie est qu'elle ne requiert que 4 dimensions.