Unity坐标基础

2023-11-02

一:Unity中的四种坐标系

——世界坐标(World Space)

世界坐标很好理解,它是一个3D坐标。就是游戏物体在你创造世界中的坐标。transfrom.position获得的是物体相对于世界坐标的位置,transfrom.localPosition获得的是物体相对于父物体坐标的位置

模型Mesh保存的顶点坐标均为局部坐标系下的坐标

 

 

 

 

——屏幕坐标(Screen Space)

屏幕坐标是以像素来定义的,与分辨率有关,例如分辨率为1280*720的屏幕则Screen.width为1280,Screen.height为720。

Screen.width = Camera.main.pixelWidth和Screen.height = Camera.main.pixelHeight只有在相机视口坐标是整个屏幕时才满足。所以不难看出Screen.width是屏幕的分辨率即屏幕的宽度, 而Camera.main.pixelWidth是相机的视口像素大小,也可以理解为相机视口的像素宽度。

屏幕的左下角坐标为(0 , 0),右上角为(Screen.width , Screen.height),z轴坐标是相机的世界坐标中z轴的负值我们常用的Input.mousePosition和移动端的Input.GetTouch(0).position都是获得的光标在屏幕坐标的位置

 

 

 

 

——视口坐标(Viewport Space)

视口坐标系其实就是将屏幕坐标系单位化

视口坐标的左下角为(0 , 0),右上角为(1 , 1),z轴坐标是相机的世界坐标中z轴的负值

可用于制作分屏游戏

二:各种坐标转换

——InverseTransformPoint和TransformPoin

例如物体A的世界坐标坐标为(1,2,3),物体B的世界坐标为(2,2,2),现在需要计算物体B相对于物体A的局部坐标,则应该使用A.transform.InverseTransformPoint(B)

 

 

 

——屏幕坐标转世界坐标

Vector3 mousePos = Input.mousePosition;

Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z));

Debug.Log(screenToWorld);

 

 

 

——世界坐标转屏幕坐标

Vector3worldToScreen=Camera.main.WorldToScreenPoint(transform.position);

Debug.Log(worldToScreen);

 

 

 

——屏幕坐标转视口坐标

Vector3 mousePos = Input.mousePosition;Vector3 screenToViewport = Camera.main.ScreenToViewportPoint(mousePos);

Debug.Log(screenToViewport);

 

 

 

——视口坐标转屏幕坐标

Vector3 viewportToScreen = Camera.main.ViewportToScreenPoint(new Vector3(1, 1, 0));

Debug.Log(viewportToScreen);

 

 

 

 

——世界坐标转视口坐标

Vector3 worldToViewport = Camera.main.WorldToViewportPoint(transform.position);

Debug.Log(worldToViewport);

 

 

 

——视口坐标转世界坐标

 Vector3 viewportToWord = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, -Camera.main.transform.position.z));

Debug.Log(viewportToWord);

 

 

 

——屏幕坐标转UI坐标

Vector2 mousePos;

RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent.GetComponent<RectTransform>(), Input.mousePosition, null, out mousePos);

Debug.Log(mousePos);

 

1.Canvas的RenderMode为Overlay时,cam参数应该为NULL。

2.rect必须为直接父物体

 

任何一个坐标转世界坐标时,z的参数都应该为相机在世界坐标中z的负值

从世界坐标转到任何一个坐标时,计算出的z值都是相机的世界坐标中z轴的负值

 

 

 

三:屏幕坐标转世界坐标时为什么要使用-Camera.transform.position.z

 

任何一个坐标转世界坐标时的z值,可以理解为离相机的距离。其实是把屏幕坐标投影到相机的视锥体平面上,如果z的值为0,则相当于投影到了相机的近平面上,但是近平面的最小值为0.01,所以在进行屏幕坐标转世界坐标时,屏幕坐标的z值不能为0(注意Input.mousePosition的z值为0)

而且随着z的值越来越大,投影到的平面也会越来越大,x和y的值也会越来越大

 

四:坐标转换的工具类

using UnityEngine;

/// <summary>

/// 坐标转换的工具类

/// </summary>

public class CoordinateTransUtility : MonoBehaviour

