游戏数学: 计算屏幕点中的平面上的点(上帝视角)
游戏数学: 计算屏幕上点中的平面上的点(上帝视角)
应用场景
上帝视角,点击屏幕,需要计算此时点中的平面上的位置,比如将物体移到点击的位置上,或者需要拖拽物体移动
数学计算
在这里,实际上是有几个前提的计算,或者说是简化版的射线与平面的交点
因为是上帝视角,所以射线的起点的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的屏幕点击点转换到世界的射线也是可以拿出来自己计算的,这样子消耗就可以更小了。
游戏数学: 计算屏幕点中的平面上的点(上帝视角)相关推荐
- matlab实现计算全息,MATLAB中二元傅里叶变换计算全息图的算法
第 19 卷 第 3 期 2003 年 9 月 福建师范大学学报 (自然科学版) Journal of Fujian NormalU niversity (N atural Science) Vol1 ...
- matlab求两向量夹角_高考数学解题技巧:专题21 平面向量中最值、范围问题高中数学黄金解题模板...
↑ 点击上方"红色笔记"关注我们 高中各科解题技巧下载 回复数字:800009 高考数学解题技巧:专题24 数列求和方法高中数学黄金解题模板 高考数学解题技巧:专题26 含参不等 ...
- Shell脚本笔记(三)shell中的数学计算
shell中的数学计算 一.使用方括号 #!/bin/bash a=10 b=29 c=88res=$[$a * ($c-$b)] echo $res 二.使用(()) echo $((1+9)) ( ...
- R开发(part2)--R语言中的数学计算
学习笔记,仅供参考,有错必纠 参考自:<R的极客理想>-- 张丹 文章目录 R开发 R语言中的数学计算 对数 加权平均.连乘.差分.秩.任意数.全体数 阶乘.组合.排列 累加.累乘.最小累 ...
- 用计算机怎么计算r角度,R语言中的数学计算
原标题:R语言中的数学计算 前言 R是作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算,所以用R语言做数学计算题特别方便.如果计算器中能嵌入R的计算函数,那么绝对是一种高科技产品. ...
- R语言中的数学计算(转载)
R语言中的数学计算 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: http://blog.fens.me email: ...
- 希腊字母在数学计算中表示的含义
希腊字母在数学计算中表示的含义 序号 大写 小写 英语音标注音 英文 汉语名称 常用指代意义 1 Α α /'ælfə/ alpha 阿尔法 角度.系数.角加速度.第一个.电离度.转化率 2 Β β ...
- JavaScript中的Date日期、String字符串、Array数组、Math提供对数据的数学计算
一.Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date() ...
- 计算三维空间(推广到K维)中点到平面的投影点坐标
计算三维空间中点到平面的投影点坐标 问题概述: 三维平面的一般方程为: (1) A x + B y + C z + D = 0 Ax+By+Cz+D = 0\tag{1} Ax+By+Cz+D=0(1 ...
最新文章
- pku 1077 Eight
- 无盘服务器游戏盘尺寸,网吧无盘游戏服务器 案例五
- BZOJ3336: Uva10572 Black and White(插头Dp)
- python操作excel和txt文件
- 一个完整的 Web 请求到底发生了什么
- SAP Gateway类型为multipart mixed的请求处理逻辑
- 金字塔原理只需读前几页
- A2K课程目录及学习计划
- Tapestry 和 JSF
- js bom dom
- 资料管理工具VSGoogle?
- Python 3.5安装JPype
- 小程序——添加动画,让图标原地旋转
- 推荐电影 历届奥斯卡获奖影片 1971-2008
- 初中地理老师教师资格证考试成功通过前辈备考经验分享
- w10服务器优化,Win10专业版怎么优化最流畅?Win10最详细优化设置告别卡顿!
- 数学归纳法求证欧几里得算法
- Pygame开发Flappy Bird小游戏(下)
- 硬盘为raw格式后的修复
- 有哪些一般人不知道的数据获取方式
热门文章
- 超强古文...... yi
- kafka文档(3)----0.8.2-kafka API(java版本)
- nacos注册中心死活发现不了服务问题
- 浅谈HTTP 和 HTTPS的区别
- 企业高性能缓存----varnish
- 基于matlab测量物体直径,基于MATLAB的零件尺寸检测误差分析的软件设计
- 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法
- SQL中rand和order by rand()用法
- 移动硬盘在mac电脑上不能用的原因和解决方法
- umi 加载导航_利用AGV导航激光定位技术解决移动机器人取卸货不成功的问题