[No Limits 1&2] Questions et problèmes (Archives)

Statut
Ce sujet est verrouillé
Ca me parait bizarre de repositionner un objet 3ds avec un script, comment insérer le vector 3f dans ce script ?(il y est déjà mais je ne sais pas ou je doit insérer les positions en fait)

import com.nolimitscoaster.*;
import nlvm.math3d.*;

public class DoorScript extends Script implements TrackTriggerListener
{
  private SceneObject sco;
  private SceneObjectElement leftDoor;
  private SceneObjectElement rightDoor;
 
  private static final int STATE_IDLE = 0;
  private static final int STATE_OPENING = 1;
  private static final int STATE_OPENING_REVERSED = 2;
  private static final int STATE_CLOSING = 3;
 
  // rotate up to 90 degrees
  private static final float MAX_ANGLE = (float)(Math.PI / 1.7);
  private static final float SPEED = 0.7f;
 
  // rotate around Y-Axis
  private static final Vector3f AXIS = new Vector3f(0,1,0);  ---------> est ce que je dois remplacer cette ligne par                                                                              private Vector3f Left_Axis;
                                                                                    private Vector3f Right_Axis; 
                                                                                          Left_Axis = new Vector3f(0.1f, 0, 0);
                                                                                    Right_Axis = new Vector3f(-0.1f, 0, 0);               
      private int state;
  private float rot;
 
  private TrackTrigger beforeDoorTrigger;
  private TrackTrigger behindDoorTrigger;
 
  private StaticSound doorSound;
 
  private static final String scriptName = "DoorScript";
 
  // must be constant string expression and marked as final so that the compiler will no complain with a warning when used for
  // StaticSound.loadFromFile
  private final static String doorSoundFile = "ouverture porte.ogg";
 
  public bool onInit()
  {
    sco = sim.getSceneObjectForEntityId(getParentEntityId());
      if (sco == null)
    {
      System.err.println(scriptName + ": the script is not part of a scene object");
      return false;
    }
   
    leftDoor = sco.getElementForName("left");
    if (leftDoor == null)
    {
      System.err.println(scriptName + ": element not found: left");
      return false;
    }   

    rightDoor = sco.getElementForName("right");
    if (rightDoor == null)
    {
      System.err.println(scriptName + ": element not found: right");
      return false;
    } 

    doorSound = StaticSound.loadFromFile(doorSoundFile, 0);
    if (doorSound == null)
    {
      System.err.println(scriptName + ": could not load sound '" + doorSoundFile + "'");
      return false;
    }

    Vector3f pos = new Vector3f();

    sco.getTranslation(pos);


    doorSound.setPosition(pos);

    // Setting to 'Local' will enable environmental (reverb) effects if this sound's position should be e.g. in a tunnel
    doorSound.setEnvironmentMode(StaticSound.E_ENVMODE_LOCAL);

    // These parameters affect the distance attenuation
    doorSound.setDistanceParameters(4.0f, 2.0f);

    final float range = 10;

    // create triggers...
    TrackPos trackPos = sim.findNearestCoasterTrack(pos, range);
    if (trackPos == null)
    {
      System.err.println(scriptName + ": no coaster found within a range of "+ range + " meters");
      return false;
    }
    else
    {
      Coaster coaster = trackPos.getCoaster();
     
      System.out.println(scriptName + ": Coaster found: " + coaster);

      System.out.println("Coaster Style is: " + coaster.getCoasterStyleId());
     
      // create a trigger 5 meters in front of the track pos
      beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -6.0);
     
      // create a trigger 5 meters after the track pos
      behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +1.0);
     
