What we mean by locomotion on rails is that the user has no control over their movement in VR.  Think of this as a VR roller coaster experience where the user rides along on tracks in VR. This can be a cool controlled experience in VR but it is important to know that when the user is not controlling their movement it can be more disorienting as they can’t anticipate movements.

VR Sickness and On Rails VR

There are a couple different things to consider when making a VR ride that will impact VR Sickness:

1. Field of View – how close objects are to you can affect how the movement makes you feel.  To see how this feels there are two examples attached where the user is flying through a landscape:

A. AmazonRiverFlyThroughDemo – this example has objects close to the user and is a narrower space.  Close movement can have an increased effect on VR sickness

B. UnderWaterFlyThroughDemo – this one has the user flying through a more open underwater landscape with less objects close to the user.  For some people this will result in a different sensation that may lessen the impact on VR sickness. Near the end of the ride you enter a smaller channel.  You can see if this change impacts your VR sickness.

2. Reference Points – It is helpful to give the user a static reference point to help them focus and alleviate some of the motion sickness.  This can be achieved by putting users on a vehicle such as a boat, car or similar so that they have an object in their field of view that will remain a constant and help them ground themselves in space.  To feel the difference this can make compare the difference between:

A. AmazonRiverFlyThroughDemo – this demo has no boat to ground you on while you move down the river.

B. AmazonRiverBoatRideDemo – in this demo you make the same movements but are on a boat for the experience.

3. Speed, acceleration and deceleration – a lot of accelerating and decelerating will increase the disconnect between the way the user’s body feels and what they are seeing.  We will walk through different ways that you can program movements to decrease changes in speed or make them more intentional:

A. Adjusting default animation style to remove subtle changes at the beginning and end of movements.  To experience the differences this can cause view the following:

i. vrLocomotionNoSmooth – this is using the default animation style Beging_And_End_Gently for each move procedure.

ii. vrLocomotionSmoothPartOne – this adds the Begin_And_End_Abruptly animationStyle parameter to each mover procedure to remove some of the jerking in the animation.

B. Making sure that the speed of animations using the camera are being executed at a consistent speed.  To feel the difference when adjusting for constant speed compare:

i. vrLocomotionSmoothPartOne – this animation will change speeds between each movement due to different distances using the same duration.

ii. vrLomotionSmoothPartTwo – this uses functions to make each move procedure have one consistent speed by making the speed a constant function by making the duration a function of the distance.

4. Orientation – Changing the users up and down orientation can cause one of the more jarring disconnects between the body and the eyes.  When deciding to angle the user relative to the ground be careful of all of the above to try to limit the disorientation. It is a good idea to have users seated if you are going to make changes to this orientation (for safety).  To try out how this can feel in VR try the demo:

A. vrLocomotionOnRailsPitchAndRollDemo

Camera SetUp for VR

The default camera in Alice is set up to have a slight downward angle.  When you first start your VR project or are translating an existing world to VR be sure to use the following to straighten out the Camera view to avoid the disorienting feeling of being slightly tipped forward.

1. Go to the Scene Editor

2. Select the Camera 

3. Select One Shots

4. Select OrientToUpright

Using Camera Markers

Just like when creating a non VR experience you will use procedures to move and orient the camera to new camera markers.  In VR remember that changes in height will be more perceptible so be sure when setting up new camera markers that the y value is the same.  Slight changes that may be imperceptible when viewing on desktop may have a more profound impact on a user in VR. To create a path or rails for the camera:

1. Go to the scene editor

2. Add a starting camera marker

3. Move the Camera to the next location

4. Verify Height is the same as your starting camera height (default is 1.56)

5. Add a new Camera Marker and use a naming convention that will help you easily program the camera down the path such as cameraLocationTwo

6. Repeat this process to add all locations you want the ride to follow

7. Return the camera to the starting camera marker position

8. Go to the Code Editor

9. Select the Camera

10. Use the procedure moveAndOrientTo and select the camera marker desired 

11. Continue through all of your camera markers

12. Test

You can view an example of this construction by loading the vrLocomotionOnRailsNoSmooth.a3p

Using a Vehicle and Object Markers

If you elect to have the user ride on a boat or other vehicle you will want to set your cameras height to 1.56 meters above the vehicle and center it where you want the user to be situated.  If you plan on having the user seated in vr adjust the height accordingly.  

