游戏数学: 计算屏幕上点中的平面上的点(上帝视角)

应用场景

上帝视角,点击屏幕,需要计算此时点中的平面上的位置,比如将物体移到点击的位置上,或者需要拖拽物体移动

数学计算

在这里,实际上是有几个前提的计算,或者说是简化版的射线与平面的交点
因为是上帝视角,所以射线的起点的y轴坐标一定为正,与y轴的夹角一定为锐角,且我们使用xy轴组成的平面作为交点计算的平面


我们通过Unity的屏幕点转化为射线,可以得到射线的起点和方向单位向量,我们假设射线起点为A点,与xy轴平面相交点为B点,A点在xy轴平面的投影点为C点,则根据向量计算,有 B点坐标 = A点坐标 + AB向量,所以我们只需求出AB的长度即可

故有求解公式如下:
AC长度 = ay
AB长度 = ay / cos(射线方向 与 AC向量的夹角)
B点 = A点 + 射线方向单位向量 * AB长度

在Unity中的示例

我们在Unity中完成这一计算的验证


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class InteractiveTest : UIBehaviour, IPointerClickHandler
{public Camera cam;public GameObject ctrlObj;public void OnPointerClick(PointerEventData pointerEventData){var ray = cam.ScreenPointToRay(pointerEventData.position);SetObjPos(ray.origin, ray.direction);}void SetObjPos(Vector3 origin, Vector3 direction){float lengthAC = origin.y;  //因为我们的相机的位置一定在xy平面上方float cosABAC = -direction.y; //direction和(0, -1, 0)之间的夹角,即为AB和AC之间的夹角,一定是锐角float lengthAB = lengthAC / cosABAC;// Vector3 AB = lengthAB * direction;// Vector3 CB = new Vector3(AB.x, 0, AB.z);// Vector3 C = new Vector3(origin.x, 0, origin.z);// Vector3 B = new Vector3(C.x + CB.x, 0, C.z + CB.z);// ctrlObj.transform.position = B;Vector3 B = origin + direction * lengthAB;ctrlObj.transform.position = B;}
}

我们简单的使用一个平面,一个球来做示例

点击屏幕任意位置,我们可以看到球都能准确的移到点击的位置上

总结

虽然该计算需要有条件限制,但是对于这种射线和平面相交的应用场景,我们使用这种计算方式消耗会更小,当然Unity的屏幕点击点转换到世界的射线也是可以拿出来自己计算的,这样子消耗就可以更小了。

游戏数学: 计算屏幕点中的平面上的点(上帝视角)相关推荐

  1. matlab实现计算全息,MATLAB中二元傅里叶变换计算全息图的算法

    第 19 卷 第 3 期 2003 年 9 月 福建师范大学学报 (自然科学版) Journal of Fujian NormalU niversity (N atural Science) Vol1 ...

  2. matlab求两向量夹角_高考数学解题技巧:专题21 平面向量中最值、范围问题高中数学黄金解题模板...

    ↑ 点击上方"红色笔记"关注我们 高中各科解题技巧下载  回复数字:800009 高考数学解题技巧:专题24 数列求和方法高中数学黄金解题模板 高考数学解题技巧:专题26 含参不等 ...

  3. Shell脚本笔记(三)shell中的数学计算

    shell中的数学计算 一.使用方括号 #!/bin/bash a=10 b=29 c=88res=$[$a * ($c-$b)] echo $res 二.使用(()) echo $((1+9)) ( ...

  4. R开发(part2)--R语言中的数学计算

    学习笔记,仅供参考,有错必纠 参考自:<R的极客理想>-- 张丹 文章目录 R开发 R语言中的数学计算 对数 加权平均.连乘.差分.秩.任意数.全体数 阶乘.组合.排列 累加.累乘.最小累 ...

  5. 用计算机怎么计算r角度,R语言中的数学计算

    原标题:R语言中的数学计算 前言 R是作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算,所以用R语言做数学计算题特别方便.如果计算器中能嵌入R的计算函数,那么绝对是一种高科技产品. ...

  6. R语言中的数学计算(转载)

    R语言中的数学计算 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: http://blog.fens.me email: ...

  7. 希腊字母在数学计算中表示的含义

    希腊字母在数学计算中表示的含义 序号 大写 小写 英语音标注音 英文 汉语名称 常用指代意义 1 Α α /'ælfə/ alpha 阿尔法 角度.系数.角加速度.第一个.电离度.转化率 2 Β β ...

  8. JavaScript中的Date日期、String字符串、Array数组、Math提供对数据的数学计算

    一.Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date() ...

  9. 计算三维空间(推广到K维)中点到平面的投影点坐标

    计算三维空间中点到平面的投影点坐标 问题概述: 三维平面的一般方程为: (1) A x + B y + C z + D = 0 Ax+By+Cz+D = 0\tag{1} Ax+By+Cz+D=0(1 ...

最新文章

  1. pku 1077 Eight
  2. 无盘服务器游戏盘尺寸,网吧无盘游戏服务器 案例五
  3. BZOJ3336: Uva10572 Black and White(插头Dp)
  4. python操作excel和txt文件
  5. 一个完整的 Web 请求到底发生了什么
  6. SAP Gateway类型为multipart mixed的请求处理逻辑
  7. 金字塔原理只需读前几页
  8. A2K课程目录及学习计划
  9. Tapestry 和 JSF
  10. js bom dom
  11. 资料管理工具VSGoogle?
  12. Python 3.5安装JPype
  13. 小程序——添加动画,让图标原地旋转
  14. 推荐电影 历届奥斯卡获奖影片 1971-2008
  15. 初中地理老师教师资格证考试成功通过前辈备考经验分享
  16. w10服务器优化,Win10专业版怎么优化最流畅?Win10最详细优化设置告别卡顿!
  17. 数学归纳法求证欧几里得算法
  18. Pygame开发Flappy Bird小游戏(下)
  19. 硬盘为raw格式后的修复
  20. 有哪些一般人不知道的数据获取方式

热门文章

  1. 超强古文...... yi
  2. kafka文档(3)----0.8.2-kafka API(java版本)
  3. nacos注册中心死活发现不了服务问题
  4. 浅谈HTTP 和 HTTPS的区别
  5. 企业高性能缓存----varnish
  6. 基于matlab测量物体直径,基于MATLAB的零件尺寸检测误差分析的软件设计
  7. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法
  8. SQL中rand和order by rand()用法
  9. 移动硬盘在mac电脑上不能用的原因和解决方法
  10. umi 加载导航_利用AGV导航激光定位技术解决移动机器人取卸货不成功的问题