(已更替)游戏数学: 计算射线与平面的交点(上帝视角)

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

发现自己想复杂了,有更简单的实现:
https://blog.csdn.net/ithot/article/details/125135656

游戏数学: 计算射线与平面的交点(上帝视角)

在这里插入图片描述

应用场景

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

数学计算

在这里,实际上是有几个前提的计算,或者说是简化版的射线与平面的交点
因为是上帝视角,所以射线的起点的y轴坐标一定为正,与y轴的夹角一定为锐角,且我们使用xy轴组成的平面作为交点计算的平面
在这里插入图片描述
我们假设射线起点为A点(ax, ay, az),与xy轴平面相交点为B点(bx, 0, bz),A点在xy轴平面的投影点为C点(ax, 0, az),我们的目标是要求解出B点的位置,A点位置已知,因此C点位置也是已知,我们可以以C点为原点重新建立坐标系,只需求解出向量CB,就可以求解出B点,射线方向已知,我们可以通过三角函数求出AB段的长度,由此求出AB向量,将其y轴置为0即可求得CB向量

或者假设原点为O
则有OB + BC = OC
则OB = OC - BC = OC + CB

故有求解公式如下:
AC长度 = ay
AB长度 = ay / cos(射线方向 与 AC向量的夹角)
AB向量 = 射线方向 * AB长度 = (abx, aby, abz)
CB向量 = (abx, 0, abz)
C点 = (ax, 0, az)
B点 = (ax + abx, 0, az + abz)

在Unity中的示例

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


using System.Collections;
using System.Collections.Generic
Unity取得两向量的交点 public static Vector3 GetIntersection(Vector3 lineAStart, Vector3 lineAEnd, Vector3 lineBStart, Vector3 lineBEnd) { float x1 = lineAStart.x, y1 = lineAStart.y; float x2 = lineAEnd.x, y2 = lineAEnd.y; float ... 阅读详情

相关推荐

[Unity]摄像机屏幕中点获得某平面的一个坐标

射线平面 相交的 坐标点。 从摄像机 发出一个射线, 方向为 Game视图的中心点,Y为0的平面相交 的点。 ... // Update is called once per frame void Update() { Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));//射线 Debug.Dra...

BuladeMian的博客,菜得抠脚,菜得真实 943

Unity】俯视角相机地面视野范围的计算

在SLG等游戏中,相机总是固定为俯视角上帝视角)。为了更好地管理游戏数据,需要对地图进行分块,只处理视野内的部分。判定某个单位是否在视野内有很多方法了,但是要么不够精确,要么性能不够,要么无法AOI配合。 一个可行的方案就是将相机在地面上的视野计算出一个AABB 2D 包围盒,然后基于此包围盒来计算 AOI、显隐等。这个方案效率够高,而且对俯视角适配较好。

魔术师Dix的博客 5090

计算射线平面交点

#include "stdafx.h" #include using namespace std; struct Point3{ float x; float y; float z; }; struct Vector{ float x; float y; float z; }; struct Ray{ //一点,和一个方向向量(两点求差)确定一条射线, Point3 p

吃货敲代码 7201

[Unity][射线检测]屏幕中心点摄像机发出一个射线平面相交的点

