# Daydream Elements

![](https://developers.google.com/static/vr/images/ElementsAppMenu.png)

Creating immersive and interactive VR experiences introduces a new set of
physiological, ergonomic, and technical challenges. How do you move comfortably
in VR? How do you get the most performance out of mobile hardware?

Daydream Elements is a collection of Unity tech demos that showcase principles
and best practices for developing high-quality VR experiences. The core
mechanics in each demo are built to be easily configurable and reusable for your
own applications.

Elements currently covers the following VR principles:

- [Locomotion](https://developers.google.com/vr/develop/android-ndk/elements#locomotion)
- [Object interaction](https://developers.google.com/vr/develop/android-ndk/elements#object_interaction)
- [Rendering and lighting](https://developers.google.com/vr/develop/android-ndk/elements#rendering_and_lighting)
- [Menus and virtual controls](https://developers.google.com/vr/develop/android-ndk/elements#menus_and_virtual_controls)

Elements is available as an open source project on GitHub.

[Download on GitHub](https://github.com/googlevr/daydream-elements/releases)

## Locomotion

When crafting VR applications, it is often important to let the player to move
around their virtual environment. Techniques for enabling navigating a VR
environment are referred to as **locomotion**. There are a variety of
different ways to achieve effective locomotion, each with their own set of
tradeoffs.

- [Teleportation](https://developers.google.com/vr/elements/teleportation) is a locomotion technique for
  apps using first-person perspective that allows the user to
  near-instantaneously move to a target location. This technique reduces the
  simulator sickness that many users feel when the virtual camera moves.

- [Tunneling](https://developers.google.com/vr/elements/tunneling) is a technique used with first-person
  locomotion (such as walking) where, during movement, the camera is cropped
  and a high-contrast stable grid is displayed in the user's peripheral
  vision. This is analogous to a user watching first-person locomotion on a
  television set.

- [Chase Camera](https://developers.google.com/vr/elements/chase-cam) is a technique used with third-
  person locomotion, where the user is controlling a character. Standard
  third-person camera implementations are problematic in VR and contribute
  to simulator sickness. Chase Camera offers predictable motion - camera
  rotation only occurs under user direction, and small character movements
  don't move the camera at all.

## Object Interaction

While walking around in VR is incredibly important, the next most important
thing for users is being able to interact with their surrounding environment.
This gives users a feeling of agency, and in many cases will play an integral
role in your gameplay or puzzle design. We have provided two Elements to
highlight best practices in Object Interaction.

- [Object Manipulation](https://developers.google.com/vr/elements/object-manipulation) paradigms play a critical part in making VR feel immersive. In this demo, we show how you can simulate weights on objects to make them feel lighter or heavier, and how to tune hinges and sliders so they behave in ways that feel natural for common interactions like opening doors and closing drawers.
- [Arm Models](https://developers.google.com/vr/elements/arm-model) approximate the physical location of the Daydream controller in VR so that we can achieve 6DoF-style controller interactions with only a 3DoF controller. This demo includes three custom-tuned arm models for simulating swinging, throwing, and shooting, and a playground that lets you change different model parameters to see how they affect the interaction experience.

## Rendering and lighting

Performance is critical to VR apps but can be especially challenging on mobile
GPUs. Many commonly available mobile shaders and per-pixel lighting solutions
provide high quality results but perform poorly on mobile VR systems due to
extremely high resolutions, rendering multiple views, distortion and general
mobile performance issues.

The [Rendering \& Lighting demo](https://developers.google.com/vr/elements/renderer-demo) uses [Daydream
Renderer](https://developers.google.com/vr/unity/renderer) to showcase rendering effects that are typically
difficult to achieve on mobile hardware. This scene demonstrates Daydream
Renderer features like per-pixel lighting, tangent-space normal maps, dynamic
shadows, real-time specular highlights, and reflections.

## Menus and virtual controls

The Daydream controller only exposes two buttons to developers: the clickable
touchpad, and the app button. For many developers, two discrete controls does
not provide a rich enough set of commands for the games and applications
that they would like to create. One solution is to present the user with
virtual controls for the app's command scheme.

- [Click Menu](https://developers.google.com/vr/elements/click-menu) provides the user with a radial menu
  of commands emanating from the cursor when the menu is invoked. Because
  users must click directly on options, this menu design trades the speed of
  a more gestural approach with the control of discrete clicks and scales
  well with complex command hierarchies.

- [Swipe Menu](https://developers.google.com/vr/elements/swipe-menu) leverages the Daydream controller
  touchpad to allow the user to quickly select between a small set of
  commands. This menu trades efficiency for accuracy and does not scale well
  to large number of commands.

- [Constellation Menu](https://developers.google.com/vr/elements/constellation-menu) demonstrates a
  gesture-based interaction model that helps users navigate deep information
  hierarchies in a simple, responsive way. Examples use cases include
  item inventories, file directories, and other apps with large feature
  or data sets.