屏幕坐标系和视口坐标系

article/2025/9/24 21:55:07
一.屏幕坐标系
1.屏幕坐标系: 手机屏幕或者电脑屏幕的一个坐标系。
2.屏幕坐标是以像素来定义的, 屏幕左下角为原点(0,0), 右上角为(Screen.width,Screen.height), width是屏幕的宽度, height是屏幕的高度, Z值是摄像机世界坐标取反,并且以相机的世界单位来衡量的。
3.屏幕坐标和相机之间满足: Screen.width = Camera.main.pixelWidth和Screen.height = Camera.main.pixelHeight这两个条件。
4.鼠标的位置坐标属于屏幕坐标。通过Input.mousePosition获取鼠标的屏幕坐标。
二.创建工程
1.创建一个游戏工程, 命名为ScreenViewPort

2.在Project视图中创建3个文件夹, Scene文件夹、Resources文件夹和Script文件夹

3.将当前场景保存为GameScene

4.创建ScreenPosition游戏脚本


5.在Hierarchy视图中创建一个空的GameObject, 命名为GameManager,并把ScreenPosition绑定在该对象上

6.更改屏幕分辨率为480 * 800

7.编写代码

using UnityEngine;public class ScreenPosition : MonoBehaviour
{void Update () {if(Input.GetMouseButtonDown(0)){Debug.Log ("屏幕坐标:" + Input.mousePosition);}}
}

8.运行点击屏幕打印

屏幕坐标:(9.0, 33.0, 0.0)

屏幕坐标:(458.0, 22.0, 0.0)

屏幕坐标:(228.0, 410.0, 0.0)

屏幕坐标:(458.0, 795.0, 0.0)

三.视口坐标系

1.摄像机的前面有一个长方形的小框子, 那个即为视口。


2.视口坐标是标准化后的屏幕坐标。视口坐标是以0到1间的数字来表示的, 它的范围是以左下角为(0,0), 右上角为(1,1)定义的这样一个矩形。视口坐标是一个3D坐标, Z轴是以相机的世界单位来衡量的。通过对比可以发现视口坐标和屏幕坐标特别的相似。

3.摄像机视口比例:public float aspect{get;set;},此属性用于获取或设置Camera视口的宽高比例值。

4.void ResetAspect();恢复长宽比为屏幕的长宽比。

5.代码

using UnityEngine;public class CameraAspect : MonoBehaviour
{void Start () {Debug.Log ("默认宽高比例:" + Camera.main.aspect);}void OnGUI () {if(GUILayout.Button("摄像机宽高比例为1")){Camera.main.ResetAspect ();Camera.main.aspect = 1;}if(GUILayout.Button("摄像机宽高比例为2")){Camera.main.ResetAspect ();Camera.main.aspect = 2;}}
}

四.屏幕坐标和视口坐标的转换

1.从视口空间到屏幕空间的变换位置: Vector3 ViewportToScreenPoint(Vector3 position);

2.从屏幕空间到视窗空间的变换位置: Vector3 ScreenToViewportPoint(Vector3 position);

3.代码

using UnityEngine;public class ScreenViewPortPosition : MonoBehaviour 
{void Start(){Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0.5f,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0.5f,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,0,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,1,0))+"]");Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,1,0))+"]");}void Update () {if(Input.GetMouseButtonDown(0)){Debug.Log ("摄像机屏幕坐标转换成视口坐标:["+Input.mousePosition+","+Camera.main.ScreenToViewportPoint(Input.mousePosition)+"]");}}
}

http://chatgpt.dhexx.cn/article/uXx1YyON.shtml

相关文章

vs2010中出现lnk2019和lnk1120错误

非常令人难受的是,今天在配置Cocos2d-x的时候,配置完突然出现这个问题,我以为VS2010给我弄崩了,吓得我瞬间慌了 不过研究了好几篇文章才发现这个一点关系都没有。 下面说一下到底出了什么问题: 创建项目的时候选错了&…

LNK2001:无法解析的外部符号,LNK1120:一个无法解析的外部命令

写了个画图程序,边写边调试,运行时发现出现了这个。检查发现原因是在头文件定义了A函数,在.cpp中没有实现,于是在.cpp中将函数写出来 头文件定义了,但函数没有具体出现,编译器无法解析,实现一下…

新手编程VS2019出现 error LNK2019 LNK1120 报错

新手编程VS2019出现 error LNK2019 LNK1120 报错 我也是新手,出现这个问题我很纳闷,明明代码语法什么的都没错,但是就是报了这个错误 于是我在网上查了半天的解决方法,大多都是说建项目的时候出问题,但是不管我怎么重…

lnk1120如何解决,致命错误LNK1120:4个未解决的外部

I am new to game developing, i am interesed in Goldsrc(Valves early engine). I found source code of Counter-Strike 1.6 (Modified Goldsrc) and tried to compile it with VS2013. 解决方案 Generally, this error comes when you call something that is not defined.…

fatal error LNK1120: 1 个无法解析的外部命令 的解决办法

question: vs2012编c程序的时候,出现了fatal error LNK1120: 1 个无法解析的外部命令 但是编译的时候是没有任何问题的 Answer: 没有写主函数,所以你能进行编译的时候通过,而进行最终ctrlf5的时候会出现这个问题…