      // tell the triggers that they should call our onTrainEntering/onTrainLeaving methods
      // We have to implement the TrackTriggerListener interface
      beforeDoorTrigger.addTrackTriggerListener(this);
      behindDoorTrigger.addTrackTriggerListener(this);
    }
   
    state = STATE_IDLE;
    rot = 0;
   
    return true;
  }
 
  public void onNextFrame(float fTickTime)
  {
    switch (state)
    {
    case STATE_IDLE:
      // do nothing
      break;
    case STATE_OPENING:
      {
        rot += fTickTime * SPEED;
        if (rot >= MAX_ANGLE)
        {
          rot = MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;
    case STATE_OPENING_REVERSED:
      {
        rot -= fTickTime * SPEED;
        if (rot <= -MAX_ANGLE)
        {
          rot = -MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;     
    case STATE_CLOSING:
      {
        if (rot > 0)
        {
          rot -= fTickTime * SPEED;
          if (rot <= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        else if (rot < 0)
        {
          rot += fTickTime * SPEED;
          if (rot >= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;
    }
  }
 
  /**
  * This method is part of the TrackTriggerListener Interface implementation
  *
  * It will be called if the interface is registered for a trigger using the
  * addTrackTriggerListener method.
  */
  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_OPENING;
        doorSound.play();

        //printTrainPositionAndRotation(train);
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_OPENING_REVERSED;
        doorSound.play();
      }
    }
  }
 
  /**
  * This method is part of the TrackTriggerListener Interface implementation
  *
  * It will be called if the interface is registered for a trigger using the
  * addTrackTriggerListener method.
  */ 
  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
  }

  // This method demonstrates how to get the position and rotation of the first bogey
  private void printTrainPositionAndRotation(Train train)
  {
    if (train.getBogieCount() > 0)
    {
      Vector3f pos = new Vector3f();
      Vector3f front = new Vector3f();
     
      train.getBogieOrientationAndPosition(0, front, null, null, pos);

      System.out.println(scriptName + ": First bogey is at " + pos);

      double azimuthRad = Math.atan2(front.x, -front.z);
      double elevationRad = Math.atan2(front.y, Math.sqrt(front.x* front.x + front.z* front.z));

      System.out.println(scriptName + ": Yaw is " + Math.toDegrees(azimuthRad) + " degrees");
      System.out.println(scriptName + ": Pitch is " + Math.toDegrees(elevationRad) + " degrees");
    }
  }
}
 
Intamin Fan a dit:
Ca me parait bizarre de repositionner un objet 3ds avec un script, comment insérer le vector 3f dans ce script ?

Oui mais comme Blender exporte ainsi, je n'ai trouvé que cette solution  :-)

En fait il s'agit juste de créer deux nouveaux vecteurs afin de positionner nos objets dessus. (rien a remplacer, juste a ajouter)

Déclaration des 2 vecteurs : (a mettre dans la class avec les autres)
private Vector3f Left_Axis;
private Vector3f Right_Axis; 

Positionnement des vecteurs (a mettre dans le public bool onInit())
Left_Axis = new Vector3f(0.1f, 0, 0);
Right_Axis = new Vector3f(-0.1f, 0, 0);

Et pour finir, la liaison de l'objet au nouveau vecteur dans le public void

Left.setTranslation(Left_Axis);
Right.setTranslation(Right_Axis)




 
Toujours le même problème, mes portes se superposent (avec les origines dans blender qui sont chacunes au centre des deux sous objets left et right).

J'ai rajouté ce que tu m'as dit pourtant:

import com.nolimitscoaster.*;
import nlvm.math3d.*;

public class DoorScript extends Script implements TrackTriggerListener
{
  private SceneObject sco;
  private SceneObjectElement leftDoor;
  private SceneObjectElement rightDoor;
  private Vector3f left_Axis;
  private Vector3f right_Axis;

  private static final int STATE_IDLE = 0;
  private static final int STATE_OPENING = 1;
  private static final int STATE_OPENING_REVERSED = 2;
  private static final int STATE_CLOSING = 3;
 
  // rotate up to 90 degrees
  private static final float MAX_ANGLE = (float)(Math.PI / 1.7);
  private static final float SPEED = 0.7f;
 
  // rotate around Y-Axis
  private static final Vector3f AXIS = new Vector3f(0,1,0);
 
  private int state;
  private float rot;
 
  private TrackTrigger beforeDoorTrigger;
  private TrackTrigger behindDoorTrigger;
 
  private StaticSound doorSound;
 
  private static final String scriptName = "DoorScript";
 
  // must be constant string expression and marked as final so that the compiler will no complain with a warning when used for
  // StaticSound.loadFromFile
  private final static String doorSoundFile = "ouverture porte.ogg";
 
  public bool onInit()
  {
    left_Axis = new Vector3f(0.1f, 0, 0);
    right_Axis = new Vector3f(-0.1f, 0, 0);

   
      sco = sim.getSceneObjectForEntityId(getParentEntityId());
      if (sco == null)
    {
      System.err.println(scriptName + ": the script is not part of a scene object");
      return false;
    }
   
    leftDoor = sco.getElementForName("left");
    if (leftDoor == null)
    {
      System.err.println(scriptName + ": element not found: left");
      return false;
    }   

    rightDoor = sco.getElementForName("right");
    if (rightDoor == null)
    {
      System.err.println(scriptName + ": element not found: right");
      return false;
    } 

    doorSound = StaticSound.loadFromFile(doorSoundFile, 0);
    if (doorSound == null)
    {
      System.err.println(scriptName + ": could not load sound '" + doorSoundFile + "'");
      return false;
    }

    Vector3f pos = new Vector3f();

    sco.getTranslation(pos);


    doorSound.setPosition(pos);

    // Setting to 'Local' will enable environmental (reverb) effects if this sound's position should be e.g. in a tunnel
    doorSound.setEnvironmentMode(StaticSound.E_ENVMODE_LOCAL);

    // These parameters affect the distance attenuation
    doorSound.setDistanceParameters(4.0f, 2.0f);

    final float range = 10;

    // create triggers...
    TrackPos trackPos = sim.findNearestCoasterTrack(pos, range);
    if (trackPos == null)
    {
      System.err.println(scriptName + ": no coaster found within a range of "+ range + " meters");
      return false;
    }
    else
    {
      Coaster coaster = trackPos.getCoaster();
     
      System.out.println(scriptName + ": Coaster found: " + coaster);

      System.out.println("Coaster Style is: " + coaster.getCoasterStyleId());
     
      // create a trigger 5 meters in front of the track pos
      beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -6.0);
     
      // create a trigger 5 meters after the track pos
      behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +1.0);
     
      // tell the triggers that they should call our onTrainEntering/onTrainLeaving methods
      // We have to implement the TrackTriggerListener interface
      beforeDoorTrigger.addTrackTriggerListener(this);
      behindDoorTrigger.addTrackTriggerListener(this);
    }
   
    state = STATE_IDLE;
    rot = 0;
   
    return true;
  }
 
  public void onNextFrame(float fTickTime)
  {
    left.setTranslation(left_Axis);
    right.setTranslation(right_Axis);

    switch (state)
    {
    case STATE_IDLE:
      // do nothing
      break;
    case STATE_OPENING:
      {
        rot += fTickTime * SPEED;
        if (rot >= MAX_ANGLE)
        {
          rot = MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;
    case STATE_OPENING_REVERSED:
      {
        rot -= fTickTime * SPEED;
        if (rot <= -MAX_ANGLE)
        {
          rot = -MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;     
    case STATE_CLOSING:
      {
        if (rot > 0)
        {
          rot -= fTickTime * SPEED;
          if (rot <= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        else if (rot < 0)
        {
          rot += fTickTime * SPEED;
          if (rot >= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        leftDoor.setRotation(-rot, AXIS);
        rightDoor.setRotation(rot, AXIS);
      }
      break;
    }
  }
 
  /**
  * This method is part of the TrackTriggerListener Interface implementation
  *
  * It will be called if the interface is registered for a trigger using the
  * addTrackTriggerListener method.
  */
  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_OPENING;
        doorSound.play();

        //printTrainPositionAndRotation(train);
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_OPENING_REVERSED;
        doorSound.play();
      }
    }
  }
 
  /**
  * This method is part of the TrackTriggerListener Interface implementation
  *
  * It will be called if the interface is registered for a trigger using the
  * addTrackTriggerListener method.
  */ 
  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
  }

  // This method demonstrates how to get the position and rotation of the first bogey
  private void printTrainPositionAndRotation(Train train)
  {
    if (train.getBogieCount() > 0)
    {
      Vector3f pos = new Vector3f();
      Vector3f front = new Vector3f();
     
      train.getBogieOrientationAndPosition(0, front, null, null, pos);

      System.out.println(scriptName + ": First bogey is at " + pos);

      double azimuthRad = Math.atan2(front.x, -front.z);
      double elevationRad = Math.atan2(front.y, Math.sqrt(front.x* front.x + front.z* front.z));

      System.out.println(scriptName + ": Yaw is " + Math.toDegrees(azimuthRad) + " degrees");
      System.out.println(scriptName + ": Pitch is " + Math.toDegrees(elevationRad) + " degrees");
    }
  }
}


J'ai reloadé plusieurs fois rien à faire, 4errors, unknow type .

Je me demande vraiment comment Vince_Ours à fait avec la  grille dans Mystic Manor parce que j'ai regardé il n'y a que le script doorscript de base donc tout doit se jouer au niveau de la modélisation. Est ce que ça fonctionne ta technique du script ? Au pire envoie moi un objet vite fait avec deux sous objets right et left et le script auquel tu as réfléchi qui fonctionnent pour que je puisse l'analyser ça sera surement plus efficace ?  :-)

Ou alors je suis une vrai bouse avec Java ce que je conçois totalement ^^.
 
haha je veux bien t'aider a pêcher mais je vais pas donner le poisson  :-)
Si je le fait, t'auras pas compris pour autant ...

T'as recopié ceci :
left.setTranslation(left_Axis);
right.setTranslation(right_Axis);

Alors que tes deux objets s'appellent :
private SceneObjectElement leftDoor;
private SceneObjectElement rightDoor;


Donc essayes ceci :
leftDoor.setTranslation(left_Axis);
rightDoor.setTranslation(right_Axis);

J'ai mis des données d'axe (0.1f) au hasard. Il te faut les positionner toi-même en fonction de tes objets.



 
J'ai une question hyper bête. J'ai download un track et j'ai un fichier nl2pkg. Mais qu'est-ce que j'en fais maintenant pour l'ouvrir ? Y a un logiciel comme sur NL1 ou pas ?
Merci d'avance.
 
Tu clique sur add roll, tu clique sur le rail à l'endroit ou tu veux le postionner puis tu double clique sur le roll afin de modifier son inclinaison  :-).
 
C'est sur ^^. Au fait, un petit tuto sur les transfert table ne ferait pas de mal  :-P. (ou si qqun connait une vidéo ou un autre site pour ça).
 
Salut a tous est que il y aurait un moyen de crée les portillon d'une gare animé qui marcherai avec le pupitre de commande merci et comment crée le script qui va avec si besoin !
 
Salut, c'est encore moi  :-D

J'ai téléchargé hier un coaster no limit. Seulement, quand j'essaye d'utiliser NL Tracker Packager, il me parle de "fichier roots introuvable". Quelqu'un aurait-il une solution ?
 
Coasterfan102 a dit:
Salut, c'est encore moi  :-D

J'ai téléchargé hier un coaster no limit. Seulement, quand j'essaye d'utiliser NL Tracker Packager, il me parle de "fichier roots introuvable". Quelqu'un aurait-il une solution ?

Quand tu vas dans "play", tu as un menu "download" où tu as tous tes téléchargements. Chez moi c'est comme ça en tout cas.

Deejay-fluzzy a dit:
Salut a tous est que il y aurait un moyen de crée les portillon d'une gare animé qui marcherai avec le pupitre de commande merci et comment crée le script qui va avec si besoin !

Tu appuis tu F4, t'as le panneau de contrôle qui apparaît et tu peux tout faire. Harnais, portillons, freins etc...

A moi de poser une question.  :-D Comment fait on pour modifier l'emplacement des points cardinaux sur un map de NL2? C'est pour faire des jeux de lumières avec le soleil et mon coaster. Merci d'avance.  :wink:
 
*Deejay-Fluzzy: dsl aucune idée si c'est possible mais ça m'étonnerais puisque le tableau de controle n'est pas controlé par des scripts je pense, enfin, n'est pas modifiable par des scripts editables je pense. Vu que ton portillon est animé, je connais que ce script que j'ai galéré à mettre en oeuvre mais sinon je ne sais pas comment le controler, la il s'active selon une certaine distance (10m si je mesouviens bien)

Code:
import com.nolimitscoaster.*;
import nlvm.math3d.*;

public class DoorScript extends Script implements TrackTriggerListener
{
  private SceneObject sco;
  private SceneObjectElement leftDoor;
  private SceneObjectElement rightDoor;
  
  private static final int STATE_IDLE = 0;
  private static final int STATE_OPENING = 1;
  private static final int STATE_OPENING_REVERSED = 2;
  private static final int STATE_CLOSING = 3;
  
  // rotate up to 90 degrees
  private static final float MAX_ANGLE = (float)(Math.PI / 2.0);
  private static final float SPEED = 1.6f;
  
  // rotate around Y-Axis
  private static final Vector3f AXIS = new Vector3f(0,1,0);
  
  private int state; 
  private float rot;
  
  private TrackTrigger beforeDoorTrigger;
  private TrackTrigger behindDoorTrigger;
  
  private StaticSound doorSound;
  
  private static final String scriptName = "DoorScript";
  
  // must be constant string expression and marked as final so that the compiler will no complain with a warning when used for
  // StaticSound.loadFromFile
  private final static String doorSoundFile = "doorsound.ogg";
  
  public bool onInit()
  {
    sco = sim.getSceneObjectForEntityId(getParentEntityId());
    if (sco == null)
    {
      System.err.println(scriptName + ": the script is not part of a scene object");
      return false;
    }
    
    leftDoor = sco.getElementForName("left");
    if (leftDoor == null) 
    {
      System.err.println(scriptName + ": element not found: left");
      return false;
    }    

    rightDoor = sco.getElementForName("right");
    if (rightDoor == null) 
    {
      System.err.println(scriptName + ": element not found: right");
      return false;
    }  

    doorSound = StaticSound.loadFromFile(doorSoundFile, 0);
    if (doorSound == null)
    {
      System.err.println(scriptName + ": could not load sound '" + doorSoundFile + "'");
      return false;
    }

    Vector3f pos = new Vector3f();

    sco.getTranslation(pos);


    doorSound.setPosition(pos);

    // Setting to 'Local' will enable environmental (reverb) effects if this sound's position should be e.g. in a tunnel
    doorSound.setEnvironmentMode(StaticSound.E_ENVMODE_LOCAL);

    // These parameters affect the distance attenuation
    doorSound.setDistanceParameters(2.0f, 0.8f);

    final float range = 10;

    // create triggers...
    TrackPos trackPos = sim.findNearestCoasterTrack(pos, range);
    if (trackPos == null)
    {
      System.err.println(scriptName + ": no coaster found within a range of "+ range + " meters");
      return false;
    }
    else
    {
      Coaster coaster = trackPos.getCoaster();
      
      System.out.println(scriptName + ": Coaster found: " + coaster);

      System.out.println("Coaster Style is: " + coaster.getCoasterStyleId());
      
      // create a trigger 5 meters in front of the track pos
      beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -5.0);
      
      // create a trigger 5 meters after the track pos
      behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +5.0);
      
      // tell the triggers that they should call our onTrainEntering/onTrainLeaving methods
      // We have to implement the TrackTriggerListener interface
      beforeDoorTrigger.addTrackTriggerListener(this);
      behindDoorTrigger.addTrackTriggerListener(this);
    }
    
    state = STATE_IDLE;
    rot = 0;
    
    return true;
  }
  
  public void onNextFrame(float fTickTime)
  {
    switch (state)
    {
    case STATE_IDLE:
      // do nothing
      break;
    case STATE_OPENING:
      {
        rot += fTickTime * SPEED;
        if (rot >= MAX_ANGLE)
        {
          rot = MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(rot, AXIS);
        rightDoor.setRotation(-rot, AXIS);
      }
      break;
    case STATE_OPENING_REVERSED:
      {
        rot -= fTickTime * SPEED;
        if (rot <= -MAX_ANGLE)
        {
          rot = -MAX_ANGLE;
          state = STATE_IDLE;
        }
        leftDoor.setRotation(rot, AXIS);
        rightDoor.setRotation(-rot, AXIS);
      }
      break;      
    case STATE_CLOSING:
      {
        if (rot > 0)
        {
          rot -= fTickTime * SPEED;
          if (rot <= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        else if (rot < 0)
        {
          rot += fTickTime * SPEED;
          if (rot >= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        leftDoor.setRotation(rot, AXIS);
        rightDoor.setRotation(-rot, AXIS);
      }
      break;
    }
  }
  
  /**
   * This method is part of the TrackTriggerListener Interface implementation
   *
   * It will be called if the interface is registered for a trigger using the
   * addTrackTriggerListener method.
   */
  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_OPENING;
        doorSound.play();

        //printTrainPositionAndRotation(train);
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_OPENING_REVERSED;
        doorSound.play();
      }
    }
  }
  
  /**
   * This method is part of the TrackTriggerListener Interface implementation
   *
   * It will be called if the interface is registered for a trigger using the
   * addTrackTriggerListener method.
   */  
  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
  }

  // This method demonstrates how to get the position and rotation of the first bogey
  private void printTrainPositionAndRotation(Train train)
  {
    if (train.getBogieCount() > 0)
    {
      Vector3f pos = new Vector3f();
      Vector3f front = new Vector3f();
      
      train.getBogieOrientationAndPosition(0, front, null, null, pos);

      System.out.println(scriptName + ": First bogey is at " + pos);

      double azimuthRad = Math.atan2(front.x, -front.z);
      double elevationRad = Math.atan2(front.y, Math.sqrt(front.x* front.x + front.z* front.z));

      System.out.println(scriptName + ": Yaw is " + Math.toDegrees(azimuthRad) + " degrees"); 
      System.out.println(scriptName + ": Pitch is " + Math.toDegrees(elevationRad) + " degrees"); 
    }
  }
}

*Boub08, surement dans environnement editor, j'ai vu plein d'option sur l'emplacment du soleil, de la lune ect tu peux modifier vraiment beaucoup de chose la dedans et jouer sur la lumières (horaires, emplacment soleil...)


Je pose une question très simple dont je n'ai pas su trouver ma réponse ^^: comment diminuer le niveau de hauteur de l'eau ?? (pas trouvé dans terrain settings, j'ai fouillé un peu partout mais je sais pas ou est ce qu'on pourrait faire ça).
 
C'est tout à fait normal, les catwalks du style setting ne servent à rien pour les woodens puisque les catwalks des woodens font partis des supports. Pour créer des catwalks en bois, tu vas dans l'onglet support, puis wooden generator et la tu choisis ce que tu veux sauf le disabled qui enlève la structure voilà  :wink:

Oh et bienvenue sur le forum au fait  :-)
 
Statut
Ce sujet est verrouillé