Положение мыши на внутренней камере

#unity3d

#unity3d

Вопрос:

Что у меня есть:

  • Camera2D это смотрит вниз на плоскость, горизонтально в глобальной системе
  • Изображение из Camera2D сохраняется в Texture2D
  • MainCamera который отображает холст из пользовательского интерфейса
  • RawImage В Canvas есть объект, которому присвоен Texture2D

Короче говоря, в главном пользовательском интерфейсе у меня есть экран, на котором я отображаю содержимое другой камеры.

Моя проблема:

  • Я бы хотел кое-что нарисовать Plane .
  • Для этого мне нужно найти отображение положения мыши в глобальной системе координат

Я пытаюсь сделать это по-разному, например

 var mp = Input.mousePosition;
var vec = mainCamera.ScreenToWorldPoint(mp);
//var vec = image2DCamera.ScreenToWorldPoint(mp);
 

Это решение работает, когда есть только одна камера, но в этом случае оно не выполняет своего назначения.

Как правильно это сделать в такой ситуации?

введите описание изображения здесь

Редактировать:

 Plane plane = new Plane(new Vector3(0, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1));
float distance;

var mp = Input.mousePosition;
var mp2 = new Vector3(mp.x, mp.y, 100);
Ray ray = image2DCamera.ScreenPointToRay(mp2);
if (plane.Raycast(ray, out distance))
{
    worldPosition = ray.GetPoint(distance);
}

Debug.Log("mp : "   mp2);
Debug.Log("worldPosition : "   worldPosition);
 

Комментарии:

1. Итак, я не совсем понимаю, как именно вы хотите рисовать … какую камеру вы хотите использовать для рисования? Что-нибудь говорит против простого Physics.Raycast использования someCamera.ScreenPointToRay(Input.mousePosition) , а затем вычисления координаты пикселя из горячей точки?

2. В обеих ваших попытках вам не хватает расстояния до камеры как z компонента вектора .. вы проходите только в пространстве экрана Input.mousePosition , но у этого есть z = 0 .. вам нужно будет указать расстояние от камеры, как z в новом Векторе3

3. @derHugo я тоже использовал Physics.Raycast , но он дает тот же результат. Я добавил фрагмент кода по мере его проверки. Ибо Z , что бы он ни вводил, результат не меняется. Обратите внимание, что я делаю image2DCamera.ScreenPointToRay . Это решение не работает для mainCamera . Возвращает ошибку. У вас есть какие-нибудь идеи?

Ответ №1:

Мне удалось решить это простым способом. Без использования Ray и т. Д.

Ниже приведен код с добавленным кубом, который показывает, как мышь перемещается на экране пользовательского интерфейса ( RawImage ) и Plane в другом месте.

Он также отлично работает с Camera Zoom .

 public class MyController : MonoBehaviour
{
    public Camera portalCamera; // Camera for 2D View
    public RawImage texture2DView; // Rect on UI with 2D View

    GameObject mouseCube;

    DomaManager domaManager;

    void Start()
    {
        domaManager = DomaManager.Instance;

        mouseCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        mouseCube.name = "MouseCube";
        mouseCube.GetComponent<Renderer>().material.color = Color.blue;
        mouseCube.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
    }

    void Update()
    {
        var mp = Input.mousePosition;

        int marginLeft = Mathf.RoundToInt(((Screen.width - texture2DView.rectTransform.rect.width) / 2)   texture2DView.transform.localPosition.x);
        int marginBottom = Mathf.RoundToInt(((Screen.height - texture2DView.rectTransform.rect.height) / 2)   texture2DView.transform.localPosition.y);

        Rect rect2DUI = new Rect(marginLeft, marginBottom, texture2DView.rectTransform.rect.width, texture2DView.rectTransform.rect.height);

        if (rect2DUI.Contains(mp))
        {
            // Mouse Position in areaTexture2D
            var rectUIMousePosition = new Vector3(mp.x - rect2DUI.xMin, mp.y - rect2DUI.yMin, mp.z);

            // Position corners camera rect
            //var topRight = secondCamera.ViewportToWorldPoint(new Vector3(1, 1, secondCamera.nearClipPlane));
            //var topLeft = secondCamera.ViewportToWorldPoint(new Vector3(0, 1, secondCamera.nearClipPlane));
            //var bottomleft = secondCamera.ViewportToWorldPoint(new Vector3(0, 0, secondCamera.nearClipPlane));
            //var bottomRight = secondCamera.ViewportToWorldPoint(new Vector3(1, 0, secondCamera.nearClipPlane));

            // Mouse Position in camera area
            var positionInCameraRect = portalCamera.ViewportToWorldPoint(new Vector3(rectUIMousePosition.x / portalCamera.pixelWidth, rectUIMousePosition.y / portalCamera.pixelHeight, portalCamera.nearClipPlane));

            var realePositionInCameraRect = new Vector3(positionInCameraRect.x, 0, positionInCameraRect.z);

            // Cube follow Mouse Position
            mouseCube.transform.position = realePositionInCameraRect;
        }
    }
}
 

введите описание изображения здесь