#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
в новом Векторе33. @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;
}
}
}