1. Go to the scene editor

2. Place your vehicle and orient the camera relative to the vehicle object

A. Select the camera

B. Use the one shot move and orient to the vehicle object

C. For some vehicle this may result in the camera facing backwards.  If this happens use the one shot turn right/left .5 to spin the camera

D. Input 1.56 or the desired height into the y field of the x, y ,x coordinates for the camera

3. Add a starting Camera marker

A. You can now move the camera away from the starting camera position to view the location of the starting camera marker relative to the vehicle to determine if you want to move the camera  to a better location

4. Select the vehicle

5. Add an object marker and name starting location or similar boatStartingLocation

6. Move the object to the next position you want the ride to go

7. Add a new Object Marker and use a naming convention that will help you easily program the vehicle down the path such as boatLocationTwo

8. Continue until you have all of the locations mapped out

9. Return the vehicle to the starting object marker

10. Return the camera to the starting camera marker

11. Select the camera and set vehicle to the vehicle object

12. Go to Code Editor

13. Select the vehicle 

14. Use the procedure moveAndOrientTo and select the object marker desired 

15. Continue through all of your object markers

16. Test

You can view an example of this construction by loading the AmazonBoatRideDemo.a3p

Smoothing Out the Movement Part 1

Alice by default uses a parameter on move procedures to begin and end gently.  This causes each separate animation to speed up and slow down at the beginning of each procedure.  This can cause a fluctuation in speed when stringing together several move procedures on one object.  This can cause an uncomfortable jerky feeling for the user in VR. You will want to smooth this out by changing this default animation style to Begin_And_End_Abruptly.  This will allow each separate animation to flow directly into the next motion.

1. Select add detail on the move procedure

2. Select animation style 

3. Select Begin_And_End_Abruptly

4. Set this for each movement in turn

5. Test

You can view an example of this construction by loading the vrLocomotionOnRailsSmoothPartOne.a3p

Smoothing Out the Movement Part 2

Setting the animation style will make the speed within each segment consistent but you will still feel a speed up and slow down for each segment if the speed of each segment of the ride isn’t consistent.  The reason the speed of each segment may vary is because each segment might have a different distance traveled but by default will have the same duration (unless you already started playing with the duration).  This change in speed is because If the user travels down a 10 10 meters segment in the default one second they will be moving a lot faster than on another segment that is 1 meter in length that they travel in one second.  There are a couple different ways you can even this out:

1. Set each segment to be the same length – You can do this by trying your best to space out your camera or object markers at similar distances.   You can think of the whole world as a grid (you can turn this on to view) and use the x, y, z coordinates and a little math to set them up to be the same distance between markers.

2. Modify the duration based on the length of the segment – You can do this by modifying the durations by view or feel.  You can also map out the coordinates of the markers and use some math to figure out the distances and set the durations for each segment to achieve the same distance to time ratio.  Ie if the length of one segment is 1 meter and you set the duration to 1 second the ratio is 1/1 so if the next segment is 1.5 meters long set the duration to 1.5 sec to achieve the same 1/1 ratio.

3. You can use a function to set the duration relative to the distance between the markers.  This can be done using the following:

A. Select any object as placeholder from the object drop down (we will replace this value)

B. Go to the functions tab

C. Select getDistanceTo (object) function and drag into the duration parameter of the move procedure

D. In the object menu select the target object of the move procedure 

E. Use the drop down to replace the first object with the object or camera marker that represents the starting place for the camera for that procedure 

F. This construction will result in a 1-1 distance to time ratio for a speed of 1 meter a second 

G. You can change the velocity of this segment by dividing or multiplying the value. To do that you will select the function and use the math menu item to add another element to the function

H. Apply this method for each segment and apply the same speed modifier 

You can view an example of this construction by loading the vrLocomotionOnRailsSmoothPartTwo.a3p

Smoothing Acceleration and Deceleration

If you desire to have the ride speed up and slow down you can intentionally change the durations.  For segments that will accelerate or decelerate you can smooth out those accelerations and decelerations by using the begin and end gently modifier to correlate with which end of the procedure the speed change will occur.  This will spread the acceleration over the duration of the segment instead of the speed increasing all at once when the segment begins.