unity3d获取屏幕坐标_unity 获取3d物体在屏幕上的坐标 - CSDN
  • Unity屏幕坐标转为世界坐标的思路

    千次阅读 2018-10-04 18:32:05
     坑1:获取屏幕坐标Input.mousePosition是一个2d坐标,z轴值为0,这个z值是相对于当前camera的,为零表示z轴与相机重合了,因此给ScreenToWorlfdPoint传值时,不能直接传Input.mousePosition,否则获取的世界坐标...

    1.使用ScreenToWorldPoint将获取的屏幕位置直接转成世界坐标:

                坑1:获取的屏幕坐标Input.mousePosition是一个2d坐标,z轴值为0,这个z值是相对于当前camera的,为零表示z轴与相机重合了,因此给ScreenToWorlfdPoint传值时,不能直接传Input.mousePosition,否则获取的世界坐标永远只有一个值;

                坑2:为了解决坑1,便使传入的z轴值,那么传什么值呢,可以取当前相机的z轴值绝对值,大概意思就是距离相机的距离,生成点的位置最后会在一个平面(因为传入的z值固定了),比较适合一个平面内取点

    2.射线检测,取得屏幕坐标,发射射线,取得碰撞信息,比较准确,射线碰到那个有碰撞器的位置,就返回这个位置

     Ray ray= mainCamera.ScreenPointToRay(screenPos);
                RaycastHit hit;
                bool ishit=Physics.Raycast(ray,out hit);
                if (ishit)
                {
                    Vector3 spacePos = hit.point;
                    print("screenPos:" + screenPos);
                    print("spacePos:" + spacePos);

               }

     

    如下图,

              黑色为方式一的,可以看出,生成的都在一个平面内,在一个斜的平面内,

              红色为方式二的,射线检测,碰撞到collider就返回碰撞信息,有一大串是因为点击一下,多次计算了点击位置,生成了多个小球,

     

    展开全文
  • Vector3[] corners = new Vector3[4]; gameObject.GetComponent().GetWorldCorners(corners); foreach (var item in corners) { ...出来的坐标的顺序是左下、左上、右上、右下
     Vector3[] corners = new Vector3[4];
    gameObject.GetComponent<RectTransform>().GetWorldCorners(corners);
    foreach (var item in corners)
    {
        Debug.Log(item);
    }

    出来的坐标的顺序是左下、左上、右上、右下 
    展开全文
  • 1、获取主摄像机的位置: private Vector3 _screenV; _screenV = _camera....作用是获取屏幕坐标的z轴坐标 2、获取屏幕坐标/鼠标点击坐标,设置z轴坐标 if (Input.GetMouseButtonDown (0)) { Vector3 dianV =

    1、获取主摄像机的位置:

    private Vector3 _screenV;
    _screenV = _camera.WorldToScreenPoint (cube.transform.position);
    作用是获取屏幕坐标的z轴坐标

    2、获取屏幕坐标/鼠标点击坐标,设置z轴坐标

    if (Input.GetMouseButtonDown (0)) 
    {
        Vector3 dianV = Input.mousePosition;
        dianV.z = _screenV.z;
    }
    3、转为世界坐标

    Vector3 wv = _camera.ScreenToWorldPoint(dianV);


    展开全文
  • Unity3D】世界坐标与屏幕坐标

    万次阅读 2017-05-08 17:42:04
    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。...其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。 在Unity3D中一打开就会有一个主照相机Main Camera,根

    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许许多多文字与代码或者API,甚至连什么视口坐标也带上了。其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。

    在Unity3D中一打开就会有一个主照相机Main Camera,根据版本不同的初始坐标会在不同的位置。拿Unity3D 4.x的(0,-1,-10)做例子,他的视距,默认是0.3~1000。


    主摄像机会对外无间断的发出投影面,将投影面所截取得到的东西,通通投影到屏幕。比如下图,这是一张极其简单的图,(0,-1,-10)的主摄像机将(0,0,0)的正方体投影出来的结果。


    现在这个正方体的世界坐标是(0,0,0),如果我们要获取屏幕坐标该怎么做呢?这注定需要用脚本来获取的,而且根据上面的示意图大家也可以知道,屏幕的大小的不同导致最后产生出来的屏幕坐标是不同的。因为Unity3D对屏幕坐标定义是这样的:


    以下脚本展示了屏幕坐标和世界坐标的互转:

    using UnityEngine;
    using System.Collections;
    
    public class CoordinateChange : MonoBehaviour
    {
        void Start()
        {
            Debug.Log("屏幕宽:" + Screen.width + "高:" + Screen.height);//获取屏幕的长和宽
            Vector2 screenPos = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));//世界坐标(0,0,0),一般可以用transform.position获取->屏幕坐标
    
            //屏幕坐标->世界坐标
            Debug.Log(screenPos.x + "," + screenPos.y);
            Vector3 worldPos1 = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, Camera.main.nearClipPlane));
            Debug.Log(worldPos1.x + "," + worldPos1.y + "," + worldPos1.z);
            Vector3 worldPos2 = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, -Camera.main.transform.position.z));
            Debug.Log(worldPos2.x + "," + worldPos2.y + "," + worldPos2.z);
        }
    }
    
    运行结果如下:


    上面脚本有几点需要说明的:

    1、Camera.main.XX能够直接对主摄像机操作,无须像网上部分文章需要利用的GameObject.Find之类的找主摄像机。

    2、世界坐标与屏幕坐标互转直接就是用WorldToScreenPoint/ScreenToWorldPoint两个方法,这方法凡是照相机对象就有。在部分设置多摄像机编程的程序,就是转换到调用的摄像机所对应的屏幕的世界。

    3、WorldToScreenPoint世界坐标转屏幕坐标,很好理解,大家也看到(0,0,0)这个世界的三维坐标转到的(431.5,174.4537)这个屏幕的二维坐标Vector2 screenPos。这里屏幕宽:863高:422,处于(0,0,0)的长方体被投影到屏幕的中央偏下的位置,这和实际是吻合的。

    当然实际操作中,其实这个屏幕坐标的多少对于我们来说是没意义的,但这个屏幕坐标所处的位置是在屏幕的百分之多少是很有意义的。所以,这一般还要配合Screen.width/height求屏幕的宽和高用。

    4、对于ScreenToWorldPoint,屏幕坐标转世界坐标,可能有人会有疑问,屏幕坐标不是一个二维坐标,怎么这里试图对一个三维坐标转换?还在Z轴附带一些奇怪奇怪的位置。这里的Z轴,是投影面底部所处的Z轴位置距离摄像机Z轴的多少。上面的投影示意图,已经可以说明投影面是多个的,但只会投影到一个2D屏幕平面而已,世界中的物体/对象只能有一个,那么就形成一种 一个世界坐标只会对应一个屏幕坐标,一个屏幕坐标可能对应多个世界坐标。所以我们要补上一个Z轴,告诉程序,我要的是哪个屏幕坐标。

    这里展示了将(0,0)这个左下角的屏幕坐标,转到距离摄像机最近的投影面上面,要拿这个投影面,如脚本所示,可以直接用Camera.main.nearClipPlane来取。还展示了将(Screen.width, Screen.height)这个右上角的屏幕坐标,放到Z轴为0,也就是世界屏幕的这个位置,因为摄像机所处的Z=-10,要放到世界坐标z=0,所以这里的Z轴要填上-Camera.main.transform.position.z,刚好就是-10-0。结果如上图所示。

    理论上,投影面距离摄像头越近,他的投影面越小。所以大家看到如果转到距离摄像机最近的投影面上面,边角的坐标是0.x级别的,放到z=0这个投影面上面,边角的坐标则去到个位数级别。

    展开全文
  • Vector3[] corners = new Vector3[4]; gameObject.GetComponent<RectTransform>().GetWorldCorners(corners); foreach (var item in corners) { Debug.Log(item); }
  • Unity3d 获取屏幕中心位置

    万次阅读 2017-06-26 12:17:43
    new Vector3(Screen.width/2,Screen.height/2,0);
  • Unity3d 中如何获取任意UI组件Rect的左下角与右上角在屏幕坐标
  • 获取鼠标的坐标,然后移动模型,也就是模型跟随鼠标。怎么实现? Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position); // 目的获取z,在Start方法 Vector3 mousePos = Input.mousePosition...
  • Unity3D ugui获取ui控件屏幕坐标

    千次阅读 2020-03-05 19:30:36
    如何获取多层ui控件坐标? UI控件位置转换 如上所示我想获取c物体 >> canvas里,并且位置不变,咋获取? 这里直接用Unity提供的方法就行了。 但是如果用的是Screen Space-camera就有些麻烦了 需要这样获取 ...
  • Unity Shader 中获取屏幕坐标

    千次阅读 2019-02-02 10:49:50
    项目中有时会有一些效果需求,如重建片元在世界空间的坐标...在Unity中有三种方法可以获取屏幕坐标。 SV_POSITION 语义的xy变量 struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; ...
  • unity3d ugui中如何获取ui控件位置?或者说如何将ugui中ui控件(组件)的坐标转化为屏幕坐标或canvas坐标(大坑)? 网上有一些转化坐标的方法,但我试了后发现都有问题,有一些方法和锚点的位置是有关的,...
  • Unity3D整理——坐标

    千次阅读 2018-03-06 14:45:03
    Unity3D中,坐标系至少存在如下三种:世界坐标系、屏幕坐标系和视口坐标系。(当然,在世界坐标系中的坐标叫世界坐标; 屏幕坐标 和 视口坐标 定义同理,不再赘述。)其一,世界坐标世界坐标,是Unity3D里面每一个...
  • unity3d中的屏幕坐标系 是以 屏幕 左下角为(0,0)点 右上角为(Screen.Width,Screen.Height) 鼠标位置坐标与屏幕坐标系一致 视口坐标是以摄像机为准 以屏幕的左下角为(0,0)点 右上角为(1,1)点 绘制GUI界面...
  • unity3d 参考坐标系  参考坐标系(Reference Coordinate System)列表是让你指定用于变换(移动move、旋转rotate和缩放scale)的坐标系。选项包括视图坐标view,屏幕坐标screen,世界坐标world,父坐标parent,...
  • 这个变量是 Input.mousePosition这个变量是用户点击的屏幕坐标(像素坐标),左下角是(0,0)右上角是X和Y的最大像素,可以理解为分辨率。 这个方法是Camera.main.ScreenToWorldPoint()。这个方法是将屏幕坐标转换...
  • 世界坐标: transform.position获取的是世界坐标   屏幕坐标: 单位像素 屏幕左下角(0,0)右上角(Screen.width,Screen.height) Screen.width = Camera.main....可通过Input.mousePosition获取屏幕坐标 ...
  • 鼠标点击位置:直接调用Input.mousePosition()方法,返回一个三维屏幕坐标,即鼠标的坐标...UI物体的屏幕坐标:RectTransformUtility.WordToScreenPoint(Camera.main, rectTransform.position),返回的是二维屏幕坐标
  • unity3d鼠标点击,获取世界坐标

    万次阅读 2014-07-04 02:38:10
    但不得不说,这个函数不到位,可以用一个print函数输出一下这个坐标会发现,只有X,Y值在改变,Z值没有发生变化,并且在屏幕的左下角固定为(0,0,0),查看文档后发现,文档上是这么写的。 The current mouse ...
  • unity3D鼠标点击获取地面坐标

    千次阅读 2015-11-19 10:51:28
    写在前面:本人初学unity3D,仅仅是菜鸟的一点小心得,想记录下来,欢迎大神来指导,也欢迎其他初学者同学来交流,互相勉励,共同进步 unity中有关于鼠标位置的函数,Input.mousePosition。但不得不说,这个函数不...
  • unity3D获取屏幕宽高

    千次阅读 2017-10-14 09:40:11
    这里要用到一个摄像机函数Camera.ViewportToWorldPoint, Unity官方对其定义为:  Camera.ViewportToWorldPoint 视窗转世界位置  function ViewportToWorldPoint (position : Vector3) : Vector3 Description...
1 2 3 4 5 ... 20
收藏数 2,877
精华内容 1,150
关键字:

unity3d获取屏幕坐标