主摄像机 的 屏幕中心 方向 从主摄像机的世界坐标 为起点 发出 一条 射线,获得该射线 Y = 1 的平面 的 坐标的值 ... update() { ... //从 摄像机 开始 向 屏幕中心 的2D 坐标 发射 射线 Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));//射线 RaycastHit hit; ...

BuladeMian的博客,菜得抠脚,菜得真实 3031

Unity3D开发之计算鼠标点击射线和地面的交点(无collider)

在开发的时候我们经常会遇到这种需求,点击鼠标获取和地面的交点。通常我们使用射线和地面碰撞。可是当场景中有很多物体的时候 ,我们就要设置射线的碰撞laymask。非常麻烦。这里我们使用数学计算和地面的交点,无需担心其他干扰。 我们点击鼠标后,发出一条射线,我们通过这条射线就可以获取到和地面的交点。我们计算射线的起点y值和平面的距离(y=0)。然后在获取射线方向向量在y轴方向的分量,这样我们通过距离...

Jay W的博客 2855

地球Online逃生指南(上卷)

本书是一部系统探讨人类意识困境的哲学著作。全书通过七卷本的结构,依次解构人类认知牢笼、自我本质、世界实相、痛苦根源,最终指向自由、慈悲终极实相。第一卷揭示大脑建构的认知幻象;第二卷剖析"自我"的神经机制;第三卷以系统论阐释世界空性;第四卷建立痛苦的数学模型;第五卷提出觉知训练体系;第六卷论证利他主义的科学基础;第七卷超越逻辑束缚直指存在本质。著作融合现代神经科学、量子物理、复杂性理论东方哲学,构建了一个从认识到解脱的完整认知框架,最终指向无条件的临在宇宙层面的觉知。

weixin_45747731的博客 544

Unity 计算ABCD两条线段的交点

向量CA CD的法线V1AB如果垂直正弦值为0,这样才共面。

qq_31456205的博客 725

Unity计算射线平面相交距离的原理

其中(A, B, C)平面法向量,D是平面到原点的距离,这里的xyz的意思是,当你有一个点 (x,y,z) 时,你可以将这个点的坐标代入平面方程 Ax+By+Cz+D=0 中。其中,P 是射线上的任意一点,origin 是射线的起点,direction 是射线的方向向量,t 是一个参数,它表示从起点到点 P 的距离(但注意这里的距离是沿着射线方向的,所以实际上是一个标量倍数,用于缩放方向向量)根据上面的说法,射线平面相交的这个点代入这个公式,如果等于0,就说明这个点在平面上,即我们需要的这个交点

Morris-w的专栏 958

射线平面相交检测

射线平面相交检测 3D 中射线平面相交检测 本篇讨论的射线是无限长,平面无限大 下图展示的几种位置关系:相交、不相交 相交包括:只有一个交点 (射线3)射线平面内有无数交点 (射线4) 不相交:射线平面平行 (射线1)射线平面不平行也不相交 (射线2、射线5) 判断射线2和射线5和平面不相交,添加辅助线如下 在平面上任取一点C 射线2中:P1为射线起点,向量P1A 是射线的方向向量, 连接P1C 点乘:Dot(向量P1A,平面法向量 Normal) > 0 点乘:Dot(向量P1C,

lq 2075

unity 数学 如何计算线和平面交点

首先我们要知道向量归一化点乘之后得到就是两个向量的夹角的余弦值,如果两个向量相互垂直则值是0,小于0则两个向量的夹角大于90度,大于0则两个向量夹角小于90度,所以可以得出一下公式1:(p-p0)*n=0。已知一个平面上的一点P0和法向量n,一条直线上的点L0和方向L,求该直线平面交点P。而由于交点p是属于直线上的一点,所以我们能推倒出公式2:P=L0+dL;(L0-P0)*n+dL*n=0(点乘满足分配率)d=(p0-L0)*n/L*n(点乘满足结合律)只要我们求出d的值带入公式2就能求出交点P.

wnagleiming的博客 925

射线平面求交

射线: 1. 有一个端点 2. 一端无线延伸 射线的参数方程 p(t) = p0 + tu p0是射线的起点, u是射线的方向向量,t为时间,t∈[0,∞) 根据t的取值不同,可得射线上不同的点,所有这些点便构成了整个射面 平面: 一个平面可以由平面上的一点p0和平面的法向量n来确定(过一点,有且只有一个平面已知直线垂直) 平面是由无穷多个点组成的,对于过点p0且法向量为...

qianshanyany的博客 4841

射线平面交点

我们设交点为Pro(Projection),平面上的点PP(PlanePoint)和平面向量PN(PlaneNormal),则向量PP-Pro在平面上,PN垂直,其点积为0。 即:(PP-Pro)·PN = 0;公式一 对于这条射线,起始点为P,方向为Dir,那么 P加上一定量的Dir,能够过得交点Pro,则Pro = P+d·Dir(公式二),d是一定的比例。 把公式二代入公式一,我们可...

qq_20962215的博客 2085

射线平面交点,向量点乘和叉乘

opengl

weixin_42065195的博客 1147

射线平面的表示方式

射线:   空间中的射线可以用一个点P0和一个方向向量D表示,表达公式为:   T(t) = P0+Dt,其中,Dt为射线的长度。   几何意义如下图:      平面:   平面可以用平面的法线向量N平面的一个点P1来表示。   N点乘(p-p1) =0,其中p点为平面上任意一点除却P1点)平面射线的关系:   t = (N*P1-N*P0)/N*D   如果t...

weixin_30908941的博客 1880

Unity求一条直线平面交点

这个是面试官经常考的一个问题,我们先把它变成一个数学问题。已知一个平面上的一点P0和法向量n,一条直线上的点L0和方向L,求该直线平面交点P如下图首先我们分析一下我们知道平面和直线的法向量,知道平面和直线上的一点,求直线平面上的交点p。这里我们就要引入点积的概念。点积的几何意义(百度百科直接粘的)设二维空间内有两个向量  和  ,它们的夹角为  ,则内积定义为以下实数: [2] 该定义只对...

q493201681的博客 1万+

unity3D中射线模型交点坐标显示

鼠标随意点在模型上射线会射在所点击处,并显示点击处的坐标。 代码: using UnityEngine; using System.Collections; public class Test : MonoBehaviour {     void Update()     {         if (Input.GetMouseButton(0))        {            ...

WUYIDUER的博客 3349

射线平面的相交检测(Ray-Plane intersection test)

射线的定义 在欧几里德几何中,射线的定义是:直线上一点和它一旁的部分。由此可知,射线有两个性质,一是只有一个端点,二是一端无限延伸。 射线的参数方程 其中p0是射线的起点, u是射线的方向向量,t >= 0,根据t的取值不同,可得射线上不同的点,所有这些点便构成了整个射线,如图 平面的定义 平面可以由法向量和平面内的一点来确定,因为过一点,有且只有一个平面

兴趣是最好的老师 1276
上一篇: Unity Shader:贴图采样器Sampler的使用
下一篇: 游戏数学: 计算屏幕点中的平面上的点(上帝视角)
番茄猿
博客等级 码龄15年 369粉丝 · 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值