using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// Spawns an object when you click on the screen at the real-world position clicked.
/// Will only spawn an object if the surface clicked is facing upward.
/// Note that the ZED's newer plane detection feature is usually better for this unless
/// you need something very simple.
///
public class PlaceOnScreen : MonoBehaviour
{
///
/// Prefab object to be instantiated in the real world on a click.
///
public GameObject ObjectToPlace;
///
/// The ZEDManager in the scene.
///
private ZEDManager zedManager;
///
/// The left camera in the ZED rig. Passed to ZEDSupportFunctions for transforming between camera and world space.
///
private Camera cam;
// Use this for initialization
void Awake() {
//zedManager = gameObject.transform.parent.GetComponentInChildren();
zedManager = ZEDManager.GetInstance(sl.ZED_CAMERA_ID.CAMERA_ID_01);
cam = zedManager.GetMainCamera();
Cursor.visible = true; //Make sure cursor is visible so we can click on the world accurately.
}
// Update is called once per frame
void Update () {
if(!zedManager.zedCamera.IsCameraReady)
{
return;
}
if (Input.GetMouseButtonDown(0)) //Checks for left click.
{
/// Mouse Input gives the screen pixel position
Vector3 ScreenPosition = Input.mousePosition;
//Get Normal and real world position defined by the pixel .
Vector3 Normal;
Vector3 WorldPos;
ZEDSupportFunctions.GetNormalAtPixel(zedManager.zedCamera,ScreenPosition,sl.REFERENCE_FRAME.WORLD,cam,out Normal);
ZEDSupportFunctions.GetWorldPositionAtPixel(zedManager.zedCamera,ScreenPosition, cam,out WorldPos);
//To consider the location as a flat surface, we check that the normal is valid and is closely aligned with gravity.
bool validFloor = Normal.x != float.NaN && Vector3.Dot(Normal, Vector3.up) > 0.85f;
//If we've found a floor to place the object, spawn a copy of the prefab.
if (validFloor)
{
GameObject newgo = Instantiate(ObjectToPlace);
newgo.transform.localPosition = WorldPos;
newgo.transform.LookAt(new Vector3(zedManager.transform.position.x, newgo.transform.position.y, zedManager.transform.position.z), Vector3.up);
}
else
{
if (Normal.x == float.NaN)
Debug.Log ("Cannot place object at this position. Normal vector not detected.");
if (Vector3.Dot(Normal, Vector3.up) <= 0.85f)
Debug.Log ("Cannot place object at this position. Normal vector angled too far from up: "+Mathf.Acos(Vector3.Dot(Normal, Vector3.up))*Mathf.Rad2Deg + "°");
}
}
}
}