[Unity踩坑记录] 从屏幕坐标系转换到世界坐标系

2023-11-17

问题描述

调试需要,想从摄像机发出一条射向鼠标指向位置的射线,于是写了如下代码:

void Update(){
	Vector3 mouseScreenPos = Input.mousePosition;
	Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(mouseScreenPos);
	Debug.DrawRay (Camera.main.transform.position, mouseWorldPos, red);

运行后发现,不论鼠标指向哪里,射线都是射向同一方向。
随后对鼠标坐标、转换后的鼠标坐标进行打印,发现鼠标坐标正常,但转换后的鼠标坐标全部为(0,1,-10)

 

问题分析

Camera.main.ScreenToWorldPoint()中进行运算的坐标为Vector3类型,而鼠标屏幕坐标的z为0。当camera设置为perspective时,经过该方法计算得出的坐标会永远是camera的坐标。

总之,使用纯天然的鼠标坐标只会得到一个固定的相机坐标。

The ‘z’ parameter must be the distance in front of the camera. In perspective mode at least, passing 0 will cause ScreenToWorldPoint() to always return the position of the camera.
 
Note the measurement for the ‘z’ parameter is from camera plane to the playing surface plane. It is not the distance between the camera and the object. If the camera is aligned with the axes, then the distance is easy to calculate. If the camera is at an angle (i.e. not axes aligned), then ScreenToWorldPoint() is not the way to go.

 

解决方案

发射射线只需要方向向量,所以其实只要手动给z改个非零值即可。

但是如果更进一步想,一些需要跟随鼠标位置进行移动的效果,就必须要知道z的具体值。

无法将鼠标坐标直接转换成世界坐标,或者说计算z值过于复杂,那就反过来,把什么东西转换成屏幕坐标,再把它的z值赋给鼠标坐标。

以下代码也适用于想通过鼠标来移动一些物体(如鼠标置换、物品拖拽等效果):

void Update(){

	// 获取需要移的动物体的屏幕坐标
	Vector3 followObjScreenPos = Camera.main.WorldToScreenPoint(followObj.transform.position);
	Vector3 mouseScreenPos = Input.mousePosition;

	// 补齐鼠标坐标缺失(为0)的z坐标
	mouseScreenPos.z = objScreenPos.z;
	Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(mouseScreenPos);
	followObj.position = worldPos;
}

思路来源1:解决Unity鼠标坐标点转成世界坐标系坐标点
思路来源2:Unity 屏幕坐标转换世界坐标之物体跟随鼠标移动

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

[Unity踩坑记录] 从屏幕坐标系转换到世界坐标系 的相关文章

  • Redis可以代替MySQL作为数据库吗

    Redis可以代替MySQL作为数据库吗 当使用Redis作为数据库时 以下是一些基本的代码示例 1 连接到Redis服务器 2 存储和获取数据 3 列表操作 4 有序集合操作 6 键过期和删除 Redis作为数据库时 下面是一些更复杂的代
  • 如何基于G6进行双树流转绘制?

    1 背景 业务背景 CRM系统随着各业务条线对线索精细化分配的诉求逐渐增加 各个条线的流向规则会越来越复杂 各个条线甚至整个CRM的线索流转规则急需一种树形的可视化的图来表达 技术背景 在开发之前考虑了三种方案 原生canvas fabri
  • STM32 同个定时器 采用2个通道输入捕获

    工作中遇到 做点总结 之前看CSDN 找到一种写法 就是 把中断中的 CAPTURE VAL 的值 变成 date1 date2 去保存 但是我的写法不成功 一位大佬帮忙改成功了 总结我的写法错误之处 主函数区别 我把date1 清0 放后
  • java longlong_java Long long

    在Java中执行如下的代码 long number 26012402244 编译的时候会出现一个错误 提示 过大的整数 32322355744 如果在Eclipse中书写上面的代码 提示的是 The literal 26012402244
  • DrawerLayout与FragmentTabHost结合模仿oschina主界面

    1 DrawerLayout实现侧滑菜单 drawerlayout是官方出的侧滑菜单控件 使用起来非常方便 将它当作LinearLayout一样的布局控件 完成布局xml文件
  • 安全(六种核心安全机制-加密、密钥、签名与证书)

    安全要解决什么问题 你都会的密码术 安全机制之对称加密 安全机制之非对称加密 安全机制之密钥交换 安全机制之消息摘要 安全机制之电子签名 安全机制之证书与PKI 一 在典型的场景中 安全主要用于解决4类需求 1 保密 Security Co
  • Load balancer does not have available server for client问题

    Load balancer does not have available server for client问题 是因为消费端没有调用成功服务端 下面四步是必备的 可以检查一番 1 写nacos发现的启动类注解 SpringBootApp
  • statsmodels 笔记:seasonal_decompose 时间序列分解

    1 使用方法 statsmodels tsa seasonal seasonal decompose x model additive filt None period None two sided True extrapolate tre
  • [Nowcoder / POJ2728] 最优比率生成树

    Nowcoder链接 POJ链接 题目描述 David the Great has just become the king of a desert country To win the respect of his people he d
  • 单例模式的6种实现方式

    单例模式的6种实现方式 一 单例模式的定义 定义 确保一个类只有一个实例 并提供该实例的全局访问点 这样做的好处是 有些实例 全局只需要一个就够了 适用单例模式就可以避免一个全局适用的类 频繁的创建和销毁 耗费系统资源 二 单例模式的设计要
  • C++函数指针应用例子

    C 函数指针应用例子 前段时间在写代码的时候 想让程序根据一个函数运行出的结果 从四个函数中自动选择一个函数运行 这四个函数我们就取名叫 value 0 value 1 value 2 value 3 假设value 0是这样的 int v
  • 基于Android系统英语学习助手APP设计开发

    一 设计思路 1 1设计目标 1 2设计思路 1 3设计内容 1 3 1界面设计 1 3 2功能模块设计 1 3 3功能流程图 1 3 4数据库设计 如果没有数据库这部分删除 1 4工具设备要求 1 5技术方案 二 设计过程与说明 2 1技
  • JVM 内存分析—优化

    参考链接 https www jianshu com p c6e2abb9f657 JVM及GC https blog csdn net sltylzx article details 90704205 在Eclipse上安装MAT Mem
  • kafka学习指南(总结版)

    版本介绍 从使用上来看 以0 9为分界线 0 9开始不再区分高级 低级消费者API 从兼容性上来看 以0 8 x为分界线 0 8 x不兼容以前的版本 总体拓扑架构 从上可知 1 生产者不需要访问zookeeper 2 消费者fetch消息
  • 利用PDB文件将蛋白中的单聚体利用对称矩阵转换为二聚体

    下面是需要在VMD中执行的tcl脚本 steps source mono2poly tcl mol delete all mol new filename pdb set sel atomselect top all set matrix
  • Divide by three, multiply by two CodeForces - 977D(dfs vector记录答案并利用vector回溯)

    em 虽然自己想到了dfs回溯解决这个问题 结果却咋实现 记录答案但是如果答案不对 答案也要回溯 这个问题上翻了车 原谅菜鸡我没有想到可以直接v pop back em 以前基本没用过这个功能 这里记录一下 参考了大佬代码 AC代码 inc
  • Java 通过HttpURLConnection Post方式提交json,并从服务端返回json数据

    这个技术和xml差不过 主要是服务端代码稍微修改 客户端代码修改部分传递参数就可以完成 但在之前需要导入json所需要的jar包 PostJson java代码 package PostPager import java io InputS
  • torch.sigmoid() 与 torch.nn.Sigmoid() 对比 python

    1 torch sigmoid 2 torch nn Sigmoid 只看文档 我没太看出二者的具体区别 通过以下可知得到结果自然相同 不过使用方式确实不同 我目前也没明白为啥
  • vscode 添加万能头文件#include<bits/stdc++.h>

    文章目录 前言 配置 前言 有一天我在愉快的刷着leetcode 突然觉得写头文件好TM麻烦 于是就想着配置一下万能头文件 配置的过程我觉得还是记录一下吧 很多初学者可能会犯迷糊 配置 首先 我们要清楚 我们在vscode上写C C 程序的

随机推荐

  • 给element datetimepicker 设置默认当前时间

    else里面就是设置默认当前时间15分钟后 watch row val this liveTime 当时间不为空时才回显 if val liveBeginTime val liveEndTime this liveTime push new
  • 阿里云P2P内容分发网络(PCDN)实操手册

    一 PCDN是定义 P2P 内容分发网络 英文名 P2P CDN 以下简称PCDN 是以P2P技术为基础 通过挖掘利用电信边缘网络海量碎片化闲置资源而构建的低成本高品质内容分发网络服务 客户通过集成PCDN SDK 以下简称SDK 接入该服
  • 关于scroll和mousewheel事件的问题

    需要注意的点 火狐的鼠标滚轮事件是DOMMouseScroll 事件参数兼容 e window event e 下面省略 preventDefault 函数取消的是默认事件 不会把我们自己添加的事件处理删除 实验开始 在下面验证例子的基础上
  • Android仿网页分页效果

    比较简单的一个方法 使用gridview来做的效果 1 在adapter中的getCount中判断list size是否你需要显示的长度 小于使用list size大于使用你需要的长度 我这里的长度为10 所以判断的为10 2 在adapt
  • 深度学习的核心理念

    深度学习的方法 核心是拟合 拟合的意思 是指在一个被定义的度量空间里 用一个函数 比较准确地表示一堆现有的空间数据 让拟合后误差尽量变小 贴合的越近越好 为何又说深度学习是统计呢 这个观点 跟拟合是同一个意思的不同表述 一理各表 在一个 给
  • GIoU详解

    Generalized Intersection over Union A Metric and A Loss for Bounding Box Regression 一 动机 在目标检测任务中 回归loss相同的情况下 IoU却可能大不相
  • LeetCode第125题解析

    给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 说明 本题中 我们将空字符串定义为有效的回文串 示例 1 输入 A man a plan a canal Panama 输出 true 示例 2 输入 race
  • 梦想世界3手游服务器维护,2021年4月1日官方维护公告

    2021年4月1日官方维护公告 发布时间 2021 04 01 新增内容 1 主角换新 新增主角新模型资源 维护前已有角色玩家可在 奖励 主角换新 界面进行转换操作 可选择保留现有模型 维护后新创建的角色将默认使用主角新模型 2 仙兽转换功
  • excel导出内存溢出_轻松解决PHPExcel导出10W行超时和内存溢出问题

    专题1 PHPExcel的疑难杂症各个击破 本文使用了一个轻量级的PHP的Excel操作库 PHP XLSXWriter 一 解决行的问题 10w行excel数据导出仅需要5 26秒 再也不用担心excel导出超过1w行就超时 php in
  • 情感分析研究的新视野

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Caroline Brun 编译 ronghuaiyang 导读 对情感分析研究领域做了非常好的总结和展望 假新闻 受欢迎程度 健康状况 金融和社会风险 情感分析正在帮助理解这一
  • 入门级动态规划五步法(斐波那契数)

    1 确定dp数组 dp table 以及下标的含义 2 确定递推公式 3 dp数组如何初始化 4 确定遍历顺序 5 举例推导dp数组 class Solution def fib self n int gt int if n 0 retur
  • 记一次 Centos7 cmake 版本升级(由 v2.8.12.2 升级至 v3.14.5)

    一 基本信息说明 官网 https cmake org 下载地址 https cmake org files 二 系统 工具 1 系统版本 Centos7 5 CentOS 7 x86 64 Minimal 1804 2 工具 xshell
  • synchronized 怎么使用

    文章目录 前言 通过一系列的例子 了解synchronized 使用 总结 前言 上一篇了解了synchronized 但是呢光懂理论没用 关键是要会用 用demo的形式写一下各种使用场景 这么一来 就会对synchronized的使用更加
  • 遗传算法训练人工神经网络 MATLAB实现

    参考 遗传算法优化BP神经网络 写在前面 为了完成建模课的作业 找了很久才找到可以使用的一个源码和这个很好的博客 在此记录一下 这是一个利用遗传算法实现BP人工神经网络的matlab代码 可用于实现2层 隐藏层数 1 不计输入层 则共2层
  • 用jsp实现登录,登录成功则跳转到登录成功页面,失败则跳转到失败页面

    login jsp
  • 码云实战(二)——新增仓库和删除仓库

    文章目录 前言 一 创建仓库 1 新增仓库 2 填写仓库的相关信息 3 创建效果 二 删除仓库 总结 前言 本系列文章主要记录日常使用中碰到的码云的相关问题 一 创建仓库 1 新增仓库 在gitee网站右上角的 点击 新建仓库 2 填写仓库
  • Python深度学习篇一《什么是深度学习》

    在过去的几年里 人工智能 AI 一直是媒体大肆炒作的热点话题 机器学习 深度学习 和人工智能都出现在不计其数的文章中 而这些文章通常都发表于非技术出版物 我们的未来被描绘成拥有智能聊天机器人 自动驾驶汽车和虚拟助手 这一未来有时被渲染成可怕
  • Linux怎么使用U盘

    方案一 Linux不像Windows一样 接上新硬件后可以自动识别 在Linux下无法自动识别新硬件的 需要手动去识别 USB移动存储设备通常被识别为sda1 具体可以通过fdisk l命令查询 在使用U盘前 我们先要为外挂点新建一个子目录
  • 《动手学深度学习 Pytorch版》 6.5 汇聚层

    import torch from torch import nn from d2l import torch as d2l 6 5 1 最大汇聚和平均汇聚 汇聚层和卷积层类似 区别在于汇聚层不带包含参数 汇聚操作是确定性的 通常计算汇聚窗
  • [Unity踩坑记录] 从屏幕坐标系转换到世界坐标系

    问题描述 调试需要 想从摄像机发出一条射向鼠标指向位置的射线 于是写了如下代码 void Update Vector3 mouseScreenPos Input mousePosition Vector3 mouseWorldPos Cam