c语言中延时的作用,在c语言中如何实现延时功能?

实现原理:Sleep()延迟函数。 条件: 1.需要引入头文件#include 和#include 。 2.Sleep()函数内部必须有参数,里面填整数,表示毫秒。 实现步骤: 1.新建控制台程序,设置工程名和路径。 2.选择一个简单的程序。…

【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景

首先,需要了解各个睡眠函数的作用和使用场景。 sleep函数用于让进程休眠指定的秒数,适用于需要较长时间的休眠场景;usleep函数用于让进程休眠指定的微秒数,适用于需要较短时间的休眠场景,不精确;nanosleep函…

单片机:延时函数的理解

在实现单片机功能的时候,经常会用到延时函数,那么延时函数的原理也是非常有必要了解的。一般我们写延时函数的时候,默认的晶振频率fosc12MHZ,而机器周期T12/fosc1us。 这里我们来写一个10ms的延时函数: void delay_10…

c/c++语言中的延时操作

大家在编程的过程中可能需要用到一些延时操作,比如说在使用控制台编程时,程序运行的时候DOS窗口会一闪而过,这样就会导致看不到程序在Dos界面运行的结果,这样有些小伙伴就纳闷了:怎样使得Dos窗口一直停留呢&#xff1f…

C\C++中计时、延时函数

C\C标准库中提供了两种计时函数clock()和time()。其用法如下: (1)clock()函数用法 void timeConsume() {double start,stop,durationTime;start clock();/*...代码片段*/stop clock();durationTime ((double)(stop-start))/CLK_TCK;cout…

c语言中,关于延迟函数的理解

对于延迟&#xff0c;有些c基础的人都能够做到用for或while来实现 例如&#xff1a; #include <stdio.h>int main() {int i, j, k;for (i 1; i < 1000; i){for (j 1; j < 1000; j){for (k 1; k < 1000; k){}}}printf("hello\n");return 0; }1234…

延时函数

延时函数 什么是延时函数 所谓延时函数就是在函数中设置了几个空操作的动作&#xff0c;每次操作都需要消耗一定的时间&#xff0c;动作结束了&#xff0c;就会跳出延时函数继续做其他事情了。 为什么要延时 为了使CPU某些芯片的时序而采用的一些机制&#xff0c;比如独立按…

C语言里的延时函数

C语言延时 悬赏分&#xff1a;0 - 解决时间&#xff1a;2007-2-18 14:48s级的时间延时杂写啊&#xff1f;大侠们帮哈忙啊 最佳答案 在Windows下最简单的办法是调用系统函数Sleep(time)&#xff0c;单位是ms&#xff0c;在windows.h中声明&#xff0c;注意大小写&#xff1b;不然…

连接oracle数据库报错:ORA-12505

连接oracle数据库报错:ORA-12505 今天在使用程序连接oracle数据库时本来很简单的填写url,用户名和密码&#xff0c;测试连接提示失败。和pl_sql 对比了下写的也没毛病&#xff0c;有图为证&#xff1a; 看了下数据库地址端口和用户名密码都没问题&#xff0c;打开数据日志看到…

解决oracle报错ORA-12505

连接oracle报错ORA-12505 主要原因是sid错误&#xff0c;网上有很多解决办法&#xff0c;我这里是因为url链接方式写错了&#xff0c;给我的是service-name&#xff0c;我却用jdbc:oracle:thin:host:port:SID 方式去链接&#xff0c;而正确的写法是 jdbc:oracle:thin://host:p…

连接Oracle时出现ORA-12505错误

连接Oracle时出现ORA-12505错误 问题&#xff1a;使用eclipse连接Oracle数据库时报错&#xff1a;Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 原因&#xff1a;重新配置了…

ORA-01555

报错&#xff1a; 数据泵导入时报错如下&#xff0c;快照太旧 分析原因&#xff1a; snapshot 是存储undo中 undo的作用事务恢复、事务回滚、读一致性&#xff0c;显然和读一致性作用有关 数据泵的原理&#xff1a;将数据库的信息以转储文件的形式存储到操作系统中  S…

【数据源】连接Oracle失败 Listener refused the connection with the following error: ORA-12505

连接Oracle失败 Listener refused the connection with the following error: ORA-12505 使用场景解决方案 使用场景 数据源平台配置了Oracle&#xff0c;在其它工具测试能够正常连接&#xff0c;但数据源平台在确认配置无误情况下点击测试连接提示失败&#xff0c;报错信息提…

Oracle SQL Developer连接报错(ORA-12505)

理论实践 Oracle SQL Developer连接报错(ORA-12505) 作者&#xff1a;Vashon 时间&#xff1a;20150415 之前我的Oracle数据库出现问题&#xff0c;费大波周折终于弄好了&#xff0c;今天又创建了一个DBA管理员的连接方式出现问题&#xff0c;本人现在把解决方案分享给大家&am…

使用dbeaver链接oracle报错ORA-12505, TNS:listener does not currently know of SID given in connect descripto

业务需求需要读取oracle数据库数据, 想先在dbeaver连接oracle数据库进行操作, 但是管理员一开始给的用户名与密码连接不上, 报错: 以及打开详细 Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12505, TNS:listener …