Unity3d 内部摄像机上的鼠标位置

Unity3d 内部摄像机上的鼠标位置,unity3d,Unity3d,我有什么: Camera2D,在全局系统中水平俯视平面 来自Camera2D的图像保存到Texture2D main摄像机从UI 在画布中有一个RawImage,为其分配了Texture2D 简言之,在主界面中我有一个屏幕,显示另一台相机的内容。 我的问题是: 我想在平面上画些东西 为此,我需要在全局坐标系中找到鼠标位置的映射 我试着用不同的方法做这件事 var mp = Input.mousePosition; var vec = mainCamera.ScreenToWorldPoi

我有什么:

  • Camera2D
    ,在全局系统中水平俯视平面
  • 来自Camera2D的图像保存到Texture2D
  • main摄像机
    UI
  • 画布中有一个
    RawImage
    ,为其分配了Texture2D
简言之,在主界面中我有一个屏幕,显示另一台相机的内容。

我的问题是:

  • 我想在平面上画些东西
  • 为此,我需要在全局坐标系中找到鼠标位置的映射
我试着用不同的方法做这件事

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);

我设法用一种简单的方法解决了这个问题。不使用射线等

下面是添加了立方体的代码,该立方体显示鼠标如何在UI屏幕(
RawImage
)和另一个位置的
平面上移动

它也适用于
相机缩放

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;
        }
    }
}
公共类MyController:MonoBehavior
{
公共摄像机portalCamera;//用于二维视图的摄像机
public RawImage texture2DView;//在具有2D视图的UI上执行Rect
游戏对象鼠标;
多马纳格多马纳格;
void Start()
{
domaManager=domaManager.Instance;
mouseCube=GameObject.CreatePrimitive(PrimitiveType.Cube);
mouseCube.name=“mouseCube”;
mouseCube.GetComponent().material.color=color.blue;
mouseCube.transform.localScale=新矢量3(0.2f、0.2f、0.2f);
}
无效更新()
{
var mp=Input.mousePosition;
int marginLeft=Mathf.RoundToInt(((Screen.width-texture2DView.rectcransform.rect.width)/2)+texture2DView.transform.localPosition.x);
int marginBottom=Mathf.RoundToInt(((Screen.height-texture2DView.rectcransform.rect.height)/2)+texture2DView.transform.localPosition.y);
Rect rect2DUI=new Rect(边距左侧、边距底部、texture2DView.rectTransform.Rect.width、texture2DView.rectTransform.Rect.height);
if(rect2DUI.Contains(mp))
{
//鼠标在区域纹理2d中的位置
var rectUIMousePosition=newvector3(mp.x-rect2DUI.xMin,mp.y-rect2DUI.yMin,mp.z);
//位置角摄影机矩形
//var topRight=secondCamera.ViewportToWorldPoint(新矢量3(1,1,secondCamera.nearClipPlane));
//var topLeft=secondCamera.ViewportToWorldPoint(新矢量3(0,1,secondCamera.nearClipPlane));
//var bottomleft=secondCamera.ViewportToWorldPoint(新矢量3(0,0,secondCamera.nearClipPlane));
//var bottomRight=secondCamera.ViewportToWorldPoint(新矢量3(1,0,secondCamera.nearClipPlane));
//相机区域中的鼠标位置
var positionInCameraRect=portalCamera.ViewportToWorldPoint(新向量3(rectUIMousePosition.x/portalCamera.pixelWidth,rectUIMousePosition.y/portalCamera.pixelHeight,portalCamera.nearClipPlane));
var realePositionInCameraRect=新向量3(positionInCameraRect.x,0,positionInCameraRect.z);
//立方体跟随鼠标位置
mouseCube.transform.position=realePositionInCameraRect;
}
}
}

所以我不太明白你到底想画什么。。。您希望使用哪台相机进行绘图?是否有任何东西反对简单的
物理。光线投射
使用
someCamera.ScreenPointRoay(Input.mousePosition)
然后从热点计算像素坐标?在这两次尝试中,你都忽略了向量的
z
分量与相机的距离。。您只传入屏幕空间
Input.mousePosition
,但此空间具有
z=0
。。您必须以新的方式提供与摄像头的距离,即
z
Vector3@derHugo我还使用了
Physics.Raycast
,但它给出了相同的结果。我在检查时添加了一个代码段。对于
Z
,无论他输入什么,结果都不会改变。请注意,我正在执行
image2DCamera.screenpointoray
。此解决方案不适用于
mainCamera
。返回一个错误。你知道吗?