首页 > 其他分享 >屏幕坐标转世界坐标

屏幕坐标转世界坐标

时间:2024-08-09 16:28:42浏览次数:10  
标签:position mousePosition 世界坐标 坐标 eventData using 屏幕 public

前提:

1.修改 渲染模式

Render Mode 为Screen Space - Camera

2. 修改 投影模式

Projection  为 Perspective (透视模式)

persp 透视模式-2D

Los    正交模式-3D

屏幕坐标 转为 世界坐标

方法一:

将鼠标的屏幕坐标 转为 世界坐标(物体随着鼠标移动)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragManager : ListenerEvent
{
    public GameObject target;
    public Camera UIcamera;

    void Start()
    {
        target.SetActive(false);
    }
    void Update()
    {
      
        if (Input.GetMouseButton(0)&&!SysDefault.isMove)
        {
            target.SetActive(true);
            // 将鼠标屏幕坐标转换为世界坐标
            Vector3 mousePosition = Input.mousePosition;
            // 设置鼠标位置的 z 坐标与 UI 相机相距的距离
            mousePosition.z = UIcamera.nearClipPlane; // 你可以根据需要调整这个值(100)
            Vector3 worldPosition = UIcamera.ScreenToWorldPoint(mousePosition);
            target.transform.position = worldPosition;
        }
    }
  
}
  • mousePosition.z: 设置鼠标位置的 z 坐标为相机的近裁剪面距离 
  • ScreenToWorldPoint(vector3 position): 将鼠标的屏幕坐标转换为世界坐标。

方法二:

在拖拽物体时,将屏幕坐标转为世界坐标

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems; // 导入命名空间 可使用拖拽 相关的接口

public class DragHandle : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler,IPointerDownHandler,IPointerUpHandler
{
   //拖拽中
   public void OnDrag(PointerEventData eventData)
    {
        Vector3 worldPos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.pressEventCamera, out worldPos))
        {
            transform.position = worldPos;
        }
        //transform.position = Input.mousePosition;
        
    }
}
  • public static bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint);
  • RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.pressEventCamera, out worldPos)
  1. eventData为pressEventCamera,可以正常使用
  2. 如果eventData为enterEventCamera,拖动的速度加快会消失在 屏幕上,如果为其他物体的子级将不会出现问题,但父级要充满屏幕

(方法二:未深入了解)

标签:position,mousePosition,世界坐标,坐标,eventData,using,屏幕,public
From: https://blog.csdn.net/LFJINNAN/article/details/141063259

相关文章

  • 在线带壳屏幕截图工具推荐:MockUPhone
    简介MockUPhone是一款免费的在线工具,用于生成带壳屏幕截图。这款工具主要面向开发者、设计师以及产品经理等人群,他们可以利用MockUPhone将UI设计或屏幕截图展示在各种不同类型的设备模型上,如智能手机、平板电脑、个人电脑、电视甚至是可穿戴设备。官网https://mockuphone.com/......
  • 用echarts绘制图表时,横坐标数据太多显示不全/堆叠的解决方法
    一、横坐标数据过多可能出现的问题1、横坐标文字堆叠2、横坐标显示不全(数据2,数据4,数据6,数据8,数据10,数据12,数据14均没有显示出来)二、解决方法1、使用rotate属性给echarts的横坐标标签设置旋转角度xAxis:{type:'category',data:xAxis,......
  • 为什么点击鼠标后屏幕上没有出现 X?
    我想实现程序在按下鼠标的位置将“X”传送到屏幕上的功能。然而,一旦我运行该程序,什么也没有出现。take_turn函数将值存储在二维数组中,并将鼠标单击的位置存储在名为“positions”的列表中。然后,在主游戏循环中,应将X放置在通过位置列表迭代的所有位置中。我应该如何修改我的代......
  • 点云_图像--坐标中心和角点
    图像2D框boundingbox目标框(boundingbox)来描述目标的位置,目标框是矩形的。由矩形左上角的坐标(x1,y1)以及右下角的坐标(x2,y2)进行表示。另外,还可以采用边界框矩形的中心坐标(xc,yc)以及宽高(w,h)进行表示(1)"左上-右下"转换为"中心-宽高"defbox_corner_to_center(boxes):......
  • Unity使用多屏幕Display以及不同屏幕的射线检测
    0.背景最近在做一个双屏游戏,一个场景中有两个摄像机,分别渲染到两个屏幕显示,然后在点击不同的屏幕时,要从不同的摄像机发射射线检测与场景中的物体交互。1.设置多屏unity中设置多屏的方式很简单,选中摄像机组件中的TargetDisplay属性即可。2.显式地激活连接的屏幕在确保连......
  • canvas调整基点(中心点:x、y坐标所针对的点位)
    在canvas中,可以使用textAlign和textBaseline属性来调整文字的基准点 textAlign属性:用于设置文字的水平对齐方式。start(默认,基准点在文字左端) end(基准点在文字右端) center(基准点在文字中心) left(基准点在文字左端) right(基准点在文字右端)  textBaseline属性:用......
  • 用Manim在图形和坐标轴上画线条
     用Manim在图形和坐标轴上画线条.画图像函数的切线angle_of_tangent(x,graph,dx=1e-08)angle_of_tangent(x,graph,dx=1e-08)是Manim中用于计算图形在给定点的切线角度的函数。以下是对该函数参数的解释:参数说明x:这是你想要计算切线角度的x坐标。在这个坐标处,......
  • Manim系列——创建并使用坐标系统
    到目前为止,我们一直在研究表单的功能具有一个自变量和一个因变量。这些函数可以在二维空间中表示,使用两个数值轴,使我们能够用两个数字识别平面中的每个点。我们现在想谈谈三维空间;为了识别三维空间中的每个点,我们需要三个数值。建立这种关联的明显方法是添加一个新轴,垂直于和......
  • 基于STM32-OLED多级菜单(LCD等等屏幕均可移植)
    一,内容概括:不使用长篇大论1:多级菜单介绍2:实现思路3:代码编写4:总结二,正文1.多级菜单介绍:想必大家看到这里,也知道多级菜单大概是什么;对于还不太清楚的朋友说明以下,多级菜单就是将一块屏幕原本只能显示一种内容,扩展到可以显示很多内容。依据自己的设定显示内容。2.实现思路......
  • 高德地图API使用(根据地址查经纬度,计算二个坐标之间的距离)
    高德地图API使用(根据地址查经纬度,计算二个坐标之间的距离) 根据地址查经纬度:https://restapi.amap.com/v3/geocode/geo?address=广西壮族自治区南宁市西乡塘区衡阳西路34号&output=JSON&key=38f05ba13d4324325返回:  {"status":"1","info":"OK","infocod......