cancel
Showing results for 
Search instead for 
Did you mean: 

Aligning world with Guardian Play Area

SharpeGame
Level 3
I seem to be at a loss for I have been working on this problem for the last couple of days.

I am trying to create a game where the player walks through the environment by walking around their play area given it meets the requirements (7 ft x 7 ft). I, however, seem to not be able to make the world align with the play area. I am able to get the play area and calculate where the player is inside of the play area as well as calculate the angle in which the world needs to be rotated to become aligned with the play area. Nothing that I do has seemed to work despite the numbers I have gotten. Has anyone else done this and can give me pointers or a solution on how this might be done?
1 ACCEPTED SOLUTION

Accepted Solutions

SharpeGame
Level 3

Sorry about taking so long to get this posted. What I did to center the world is as follows

  • In Unity, place all objects in the world into one gameObject parent so we only have to rotate one thing
  • Create a new Script for rotating and make sure it contains a GuardianBoundaryEnforcer
  • Add a our new centering method to the enforcer for when the world is recentered.
  • Actually rotate the world by converting guardian points to local space points.

The way you add a function to the enforcer is simply done as such:

enforcer.TrackingChanged += UpdateCenter;

in this, enforcer is the GuardianBoundaryEnforce and UpdateCenter is the function that will help center the player.

UpdateCenter is as follows:

private void UpdateCenter()

{

if(OVRManager.boundary.GetConfigured())
{

boundary = OVRManager.boundary.GetDimensions(OVRBoundary.BoundaryType.PlayArea);
points = OVRManager.boundary.GetGeometry(OVRBoundary.BoundaryType.PlayArea);

CenterPlayer();

}

}

 

I personally split up the method into two just because my other method is longer and I didn't want it surrounded in the if statement of the OVRManager. That is in place to make sure we actually have a Boundary and is working correctly. If it wasn't we wouldn't be able to get any points. So now for the main show. We center the world around the guardian. To do this, I took the points from the OVRManager and put converted them to local space by putting them onto 4 points that my script creates. I them find the center between all the points and have it face forwards. from there I am able to set the rotation of the gameObject contating all the world objects to that rotation and position. Then everything is rotated.

private void CenterPlayer()
{

point1.transform.localPosition = (points[0]);
point2.transform.localPosition = (points[1]);
point3.transform.localPosition = (points[2]);
point4.transform.localPosition = (points[3]);

 

Vector3 pointA = midPoint(point1.transform.position, point2.transform.position);
Vector3 pointB = midPoint(point3.transform.position, point4.transform.position);

 

Vector3 between = pointB - pointA;

 

float distance = between.magnitude;

 

squareMarker.transform.position = pointA + (between / 2.0f);
squareMarker.transform.LookAt(pointB);

 

worldContainer.transform.position = squareMarker.transform.position;
worldContainer.transform.rotation = squareMarker.transform.rotation;

 

}

private Vector3 midPoint(Vector3 a, Vector3 b)
{

float x = (a.x + b.x) / 2;
float y = (a.y + b.y) / 2;
float z = (a.z + b.z) / 2;

return new Vector3(x, y, z);

}

 

Thats all it takes to center the world around the player. If you have any other questions or have feedback on a way to improve this, please reach out!


View solution in original post

13 REPLIES 13

MVRKDEV
Level 2
I'm trying to accomplish the same thing with the Quest, so I'll +1 this. Out of curiosity, are you currently building to the device every time you want to test something or are you using the link cable? 

SharpeGame
Level 3

MVRKDEV said:

I'm trying to accomplish the same thing with the Quest, so I'll +1 this. Out of curiosity, are you currently building to the device every time you want to test something or are you using the link cable? 



I have not gotten my oculus link cable yet so unfortunately, I have been building to my quest every time. 

MVRKDEV
Level 2
Ah, I see. I guess I'll just have to abandon the link cable to accomplish this goal until they confirm or deny whether we can access the guardian system with it. I'll let you know if I make any headway with aligning the world to the play area. 

glenneroovy
Level 4

@SharpeGame Did you ever figure this out?

 

btw when using Oculus Link, OVRManager.boundary.GetConfigured() still returns false. To get around this, I just dumped the values returned from OVRManager.boundary.GetGeometry(OVRBoundary.BoundaryType.PlayArea) while running non-Link and use those when testing.

Yes, I did figure it out actually! My problem was that the code I was running was trying to align it using coordinates local to the boundary instead of the boundaries global coordinates. Once I made the conversion everything *worked* as intended. If you would like I can post a breakdown of how I accomplished this or give you some pointers on your own code if you have already attempted it.

Thanks for writing back! I think I understand what you are saying, but any details you wish to share would definitely be helpful for myself and future readers 🙂

I'm having the exact same issue. It seems that even when finding the corners, the whole play space seems to be rotated an arbitrary amount and offset from the center point. Can you please post your code sample?

I just found this thread which helped in my case, perhaps it will also help in your case:

https://forums.oculusvr.com/t5/Oculus-Quest-Development/How-to-disable-Quest-recentering-in-Unity-XR...

Awesome, thank you! But this corrects it for each subsequent recentering right, and not the initial alignment?  I really wish it just matched the guardian instead of these weird hacks.