{

/// <summary>

/// 世界坐标转屏幕坐标

/// </summary>

/// <param name="worldPos">世界坐标的位置</param>

/// /// <param name="camera">相机</param>

/// <returns>转换后的屏幕坐标</returns>

public static Vector3 WorldToScreen(Vector3 worldPos, Camera camera = null)

{

if (camera == null)

{

camera = Camera.main;

}

Vector3 v = camera.WorldToScreenPoint(worldPos);

return v;

}

/// <summary>  

/// 屏幕坐标转世界坐标   

/// </summary>   

/// <param name="screenPos">屏幕坐标位置</param>   

/// <param name="camera">相机</param>  

/// <returns>转换后的世界坐标</returns>   

public static Vector3 ScreenToWorld(Vector3 screenPos, Camera camera = null)

{

if (camera == null)

{

camera = Camera.main;

}

Vector3 _screenPos = new Vector3(screenPos.x, screenPos.y, -camera.transform.position.z);

Vector3 v = camera.ScreenToWorldPoint(_screenPos);

return v;

}

/// <summary>   

/// 世界坐标转视口坐标   

/// </summary>   

/// <param name="worldPos">世界坐标的位置</param>   

/// <param name="camera">相机</param>   

/// <returns>转换后的视口坐标</returns>   

public static Vector3 WorldToViewport(Vector3 worldPos, Camera camera = null)

{

if (camera == null)

{

camera = Camera.main;

}

Vector3 v = camera.WorldToViewportPoint(worldPos);

return v;

}

/// <summary>   

/// 视口坐标转世界坐标   

/// </summary>   

/// <param name="viewportPos">视口坐标的位置</param>

/// /// <param name="camera">相机</param>

/// /// <returns>转换后的世界坐标</returns>   

public static Vector3 ViewportToWorld(Vector3 viewportPos, Camera camera = null)

{       

if (camera == null)

{           

camera = Camera.main;

}       

Vector3 _viewportPos = new Vector3(viewportPos.x, viewportPos.y, -camera.transform.position.z);

Vector3 v = camera.ViewportToWorldPoint(_viewportPos);

return v;  

}    

/// <summary>

/// /// 屏幕坐标转视口坐标

/// /// </summary>

/// /// <param name="screenPos">屏幕坐标的位置</param>

/// /// <param name="camera">相机</param>

/// /// <returns>转换后的视口坐标</returns>

public static Vector3 ScreenToViewport(Vector3 screenPos, Camera camera = null)

{       

if (camera == null)

{           

camera = Camera.main;

}       

Vector3 v = camera.ScreenToViewportPoint(screenPos);

return v;

}   

/// <summary>

/// 视口坐标转屏幕坐标

/// </summary>

/// <param name="viewportPos">视口坐标的位置</param>   

/// <param name="camera">相机</param>   

/// <returns>转换后的屏幕坐标</returns>

public static Vector3 ViewportToScreen(Vector3 viewportPos, Camera camera = null)

{       

if (camera == null)

{          

camera = Camera.main;

}       

Vector3 v = camera.ViewportToScreenPoint(viewportPos);

return v;

}    

/// <summary>

/// 屏幕坐标转UI坐标

/// </summary>  

/// <param name="rect">RectTransform组件</param>

/// <param name="screenPos">屏幕坐标的位置</param>

/// <param name="camera">相机</param> 

/// <returns>转换后的UI坐标</returns>

public static Vector3 ScreenToUI(RectTransform rect, Vector3 screenPos, Camera camera = null)

{       

Vector2 mousePos;

RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, Input.mousePosition, camera, out mousePos);

return mousePos;

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity坐标基础 的相关文章

  • vue2中Cascader 级联选择器限制选择个数和回显问题

    文章目录 1 组件默认数据绑定 2 指定数据绑定 3 watch监听v model绑定的数组 控制选中个数 4 前后端数据转换 实现回显 1 接口初始数据回显 2 重新选择级联选择器后 如何将选择的数据转换成后端需要的数据 3 最后提交数据
  • filezilla中文目录乱码怎么解决

