C# 如何将画布上的对象坐标转换为屏幕坐标?

C# 如何将画布上的对象坐标转换为屏幕坐标?,c#,unity3d,canvas,C#,Unity3d,Canvas,我的代码正在更新中: if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if(touch.phase == TouchPhase.Began) { touchPosition = touch.position; if(arRaycastManager.Raycast(touchPosition, hits

我的代码正在更新中:

    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        if(touch.phase == TouchPhase.Began)
        {
            touchPosition = touch.position;

            if(arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
            {
                Pose hitPose = hits[0].pose;//ok
            }
        }
     }
但现在我必须使用操纵杆使指针在屏幕上移动,然后按下按钮来做一些事情

像这样:

    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");
    fakeFinger.GetComponent<RectTransform>().anchoredPosition += new 
    Vector2(h * vel * Time.deltaTime, v * vel * Time.deltaTime);
    //this move a pointer on my screen... I had to use RectTransform... dont know if its right

    if (considerjoystickbuttonpressedok)
    {
        touchPosition = new Vector2(fakeFinger.GetComponent<RectTransform>().anchoredPosition.x,
                                    fakeFinger.GetComponent<RectTransform>().anchoredPosition.y);
         //still dont know if its right above...

        if (arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
        {
            Pose hitPose = hits[0].pose;//NOT OK!
        }
    }
float h=Input.GetAxis(“水平”);
浮点v=输入。GetAxis(“垂直”);
fakeFinger.GetComponent().anchoredPosition+=新建
向量2(h*vel*Time.deltaTime,v*vel*Time.deltaTime);
//这将在我的屏幕上移动指针。。。我必须使用RectTransform。。。不知道这是否正确
如果(考虑操纵杆按钮按下OK)
{
touchPosition=新矢量2(fakeFinger.GetComponent().anchoredPosition.x,
fakeFinger.GetComponent().anchoredPosition.y);
//还是不知道它是否就在上面。。。
if(arRaycastManager.Raycast(touchPosition、hits、UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
{
姿势hitPose=点击[0]。姿势;//不正确!
}
}
关于如何解决这个问题有什么想法吗?

使用System.Collections.Generic;
public Vector3 GetScreenPosition()
{
    RectTransform rectTransform = (RectTransform)transform;
    Vector4 worldLocation = transform.localToWorldMatrix * new Vector4(rectTransform.anchoredPosition3D.x,
                                                   rectTransform.anchoredPosition3D.y,
                                                   rectTransform.anchoredPosition3D.z,
                                                   1);

    return yourCamera.WorldToScreenPoint(new Vector3(worldLocation.x, worldLocation.y, worldLocation.z));
}
使用UnityEngine; 使用UnityEngine.XR.ARFoundation; 公共类SomeClassOnMyAssessionRiginthatsMyArCamera:MonoBehavior { public ARCameraManager ARCameraManager;//它是另一个孩子 公共ARRaycastManager ARRaycastManager; 私有静态列表点击次数=新建列表(); 私有向量2 touchPosition=默认值; 公共游戏对象起始点; 公共游戏对象端点; 公共游戏对象startPointbyJoy; 公众游戏对象; 公共游戏对象手指;//它是一个画布 公共浮动水平; 无效更新() { float h=输入。GetAxis(“水平”); 浮点v=输入。GetAxis(“垂直”); finger.GetComponent().anchoredPosition+=新矢量2(h*vel*Time.deltaTime,v*vel*Time.deltaTime); if(Input.GetKey(KeyCode.JoystickButton13)) { Vector3 fingerScreenPos=GetScreenPosition(手指); touchPosition=newvector2(fingerscreenspos.x,fingerscreenspos.y);//这里我使用这个方法 if(arRaycastManager.Raycast(touchPosition、hits、UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon)) { startPointbyJoy.SetActive(true); 姿势hitPose=点击[0]。姿势; startPointbyJoy.transform.SetPositionAndRotation(hitPose.position,hitPose.rotation); } } if(Input.GetKey(KeyCode.JoystickButton12)) { Vector3 fingerScreenPos=GetScreenPosition(手指); touchPosition=newvector2(fingerscreenspos.x,fingerscreenspos.y);//这里我使用这个方法 if(arRaycastManager.Raycast(touchPosition、hits、UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon)) { endPointbyJoy.SetActive(true); 姿势hitPose=点击[0]。姿势; endPointbyJoy.transform.SetPositionAndRotation(hitPose.position,hitPose.rotation); } } 如果(Input.touchCount>0)//这些都正常 { Touch-Touch=Input.GetTouch(0); if(touch.phase==TouchPhase.start) { touchPosition=touch.position; if(arRaycastManager.Raycast(touchPosition、hits、UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon)) { startPoint.SetActive(true); 姿势hitPose=点击[0]。姿势; startPoint.transform.SetPositionAndRotation(hitPose.position,hitPose.rotation); } } 如果(touch.phase==TouchPhase.Moved) { touchPosition=touch.position; if(arRaycastManager.Raycast(touchPosition、hits、UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon)) { endPoint.SetActive(true); 姿势hitPose=点击[0]。姿势; 端点.transform.SetPositionAndRotation(hitPose.position,hitPose.rotation); } } } } 公共矢量3 GetScreenPosition(游戏对象手指) { //这里。我应该得到哪个“变换”呢?维吾尔手指? //此脚本附加到的go? RectTransform=(RectTransform)finger.transform; Vector4 worldLocation=rectTransform.localToWorldMatrix*新Vector4(rectTransform.anchoredPosition3D.x, rectTransform.anchoredPosition3D.y, rectTransform.anchoredPosition3D.z, 1); //使用arcamera有什么不同吗? 返回arCameraManager.GetComponent().WorldToScreenPoint(新矢量3(worldLocation.x,worldLocation.y,worldLocation.z)); } }
您好,先生@Brian,谢谢您的回答。它帮助我找到了方向,但还没有完全实现。请看这张图片:我们有一个“触摸开始”和一个“触摸结束”的位置,点击屏幕,我在那里测量我的Mac,“手指距离”,没问题。我用操纵杆把指针(手指)放在世界上相同的位置,测量我的Mac电脑。在左边,我们有“快乐开始”和“快乐结束”的位置。。。和“快乐的距离”。完全不同。。。但是到目前为止最好的结果。。。我会用另一个注释来写代码:哦,天哪,不能把代码作为注释发布,回答了我自己的问题。。。我认为stackoverflow社区会杀了我……无论如何,我将GetScreenPosition()方法改成了我能得到的最好的方法,这就是制作上面截图的版本。我想我误解了使用哪种转换是的,这是正确的,如果我这样做,我会做和你一样的事情。我会使用像Changes这样的代码
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR.ARFoundation;

    public class SomeClassOnMyARSessionOriginThatContainsMyARCamera : MonoBehaviour
    {     
     public ARCameraManager arCameraManager;//its another child go
     public ARRaycastManager arRaycastManager;
     private static List<ARRaycastHit> hits = new List<ARRaycastHit>();
     private Vector2 touchPosition = default;

     public GameObject startPoint;
     public GameObject endPoint;
     public GameObject startPointbyJoy;
     public GameObject endPointbyJoy;

     public GameObject finger;//It´s a UICanvas
     public float vel;

     void Update()
     {        
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        finger.GetComponent<RectTransform>().anchoredPosition += new Vector2(h * vel * Time.deltaTime, v * vel * Time.deltaTime);

        if (Input.GetKey(KeyCode.JoystickButton13))
        {
            Vector3 fingerScreenPos = GetScreenPosition(finger);
            touchPosition = new Vector2(fingerScreenPos.x, fingerScreenPos.y);//here I use that method

            if (arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
            {
                startPointbyJoy.SetActive(true);
                Pose hitPose = hits[0].pose;
                startPointbyJoy.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);
            }
        }
        if (Input.GetKey(KeyCode.JoystickButton12))
        {            
            Vector3 fingerScreenPos = GetScreenPosition(finger);
            touchPosition = new Vector2(fingerScreenPos.x, fingerScreenPos.y);//here I use that method

            if (arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
            {
                endPointbyJoy.SetActive(true);
                Pose hitPose = hits[0].pose;
                endPointbyJoy.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);
            }
        }

        if (Input.touchCount > 0)//these are OK
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                touchPosition = touch.position;
                if (arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
                {
                    startPoint.SetActive(true);
                    Pose hitPose = hits[0].pose;
                    startPoint.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);

                }
            }
            if(touch.phase == TouchPhase.Moved)
            {
                touchPosition = touch.position;                
                if(arRaycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
                {                    
                    endPoint.SetActive(true);
                    Pose hitPose = hits[0].pose;
                    endPoint.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation);
                }
            }
        }
    }

    public Vector3 GetScreenPosition(GameObject finger)
    {
    //HERE. Which "transform" should I get? The UICancas finger?
    //The go this script is attached to?
        RectTransform rectTransform = (RectTransform)finger.transform;
        Vector4 worldLocation = rectTransform.localToWorldMatrix * new  Vector4(rectTransform.anchoredPosition3D.x,
                                                        rectTransform.anchoredPosition3D.y,
                                                        rectTransform.anchoredPosition3D.z,
                                                       1);

        //is it different using a arcamera?
        return arCameraManager.GetComponent<Camera>().WorldToScreenPoint(new Vector3(worldLocation.x, worldLocation.y, worldLocation.z));
     }
    }