El Editor de Unity tiene un API de Referencia Script de bajo nivel para recopilar información sobre las superficies en el ambiente de su proyecto. Esta API de referencia Script de bajo nivel le da el máximo control sobre cuándo consultar el dispositivo para los cambios de superficie y cuándo crear o actualizar game objects de superficie. Los componentes de Spatial Mapping le permiten ponerse rápidamente en funcionamiento con la realidad mixta, sin utilizar directamente la API de Ref de Script de bajo nivel.
Hay dos componentes de Spatial Mapping: el Spatial Mapping Renderer y el Spatial Mapping Collider. Ir a Component > Add… (u oprima Add Component en la ventana del Inspector) para traer el menú de Add Component. Los componentes de spatial mapping están de bajo de la categoría de AR en el menú de Add Component.
Puede utilizar los componentes juntos o independientemente. Cada componente de Spatial Mapping utiliza su propio observador de superficie para entender los cambios en el mundo físico. Dependiendo de cómo se configure el componente, cada componente de Spatial Mapping consulta periódicamente al sistema para entender qué cambios se han producido en el espacio físico. Cuando el sistema le notifica al componente de los cambios relevantes, el componente prioriza el baking de las diversas superficies cambiadas. El proceso de baking implica generar un Mesh Filter con un Mesh que corresponda a la superficie física. Los componentes Spatial Mapping Renderer y Spatial Mapping Collider utilizan este Mesh Filter en sus propias maneras específicas.
El componente Spatial Mapping Renderer da una representación visual de las superficies de Spatial Mapping. Esto es útil para depurar visualmente las superficies y agregar efectos visuales al ambiente.
El componente Spatial Mapping Renderer solicita periódicamente al sistema cambios en el espacio físico. Cada vez que se notifica al componente de estos cambios, convierte los datos de superficie devueltos en GameObjects. Estos GameObjects contienen un Mesh Filter y un Mesh Renderer. El componente Renderer gestiona la vida útil de los GameObjects de superficie. Esto significa que el componente Spatial Mapping Renderer se encarga de crear, actualizar y destruir el GameObject de superficie.
El componente proporciona una manera fácil de cambiar dinámicamente el material en todas las superficies generadas. Se entrega con dos tipos de materiales:
Un material de oclusión que parece transparente pero oculta hologramas. Este es un material útil para usar si, por ejemplo, desea que un escritorio del mundo real oculte un objeto holográfico dentro del juego situado debajo de él.
Un shader wireframe que se aplica a todas las superficies del componente. Los colores del wireframe representan distancias. Las siguientes son las asignaciones de distancia a color.
0 a 1 metro = Negro
1 a 2 meteros = Rojo
2 a 3 meteros = Verde
3 a 4 meteros = Azul
4 a 5 metros = Amarillo
5 a 6 metros = Ciánico
6 a 7 metros = Magenta
7 a 8 metros = Marrón
8 a 9 metros = Color verde-azulado
9 a 10 metros = Naranja
10 meteros o mayor = Blanco
Ajuste | Propiedad: |
---|---|
Custom Render Setting (Configuración Personalizada del Render) | Select one of the three options to render surfaces: Occlusion Material - A transparent material which hides GameObjects behind real world surfaces. NOTE: Enables all of a surface’s Mesh Renderers, overriding any other setting. Custom Material - Your own material for visualizing the surfaces. Use this for debugging, visual effects, or your own occlusion material. This enables all of a surface’s Mesh Renderers, overriding any other setting. None (Game Object) - Disables all the Mesh Renderers assigned to the surfaces. |
Custom Material (Material Personalizado) | Seleccione el material que desea utilizar para el rendering. El valor predeterminado es el material SpatialMappingWireframe incorporado. La opción seleccionada aquí es el material de render que se aplica a su Custom Render Settings. Tenga en cuenta que tanto las opciones activas en el Custom Render Settings (tanto Occlusion Material y Custom Material) requieren una configuración Custom Material aquí. |
Para información acerca de General Settings (configuraciones generales) mire General Settings, abajo
Notas:
Todos los GameObjects de superficie toman su material del Custom Render Setting. Si cambia el Custom Render Setting, todos los materiales de renderización de los GameObjects de superficie cambian a los de Custom Render Setting. Esto reduce el número de draw calls (llamadas de dibujo), lo que a su vez mejora el rendimiento de la renderización. El uso de un material compartido también reduce la cantidad de memoria que utiliza la renderización.
Cuando asigne un nuevo material al ajuste Custom Material, este no cambia automáticamente el material de superficie de sus GameObjects de superficie. También debe configurar Custom Setting Render en Custom Material o Occlusion Material para aplicar el nuevo material a todas las superficies.
If the Occlusion Material or Custom Material properties in Custom Render Setting are not assigned at runtime, they are destroyed with the Renderer component. However, any Occlusion Material or Custom Material assigned at runtime are not destroyed with the component, so you need to destroy them individually.
El siguiente ejemplo script demuestra cómo cambiar el material aplicado a todos los GameObjects de superficie dinámicamente en tiempo de ejecución.
SpatialMappingRenderer renderer = spatialMappingGameObject.AddComponent<SpatialMappingRenderer>();
renderer.customMaterial = new Material(Shader.Find("VR/SpatialMapping/Wireframe"));
renderer.currentRenderSetting = SpatialMappingRenderer.RenderSetting.CustomMaterial;
El componente Spatial Mapping Collider, permite que contenido holográfico interactúe con superficies físicas. Maneja la creación, actualización y destrucción de GameObjects de superficie.
El componente consulta periódicamente el sistema para los cambios superficiales en el mundo físico. Cuando el sistema informa de los cambios de superficie, el componente Spatial Mapping Collider prioriza cuando cada superficie reportada se baked. Cuando se baked una superficie, se crea un nuevo GameObject que tiene un componente Mesh Filter y Mesh Collider. Una vez que la superficie tiene un Mesh Collider, usted puede emitir rayos contra la superficie y colisionar con ella.
Ajuste | Propiedad: |
---|---|
Enable Collisions | Marque esta casilla para prender los Mesh Colliders de la superficie. |
Mesh Layer | Set the Layer property on all the surface Mesh Colliders. Note that you need to set Layers for raycasts. When performing a raycast, you must indicate which Layers you want the ray intersection to test against. By default, all GameObjects are assigned to the Default Layer. However, it is good practice to assign your GameObjects to a specific Layer. See Performance optimization, below. See the Layers page and Raycast page for more information. See also Example script: SpatialSurface raycast, below. |
Physic Material | Especifica qué Physic Material para asignar al Mesh Collider. El valor predeterminado es None (Physic Material). Un Physic Material especifica cómo otros componentes Rigidbody deben interactuar con él. Por ejemplo, una superficie puede simular hielo, y por lo tanto aplicar menos fricción a un objeto que se mueve sobre él. El componente Spatial Mapping Collider aplica su Physic Material a todos los Mesh Colliders en sus GameObjects de superficie. Mire la página Physic Material para más información. |
Para información acerca de General Settings (configuraciones generales) mire General Settings, abajo
El siguiente ejemplo demuestra cómo raycast (emitir rayos) contra GameObjects en la Layer (capa) SpatialSurface.
using UnityEngine;
using System.Collections;
public class CustomLayerCollision : MonoBehaviour
{
// Update is called once per frame.
void Update()
{
// When the user presses the left mouse button,
// Do a collision test. You could fire the
// DetectCollisions based on a gesture event.*
if(Input.GetMouseButtonDown(0))
{
DetectCollisions();
}
}
void DetectCollisions()
{
// Raycast against all game objects that are on either the
// spatial surface or UI layers.
int layerMask = 1 << LayerMask.NameToLayer("SpatialSurface");
// We use ScreenPointToRay to create a ray whose origin is the
// main camera's position and direction is from the position of the main
// camera to the position of where the mouse position would be in world space.
RaycastHit[] hits = Physics.RaycastAll(Camera.main.ScreenPointToRay(Input.mousePosition), float.MaxValue, layerMask);
if(hits.Length > 0)
{
foreach(RaycastHit hit in hits)
{
Debug.Log(string.Format("Hit Object **\"**{0}**\"** at position **\"**{1}**\"**", hit.collider.gameObject, hit.point));
}
}
else
{
Debug.Log("Nothing was hit.");
}
}
}
Los General Settings funcionan de la misma manera para los componentes Spatial Mapping Renderer (Script) y Spatial Mapping Collider (Script).
Ajuste | Propiedad: | |
---|---|---|
Surface Parent | Seleccione el GameObject Surface Parent_ que desea que los GameObjects de superficie generados por los componentes de Spatial Mapping hereden. Deje esto como None (Game Object), para generar automáticamente un Surface Parent GameObject (GameObject de Superficie Padre). | | Freeze Updates__ | Marque esta casilla para detener el componente que consulta el sistema para los cambios de superficie. NOTA: Cada componente de Spatial Mapping consulta periódicamente al sistema los cambios de superficie en el espacio físico. Consultar y bake superficies cuestan memoria, rendimiento y potencia. Para los ambientes que se espera que sean en su mayoría estáticos, permita a los usuarios mirar alrededor del entorno durante un período de tiempo sin actualizaciones. |
Time Between Updates | Especifique el tiempo en décimas de segundo (es decir, 3,7 o 4,6) entre las consultas para los cambios de superficie en el espacio físico. El valor predeterminado es 2,5 segundos. Tenga en cuenta que mientras más regulares sean las consultas, mayor será el costo en memoria, rendimiento y potencia. | |
Removal Update Count | Specify the number of updates before a surface GameObject is removed. An update is the same as a frame in this context. The default is 10 updates (frames). NOTE: The removal update count down begins when the system notifies the component that a surface GameObject is no longer in the surface observer’s bounding volume - ie it is gone from the defined area the system reports on. Here you specify how many updates (frames) should follow after this event before removing the surface GameObject. | |
Level of Detail | Seleccione la calidad Low, Medium, o High del Mesh generado por el componente. El predeterminado es Medium. Entre mayor la calidad, más preciso el Collider y el renderizado, entre menor calidad, habrá menos costo en el rendimiento y consumo de energía. Mire la imagen de abajo para un ejemplo de los tres modos de Level Of Detail. | |
Bounding Volume Type | Elija aquí entre las formas de área de volumen delimitadas: Sphere o Axis Aligned Box. El valor predeterminado es Axis Aligned Box. NOTA: El volumen delimitador es el área definida sobre la cual el sistema reporta los cambios físicos de la superficie. | |
Size In Meters | Configura el tamaño del volumen delimitador en metros. Configura Sphere por radio; El radio predeterminado es de 2 metros. Configura Axis Aligned Box por sus extensiones; El valor por defecto es un Vector3 (4,4,4) o 4 metros cúbicos. NOTA: El volumen delimitador del observador es el área definida sobre la cual el sistema informa los cambios físicos de la superficie. |
Level Of Detail
Tenga en cuenta que cada componente de Spatial Mapping es independiente de otros componentes de Spatial Mapping. Esto significa que cada componente mantiene su propia lista de superficies, incluso si varios componentes ven la misma superficie. Trate de limitar el número de componentes de Spatial Mapping que utiliza, con el fin de optimizar el rendimiento.
Si espera que el ambiente en su simulación sea bastante estático e inmutable (como un juego de mesa), puede escanear la mayor cantidad de datos de superficie que necesite por adelantado y, a continuación, defina la propiedad Freeze Updates como false. Esto aumenta ligeramente el rendimiento y consume menos energía.
Hay un pequeño costo en el rendimiento para mover un componente de Spatial Mapping . Intente evitar mover un GameObject que tenga un componente de Spatial Mapping.
En Collider Settings > Level of Detail, utilice el ajuste Low. Esto aumenta el rendimiento Y reduce el consumo de energía al calcular las intersecciones de colisión.
Los Spatial Mapping Mesh Colliders tienen menos latencia en las actualizaciones que los Spatial Mapping Mesh Renderers. Esto significa que los Colliders se actualizan más rápido que los Renderers.
In Collider Settings > Mesh Layer, by default, all game objects are assigned to the Default Layer. However, it is good practise to assign your GameObjects to a specific Layer: Raycasting is an expensive calculation to perform, in that it can slow performance. By using Layers, you can filter which GameObjects you are doing your raycast calculations against, and so optimise performance. If you don’t have a lot of complicated Meshes on your Default Layer, then doing the raycast test for collision won’t have a large performance cost. However, it is best to organize your GameObjects into Layers to reduce the complexity of raycast tests when doing collisions.