    FileZilla是一款常用的文件传输工具 但在使用过程中可能会遇到乱码的问题 以下是一些可能的解决方案 设置字符集 在连接上站点后 点击菜单栏的 文件 选项 下拉选择 添加当前连接到站点管理器 在弹出的 站点管理器 窗口中 左侧选择 新站
  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time
  • 事件委托Tab栏切换

  • CTF之逆向入门

    逆向工程 Reverse Engineering 又称反向工程 是一种技术过程 即对一项目标产品进行逆向分析及研究 从而演绎并得出该产品的处理流程 组织结构 功能性能规格等设计要素 以制作出功能相近 但又不完全一样的产品 逆向工程源于商业及
  • Element-Puls中el-upload组件结合vue-draggable-plus实现上传支持拖拽排序(并保留el-upload原有样式、预览、删除)等功能

    展示效果 需求 需求想要一个可拖拽排序的图片列表 但是发现el upload虽然可以实现照片墙 但是没办法拖拽 实现思路 使用 vue draggable plus 拖拽插件 隐藏Upload原有的已上传文件列表 自定义上传后文件列表的样式
  • JS特效第74弹:旅游城市图片百叶窗切换React特效

    全屏的旅游城市景点图片滑动百叶窗轮播切换效果 先来看看效果 一部分关键的代码如下 div div
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 基于java的web仓库管理系统设计与实现

    基于java的web仓库管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的Web仓库管理系统是近年来快速发展的领域之一 它提供了丰富的功能 如数据存储 数据检索 数据分析和数据可视化等 本文将重点介绍基于Java的Web仓库管
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 低代码配置-组件列表设计

    过滤字段功能 配置了api 启用 输出配置 filter type Array default gt
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • vue实现 marquee(走马灯)

    样式 代码 div class marquee prompt div class list prompt span class prompt item span div div data return listPrompt xxx xxxx
  • 每天10个前端小知识 <Day 14>

    前端面试基础知识题 1 CSSOM树和DOM树是同时解析的吗 浏览器会下载HTML解析页面生成DOM树 遇到CSS标签就开始解析CSS 这个过程不会阻塞 但是如果遇到了JS脚本 此时假如CSSOM还没有构建完 需要等待CSSOM构建完 再去
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef

随机推荐

  • [电动智能汽车-4]:原理 - 高压电源系统与互锁系统

    目录 第1章 高压电源系统概述 1 1 高压电源系统原理图 1 2 高压电源系统连接图 1 3 互锁 第2章 动力电池 2 1 安装位置 2 2 动力电池的外观 2 3 动力电池的组成 2 4 电芯的类型 2 5 电池包的参数 2 6 高压
  • Docker的Compose规范现已成为开放标准

    由Docker创建的用于定义多容器应用程序的系统Docker Compose现在将作为开放标准进行开发 称为新标准的Compose规范旨在允许Compose创建的应用程序在Kubernetes和Amazon Elastic Containe
  • 你不知道的JavaScript----promise

    目录 什么是Promise Promise Promise 值 完成事件 Promise 事件 具有 then 方法的鸭子类型 Promise 信任问题 调用过早 调用过晚 Promise 调度技巧 回调未调用 调用次数过少或过多 未能传递
  • 正则表达式之旅_sed_awk

    谈谈正则表达式这个东西 我想作为一个程序员 正则表达式大家绝对不陌生 正则表达式好像一个有限则动机 主要作用是匹配 但是同时因为这个功能 我们可以扩展很多其他用法 像很多语言都引人了正则表达式 java C 等面向对象语言 更多的是脚本语言
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之一

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • Vmware 显示“您在运行该虚拟机时启用了侧通道缓解+DevicePowerOn”启动失败+模块“VPMC”启动失败”

    一 问题描述 首先显示 您在运行该虚拟机时启用了侧通道缓解 侧通道缓解可增强安全性 但也会降低性能 要禁用缓解 请在虚拟机设置的 高级 面板中更改侧通道缓解设置 有关更多详细信息 请参阅 VMware 知识库文章 79832 网址为 htt
  • 最小(大)堆实现topK问题

