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