Forum Discussion
SharpeGame
6 years agoExplorer
Aligning world with Guardian Play Area
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 ...
- 5 years ago
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!
Anonymous
5 years agoI just reached out to Oculus Developer support. Hopefully they can help me in time, and I'll post here any solutions they might have.
SharpeGame
5 years agoExplorer
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.
Quick Links
- Horizon Developer Support
- Quest User Forums
- Troubleshooting Forum for problems with a game or app
- Quest Support for problems with your device
Other Meta Support
Related Content
- 2 months ago
- 12 days ago
- 7 months ago