【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世界里的位置。
杀了我吧~~~~~~~~~~~~~~~~~~~~~~~~~凌乱成一朵烟花。
【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint的更多相关文章
- Unity 屏幕坐标到UGUI RectTransform本地坐标的转换
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camer ...
- arcgis server 中Web墨卡托投影与WGS-84坐标的转换
arcgis server 中Web墨卡托投影坐标与WGS-84坐标的转换 //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={x:0, ...
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
[摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...
- unity中mesh属性的uv坐标讨论
http://blog.sina.com.cn/s/blog_427cf00b0102vp0j.html 之前在做连连看游戏中,也用到贴图坐标,当时我们讲到,不管是平铺(Tiling)还是偏移(Off ...
- 关于Unity中的世界坐标和局部坐标
1.物体的局部坐标的方向(物体自身的方向) transform.forward. transform.right. transform.up 2.物体的世界坐标的方向 Vector3.forward. ...
- 【Unity笔记】屏幕坐标和鼠标坐标
屏幕坐标:左下角为原点. void Update(){ // 获取物体的屏幕坐标,世界坐标->屏幕坐标 Vector3 screenPos = Camera.main.WorldToScreen ...
- Unity Scene视图下 输出物体坐标等信息
using UnityEditor; using UnityEngine; [CustomEditor(typeof(GameObject))] public class MyEditor : Edi ...
- Flex各类型坐标转换(全局、本地、内容坐标间转换)
Flex包含3种坐标:全局坐标.本地坐标.内容坐标 全局坐标:stage级别,坐标原点为舞台的左上角,如MouseEvent的stageX.stageY坐标. 本地坐标:组件级别的坐标系,相对坐标,坐 ...
- Unity 通过Animation实现控件位置的转换
Unity版本:4.5.1 NGUI版本:3.6.5 参考链接:http://blog.csdn.net/unity3d_xyz/article/details/23035521,作者:CSDN in ...
随机推荐
- Java判断对象是否为Null/空
package com.taiping.test; import java.lang.reflect.Field; import java.lang.reflect.Type; /** * <p ...
- 路由器安全-FPM
1.FPM(也叫NGACL) FPM是Cisco IOS新一代的ACL,叫做Flexible Packet Matching,灵活的包匹配. 根据任意条件,无状态的匹配数据包的头部,负载,或者全部. ...
- 无线客户端掉线(Disassociate and DeleteReason)
- PW数据库ER图
- excel 动太生成sql 复制(ctrl+c)即可使用 【即用excel中concatenate函数拼接sql】
如图所示:有test_user表 id(自增).code.name.age.create_time几个字段. 使用函数:=CONCATENATE("insert into test_user ...
- [03] Recursive Function递归应用
递归应用 1.理解 百科:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的: 理解:函数调用自己的过程,这类函数处理的事情具有重复性,处理此类实行可用while或者for,但结构上 ...
- C语言-数组与指针 字符与字符串
1 字符与字符串:char c='a'而不能写出char c="a" //字符变量用单引号'',而字符串用双引号. 2 字符数组与字符指针的初始化: char s[10]={0}, ...
- Codeforces Round #593 (Div. 2)D(螺旋形模拟)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;vector<int>po[100 ...
- Hive的学习之路(理论篇)
一.Hive介绍 Apache官网给出的logo,一半是Hadoop大象的头,一半是蜜蜂的身体,也是寓意着它是基于Hadoop,哈哈,纯属个人理解,进入正题. Hive是基于Hadoop的一个数据仓库 ...
- ajax的XmlHttpRequest对象常用方法
onreadystatechange用于检测readyState状态的改变,当readyState的状态发生改变的时候调用回调