一些图形学中的数学应用

包围体是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳。如图1所示。

clip_image001

                                                                       图1 依次是球体、AABB、OBB

可以看到图1是3D包围体,在2D包围体如图2所示:

clip_image003

                                                                    图2 依次是球体、AABB、OBB

 

OBB

方向包围盒(Oriented bounding box),简称OBB。方向包围盒类似于AABB,但是具有方向性、可以旋转,AABB不能旋转。如图3所示。

clip_image005

                                                                  图3 矩形和矩形投影检测的四条轴

要计算两个OBB是否碰撞,只需要计算他们在图3上的4个坐标轴上的投影是否都发生重叠,如果是,则两多边形有接触。这也可以扩展到任意多边形,如图4所示。

                                                    clip_image007

                                                            图4 矩形和三角形投影检测的五条轴

投影轴来自于多边形自身边的垂线。

判定方式:两个多边形在所有轴上的投影都发生重叠,则判定为碰撞;否则,没有发生碰撞

OBB存在多种的表达方式,这里使用最常用的一种:一个中心点、2个矩形的边长、两个旋转轴(该轴垂直于多边形自身的边,用于投影计算)。代码如下所示:

(function (window) {var OBB = function (centerPoint, width, height, rotation) {this.centerPoint = centerPoint;this.extents = [width / 2, height / 2];this.axes = [new Vector2(Math.cos(rotation), Math.sin(rotation)), new Vector2(-1 * Math.sin(rotation), Math.cos(rotation))];this._width = width;this._height = height;this._rotation = rotation;}window.OBB = OBB;
})(window);

其所依赖的Vector2这个类如下所示:

(function (window) {Vector2 = function (x, y) {this.x = x || 0;this.y = y || 0;};Vector2.prototype = {sub: function (v) {return new Vector2(this.x - v.x, this.y - v.y)},dot: function (v) {return this.x * v.x + this.y * v.y;}};window.Vector2 = Vector2;
} (window))

然后基于这个数据结构,进行OBB之间的相交测试。为OBB扩展一个方法,即或者在任意轴上的投影半径:

OBB.prototype = {getProjectionRadius: function (axis) {returnthis.extents[0] * Math.abs(axis.dot(this.axes[0])) + this.extents[1] * Math.abs(axis.dot(this.axes[1]));}
}

这里你可能需要读者了解Vector2.dot的几何意义:若b为单位矢量,则a与b的点积即为a在方向b的投影

有了这些,就可以进行相交检测。由上面的判定方式,可以得出,两个矩形之间的碰撞检测需要判断四次(每个投影轴一次)。完整检测代码如下所示:

(function (window) {var CollisionDetector = {detectorOBBvsOBB: function (OBB1, OBB2) {var nv = OBB1.centerPoint.sub(OBB2.centerPoint);var axisA1 = OBB1.axes[0];if (OBB1.getProjectionRadius(axisA1) + OBB2.getProjectionRadius(axisA1) <= Math.abs(nv.dot(axisA1))) return false;var axisA2 = OBB1.axes[1];if (OBB1.getProjectionRadius(axisA2) + OBB2.getProjectionRadius(axisA2) <= Math.abs(nv.dot(axisA2))) return false;var axisB1 = OBB2.axes[0];if (OBB1.getProjectionRadius(axisB1) + OBB2.getProjectionRadius(axisB1) <= Math.abs(nv.dot(axisB1))) return false;var axisB2 = OBB2.axes[1];if (OBB1.getProjectionRadius(axisB2) + OBB2.getProjectionRadius(axisB2) <= Math.abs(nv.dot(axisB2))) return false;return true;}}window.CollisionDetector = CollisionDetector;
})(window)

这里拿两个OBB的中心点连线在坐标轴上的投影长度和两个矩形投影半径之和进行对比,如果半径之后都小于或者等于中心连线之后才判定为碰撞,否则判定为分离状态。

 

