Skip to content

World Warping

Hannah edited this page Mar 31, 2021 · 2 revisions

Mermaidgraph World Warping

The idea of world warping is to shift the virtual world, such that the virtual target and the real target align. Applying this shift instantly would be very disturbing for a user so the goal of world warping is to apply this transformation unnoticedly frame by frame.

World Warping is typically used in context of redirected walking. The idea to use World Warping in a Hand Redirection scenario has been proposed by Azmandian et al.. They have tested the concept of world warping in a Hand Redirection setup. We tried to recreate this Hand Redirection technique with the general concept of Redirected Walking mind.

In our toolkit, we implemented various approaches:

Rotational

Mermaidgraph World Warping Rotational

We rotate the world, until the virtual target P_{vt} and the real target P_{rt} are rotationally aligned. This does not mean, that they are the same position, but only have the same orientation. We can ensure this alignment by having both forward vectors, of the real\vec{r} and the virtual \vec{v} target, pointing into the same direction.

bodyWarp

To get such an alignment, we have to rotate the virtual world by d degrees.\ How much we can rotate the world depends on the user's head rotation. While the user moves his head we scale his head rotation, but we do not apply the rotation to his head transform, instead, we rotate the world correspondingly.

  1. Get the users head rotations per frame r_{frame} and per seconds r_{seconds} in degree. If the user's head rotations per second does not exceed a previously set Head Rotation Trigger Threshold, we stop here. This threshold can be freely adjusted in the Unity editor. On default we set it to 4° per second. This value worked well in our test scenarios.
  2. Else, check, how much we still need to rotate the world:
    • Compute d_{needed}, the remaining angle between the virtual and the real target orientations.
    • The two objects are rotationally aligned, if d_{needed} = 0
  3. Get the rotation scaling factor r_{scaled}:
    Depending on the head rotation, we can scale the user's head rotation up or down:
    • Up: If we have to rotate the world into the same direction as the user's current head rotation.
    • Down: If the user's head rotation was not in the same direction as we have to rotate the world.
  4. Get the angle, that we want to apply on the virtual world:
    The difference between the rotation with the scaling and the initial rotation:
    r_{angle} = r_{scaled} - r_{frame}
  5. Get the final rotation, that we can apply to the virtual world:
    Cases where r_{angle} is larger than r_{needed} would lead to overturning the world. So, we have to check if r_{needed} is smaller than r_{angle} with respect to the direction:
    r_{world} =
\begin{cases}
max(d_{needed}, r_{angle}), & \text{if}\ d_{needed} < 0 \\
min(d_{needed}, r_{angle}), & \text{otherwise}
\end{cases}
  6. Repeat.

WIP: Add Graphic

Implementation

TODO

Back to top