    最小 大 堆实现topK问题 topK问题 即求一组数据中最大 最小 的前K个数据 一般情况下数据量都比较大 比如 班级前10名 世界500强 等级分排名等 对于topK问题 能想到的最简单直接的方式就是排序 但是 如果数据量非常大 排序就
  • Pytorch框架基础

    目录 1 02张量的简介与创建 pytorch中的Tensor 张量的创建 1 03张量的操作 1 拼接 2 张量的拼接与切分 3 张量索引 4 张量变换 1 04计算图与动态图机制 1 05自动求导和Logist回归 1 Autograd
  • wandb demo

    import wandb import random class test def init self team proj name self run wandb init entity team project proj name nam
  • Go_时间日期函数

    时间日期 func main 获取当前时间 now time Now fmt Println 当前时间 now 获取年月日时分秒 fmt Println 年 now Year fmt Println 月 int now Month 不转in
  • VMware虚拟机下安装Ubuntu16.04镜像完整教程

    目录 1 安装前准备 2 安装Ubuntu 16 04镜像 3 One More Thing 1 安装前准备 PC电脑操作系统是WIN7 已正确安装虚拟机VMware 12 2 安装Ubuntu 16 04镜像 下载Ubuntu镜像文件 下
  • 宝可梦 序列号认证服务器发生了错误,宝可梦探险寻宝无法连接服务器是什么原因...

    宝可梦探险寻宝中不少玩家反馈都会遇到宝可梦探险寻宝无法连接服务器是什么原因的问题 那么怎么解决这个问题呢 这边ourplay小编为大家分享几个解决方案 宝可梦探险寻宝游戏简介 宝可梦 探险寻宝 是任天堂在2018年5月29日推出的游戏 最初
  • 用了HBuilderX近一年,最后还是选择了VSCode

    用了HBuilderX近一年 最后还是选择了VSCode 关于前端的IDE 流行的无非也就那么几款 但若要问那款编辑器最好用 键盘侠们可能要闹翻了天 本人接触前端以来大概使用webstorm有3 4个月之久 当时webstorm好像名气比V
  • 28天自我挑战,从0开始学会Python月入25K

    28天自我挑战 从0开始学 会Python月入28K Python最近这么火 很多小伙伴还不知道Python到底是什么 能干什么 一句话 Python是最简洁 最好学的语言 学完Python让自己的工作效率提高几倍 不用每天熬夜加班 就能轻
  • LaTeX“U+200B”错误

    就是中文符号的问题 包括空格这种 我错的是空格问题 但空格我重新敲了一遍也不好使 翻到了另一个博主写的用Notepad 非常之好用 把那段报错文字复制过来 搜索 gt 替换 输入 u200b 找到中文空格位置 删除换成英文空格 再把这段文字
  • Android 性能优化 内存抖动 内存泄漏

    本文链接 https blog csdn net feather wch article details 131545501 云笔记链接 https note youdao com s YcbbhAYK 内存抖动 1 内存抖动是什么 内存可
  • C++图的建立---邻接矩阵-----邻接表

    目录 图的表示方式 邻接矩阵 邻接表 图的遍历 深度优先遍历 深度优先遍历算法步骤 图的广度优先遍历 广度优先遍历算法步骤 图的邻接矩阵存储来创建图 代码 运行结果 图的邻接表存储来创建图 如下图 运行结果 图的表示方式 图的表示方式有两种
  • 机器学习实验一SVM分类实验

    一 实验目的和内容 一 实验目的 1 熟悉支持向量机SVM Support Vector Machine 模型分类算法的使用 2 用svm train中提供的代码框架 填入SVM分类器代码 用train data训练数据提供的矩阵来训练参数
  • shell计算表达式摘要

    LinuxShell算术运算 Bash shell 的算术运算有四种方式 1 使用 expr 外部程式加法 r expr 4 5 echo r注意 4 5 这三者之间要有空白r expr 4 5 错误乘法 r expr 4 5 2 使用 r
  • Unity坐标基础

    一 Unity中的四种坐标系 世界坐标 World Space 世界坐标很好理解 它是一个3D坐标 就是游戏物体在你创造世界中的坐标 transfrom position获得的是物体相对于世界坐标的位置 transfrom localPos