怎样判断平面上一个矩形和一个圆形是否有重叠?

c为矩形中心,h为矩形半長,p为圆心,r为半径。

计算方法是先找到矩形上离圆形最短距离u,然后再比较u是否小于圆形的半径r

1. 首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限的圆心也能映射至第一象限,这不影响相交测试的结果:

 

 

2. 然后,把 v 减去 h,负数的分量设置为0,就得到圆心与矩形最短距离的矢量 u。下图展示了4种情况,红色的u是结果。

 3. 最后要比较 和 r 的长度,若距离少于 r,则两者相交。可以只求 的长度平方是否小于 的平方。

 

转自知乎https://www.zhihu.com/question/24251545

方向包圍盒碰撞檢測

https://www.cnblogs.com/iamzhanglei/archive/2012/06/07/2539751.html

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

https://www.cnblogs.com/graphics/archive/2009/10/17/1585281.html

 

判断点是否在三角形内

https://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html

 

射线和三角形的相交检测(ray triangle intersection test)

https://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU Gems2 - 13 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)

本文摘自https://zhuanlan.zhihu.com/p/38411575 【章节概览】 这章在讲大家很熟知的环境光遮蔽&#xff08;Ambient Occlusion , AO&#xff09;。 文中的描述是&#xff0c;介绍了一种用于计算散射光传递的新技术&#xff0c;并演示如何用它来计算运动场景中的全局光照。主要…

解析Monte-Carlo算法(基本原理,理论基础,应用实践)

转载自https://www.cnblogs.com/leoo2sk/archive/2009/05/29/1491526.html 引言 最近在和同学讨论研究Six Sigma&#xff08;六西格玛&#xff09;软件开发方法及CMMI相关问题时&#xff0c;遇到了需要使用Monte-Carlo算法模拟分布未知的多元一次概率密度分布问题。于是花了几天…

Unity SRP自定义渲染管线 -- 3.Lights

Lights Single-Pass Forward Rendering 实现 diffuse shading.支持 directional&#xff08;方向光&#xff09;, point&#xff08;点光源&#xff09;, and spotlights&#xff08;聚光灯&#xff09;.每帧可允许最多16个可见光参与渲染每个物体可以最多由4个像素光和4个顶…

Faceware 面部捕捉在Unity中的应用

官网软件下载&#xff1a;https://www.facewaretech.com/ 官网教程&#xff1a;http://support.facewaretech.com/ 官网素材下载&#xff1a;https://www.facewaretech.com/learn/free-assets Faceware Analyzer Faceware Retargeter&#xff08;Maya&#xff09; Unity 真…

Tone mapping进化论

转载自 https://zhuanlan.zhihu.com/p/21983679 这几年&#xff0c;随着拍摄设备、渲染方法和显示设备的发展&#xff0c;HDR慢慢会成为标配。照相机和摄像机可以捕捉到HDR的影响&#xff0c;渲染过程中可以产生HDR的画面。这些内容如果需要显示到LDR的设备上&#xff0c;就需…

坐标变换过程(vertex transformation)

原文&#xff1a;https://blog.csdn.net/wangdingqiaoit/article/details/51594408 在上面的图中&#xff0c;注意&#xff0c;OpenGL只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系&#xff0c;而局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而…

三灯布光法

原文&#xff1a;https://zhuanlan.zhihu.com/p/62307736?utm_sourcewechat_session&utm_mediumsocial&utm_oi919394520523739136 如果将视频影像比喻成一幅画&#xff0c;光线就是画笔&#xff0c;光影造就了影像画面的立体感。本期圈圈就给大家简单介绍一下视频影像…

齐次坐标

本文是一些关于齐次坐标知识的整合。 https://www.sohu.com/a/258317807_100007727 http://www.songho.ca/math/homogeneous/homogeneous.html https://blog.csdn.net/VenoBling/article/details/87794400 https://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.ht…

Unity SRP自定义渲染管线 -- 4.Spotlight Shadows

