【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint

之前写了一篇关于在物体头顶上显示名字的随笔。

估计难懂的点就在各种坐标的转换。

这里详细(就我这水平,怎么可能详细~~~)解说一下。额.............

用另一种方式举个栗子吧。

还是实现在物体的头顶或某个部位显示UI并跟随物体的移动改变位置。

先把栗子端上来:

public Transform Boy;//帅帅的主角
public Transform UI;//对主角死缠烂打的UI君
Camera cam;//主相机
void Update ()
{

UI.localPosition = cam.WorldToScreenPoint(Boy.position) - new Vector3(Screen.width / 2, Screen.height / 2, 0);
}

好长一串儿代码急死人。听我慢慢道来~

首先无非就是求UI的localPosition 。

我们先把主角物体的世界坐标转换成屏幕坐标cam.WorldToScreenPoint(Boy.position)。然后这个值就变成了主角显示在屏幕上的坐标,相对应的就好比是Screen.width这种,对,它们是一个次元的。

然并卵,我们的UI的坐标可是相对于UI Root来的~

怎么办呢~

注意看这张我截取的NGUI的小破图:

,UI Root下边的子UI们的(0,0,0)是在屏幕的正中心。而屏幕坐标系的(0,0,0)呢~在屏幕的左下角,所以它们之间,差了半个屏幕的宽和高。

真相只有一个,用得到的物体的屏幕坐标减去半个屏幕的宽和高,就可以得到ui的相对坐标啦~~~~~~~~~~~~~~~~~~~~~~~~

那么,之前那个栗子是什么意思呢:

 Vector3 pos = cam.WorldToViewportPoint(Boy.position);
 UI.transform.position = UIcam.ViewportToWorldPoint(pos);第一句是先得到主角相对于视窗的视口坐标。第二句是将得到的视口位置再转化为世界坐标。纳尼?

额,视口坐标是相对于相机的。相机的左下为(0,0);右上是(1,1)。

但是呢,仔细看两个的视口坐标是相对于哪个相机的~

思路也就是这样:把这个物体的世界坐标相对应的世界相机的视口坐标找到,再把这个坐标对应到UI相机上,然后求出来这个UI相机上这个位置的视口坐标在3D世界里的位置。

杀了我吧~~~~~~~~~~~~~~~~~~~~~~~~~凌乱成一朵烟花。

				
时间: 2024-11-10 07:39:27

【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint的相关文章

经纬度坐标与高斯坐标的转换代码(转)

原文:http://www.cnblogs.com/SuperMagic/archive/2007/12/04/982817.html /* 功能说明: 将绝对高斯坐标(y,x)转换成绝对的地理坐标(wd,jd).        */// double y;     输入参数: 高斯坐标的横坐标,以米为单位 // double x;  输入参数: 高斯坐标的纵坐标,以米为单位// short  DH;     输入参数: 带号,表示上述高斯坐标是哪个带的// double *L;     输出参

Flex各类型坐标转换(全局、本地、内容坐标间转换)

Flex包含3种坐标:全局坐标.本地坐标.内容坐标 全局坐标:stage级别,坐标原点为舞台的左上角,如MouseEvent的stageX.stageY坐标. 本地坐标:组件级别的坐标系,相对坐标,坐标原点为相对的组件的左上角,如MouseEvent的localX.localY坐标,以及容器中组件的x.y属性都为本地相对坐标. 内容坐标:组件级别的坐标系,相对坐标,在有滚动条的情况下,全部内容所占的区域的坐标系,坐标原点为相对的组件的左上角,可以理解为包含滚动条的整个内容面板为一个坐标系.如组件

使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

[摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换简介 坐标系统之间的坐标转换既包括不同的参心坐标之间的转换,或者不同的地心坐标系之间的转换,也包括参心坐标系与地心坐标系之间的转换以及相同坐标系的 直角坐标与大地坐标之间的坐标转换,还有大地坐标与高斯平面坐标之间的转换.在两个空间角直坐标系中,假设其分别为O--XYZ和O--XYZ,如果两个 坐标系

cocos creator基础-cc.Node(三)坐标空间转换

cc.Vec2 1: cc.Vec2 二维向量坐标, 表结构{x: 120, y: 120}; cc.v2(x, y) 创建一个二维向量 cc.p() 创建一个二维向量(这个2.0被废弃了,用cc.v2替代) 2: cc.pSub: 向量相减 cc.pSub(v1, v2) 被废弃,用v1.sub(v2)替代 3: cc.pAdd: 向量相加; cc. cc.pAdd(v1, v2) 被废弃,用v1.add(v2)替代 4: cc.pLength: 向量长度; cc.pLength(dir)被废

unity中mesh属性的uv坐标讨论

http://blog.sina.com.cn/s/blog_427cf00b0102vp0j.html 之前在做连连看游戏中,也用到贴图坐标,当时我们讲到,不管是平铺(Tiling)还是偏移(Offset),我们参考的基准都是原始的那张图,Tiling配合Offset,Tiling负责截取,Offset负责移动,最终实现截取贴图的任一部分?,但是这种方法弄出的图形形状都是方块的,无法实现任意的贴图 而下面要讨论的方法和上面的方法会大不一样,会从UV坐标的角度去讨论,从而实现想怎么贴就怎么贴的效

unity 获取和设置gameObject的坐标

// 获取player_postion变量指定的对象的三围坐标 Vector3 player_postion = Player.transform.position; // 获取X,Y,Z值 float x = player_postion.x; float y = player_postion.y; float z = player_postion.z; // 设置应用了当前函数的GameObject的坐标 // 1.直接赋值 this.GetComponent<Transform>().p

关于Unity中的世界坐标和局部坐标

1.物体的局部坐标的方向(物体自身的方向) transform.forward. transform.right. transform.up 2.物体的世界坐标的方向 Vector3.forward. Vector3.right. Vector3.up 例子: 子弹沿自身坐标轴的Z轴方向运动 Vector3 v = this.transform.forward * this.speed; this.body.velocity = v; 注意: 父节点在Scene视图中显示出来的位置并非真正的In

Unity 通过Animation实现控件位置的转换

Unity版本:4.5.1 NGUI版本:3.6.5 参考链接:http://blog.csdn.net/unity3d_xyz/article/details/23035521,作者:CSDN inspironx 在Unity中可以用Animation实现控件位置的转换,大小的变化等等,即用动画实现,NGUI中可以用Tween实现.这里用Panel的位置转换为例说明. 1.创建一个Panel面板,如下图: 2.为Panel添加Animation组件: 可以看到Panel中Animation组件

[C#]利用纠偏数据来处理地球坐标(WGS-84)与火星坐标 (GCJ-02)转换

关键代码: using System; using System.Collections; using System.Collections.Generic; using System.IO; using YanZhiwei.DotNet2.Utilities.Models; namespace YanZhiwei.DotNet2.Utilities.Common { /// <summary> /// 地图纠偏数据帮助类 /// </summary> public class M