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?
13 REPLIES 13

I absolutely agree and I also hate having to implement hacks for things that IMO should be handled by the Oculus framework. Yes it's meant for subsequent recentering events but you might be able to adapt it for the initial alignment since in either case you have to deal with OVRManager.boundary geometries. I admit I haven't had a deep look at either issue yet since I'm still working on core gameplay... but I'm hoping to come up with a cleaner solution to both issues before release. If I find/develop anything I'll definitely share it here.

garrettfuselier
Level 3

I just reached out to Oculus Developer support. Hopefully they can help me in time, and I'll post here any solutions they might have.

My way of doing it works for the initial centering of the play area and subsequent re-centering as well. The way I have do it is by binding it to the re-centering event when the level is loaded. I'm not currently able to get to my computer until later today. When I do get to my computer, I can post some code snippets here to show how I have done it.

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!