英文原文&#xff1a;https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/spotlight-shadows/ 渲染并且读取纹理从光空间&#xff08;光源角度&#xff09;渲染为阴影投射&#xff08;shadow casters&#xff09;添加一个着色器pass采样阴影贴图支持软阴影…

Unity SRP自定义渲染管线 -- 5.Directional Shadows

原文&#xff1a;https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/directional-shadows/ 支持多个方向光阴影控制阴影距离定义独立的主光源渲染和采样级联阴影&#xff08;cascaded shadow map&#xff09;使用球形剔除1. Shadows for Directional Lig…

浅析Unity中的Enlighten与混合光照

原文https://www.cnblogs.com/murongxiaopifu/p/8553367.html 0x00 前言 在Unity的5.6版本之前的5.x中&#xff0c;主要使用了Geomerics公司的Enlighten【1】来提供实时全局照明以及烘焙全局照明&#xff0c;在5.6之后Unity引入了新的Lightmapper——Progressive来提供烘焙全…

聊聊LightProbe原理实现以及对LightProbe数据的修改

原文链接https://www.cnblogs.com/murongxiaopifu/p/8997720.html 0x00 前言 最近工作比较忙&#xff0c;所以文章已经很久没有更新了。这篇小文的主题也是在出差的高铁上想到&#xff0c;因为最近和一些朋友聊天&#xff0c;发现他们中很多人的项目中都使用了多个实时光源。…

3D游戏的照明设计理论,第3部分:三点照明法的异端与误区

https://zhuanlan.zhihu.com/p/87997570 这是有关如何处理游戏照明的系列文章的一部分。第一部分是关于灯具&#xff0c;第二部分是关于光的形式材料。 在第一部分中&#xff0c;我们首先从文化角度考虑了灯光-灯光在整个历史上对不同的人意味着不同的事物&#xff0c;并且在照…

3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界

从更一般和更概念的角度来看&#xff0c;这是有关我如何处理游戏照明的系列文章的一部分。我在Unity中构建了大部分示例&#xff0c;但这通常适用于任何3D游戏引擎&#xff0c;其中大多数具有类似的照明工具。 我们开始思考了有关光照的文化和概念&#xff0c;在第一部分。在第…

unity shader 变种(多重编译 multi_compile)

一、定义 在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器&#xff08;mega shader&#xff09;或者超着色器&#xff08;uber shader&#xff09;。实现原理&#xff1a;…

AndroidStudio导出aar文件给Unity使用

AndroidStudio导出aar文件给Unity使用 本文参考 &#xff1a;http://www.devacg.com/?post548 Demo地址&#xff1a;https://github.com/JulyNine/AndroidToUnity 一、用Android Studio创建个空工程 注意&#xff1a;包名要与Unity中工程的包名不一致&#xff0c;不然打包时…

Unity C# Job System介绍(四) 并行化Job和故障排除(完结)

并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时&#xff0c;只能有一个job来进行一项任务。在游戏中&#xff0c;非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。ParallelFor jobs当调…

C# Job System

概述 设计目的&#xff1a;简单安全地使用多线程&#xff0c;随便就能写出高性能代码 收益&#xff1a;FPS更高&#xff0c;电池消耗更低&#xff08;Burst编译器&#xff09; 并行性&#xff1a;C# Job System和Unity Native Job System共享工作线程worker threads&#xf…

Unity游戏开发——C#特性Attribute与自动化

这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。 比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。 比如你做网络框架的时候&#xff0c;一个协议号对应一个类的处理或者一个方法。 比如你做…

Unity c#中Attribute用法详解

举两个例子&#xff0c;在变量上使用[SerializeFiled]属性&#xff0c;可以强制让变量进行序列化&#xff0c;可以在Unity的Editor上进行赋值。 在Class上使用[RequireComponent]属性&#xff0c;就会在Class的GameObject上自动追加所需的Component。 以下是Unity官网文档中找…