3D 场景模拟 2D 碰撞玩法的方案

news2024/12/27 12:06:12

目录

  • 方法概述
  • 顶点到平面的垂直投影
  • 求解最小降维 OBB
    • 主成分分析(PCA)
    • 协方差矩阵
    • 求矩阵特征值
    • Jacobi 方法
  • OBB 拉伸方法

对于类似《密特罗德 生存恐惧》和《暗影火炬城》这样 3D 场景,但玩法还是 2D 卷轴动作平台跳跃(类银河恶魔城)的游戏, 如果想要让碰撞检测更符合视觉直觉,需要采用 3D 碰撞体来模拟 2D 碰撞。本文将介绍一种实现方案。

方法概述

为了简化碰撞计算,原碰撞体(如武器的碰撞)只使用长方体(OBB)和球(sphere)。对于立方体,

  1. 首先将 8 个顶点垂直投影到与相机到碰撞体的连线垂直的碰撞体。
  2. 根据同一平面的 8 个顶点生成一个包围点云的误差最小的二维 OBB 。
  3. 将 2 维 OBB 沿着法线方向(碰撞体到相机的连线)前后拉伸足够长形成一个长方体,以使其能够与景深不同的其他碰撞体发生碰撞。
    在这里插入图片描述
    对于球碰撞体也采用类似的方法,只是无需通过顶点生成包围盒这一步,且拉伸后的结果为胶囊体。如果想要模拟较复杂的碰撞体,可以将其简化为多个基础碰撞体的组合再进行处理。
    接下来讲解具体每一步。

顶点到平面的垂直投影

8 个顶点投影基本算法如图所示,平面 P P P 的单位法线向量为 n n n p p p 为平面上任一点。
请添加图片描述

求任意点 a a a 到平面 P P P 的投影点的向量解法为:

  1. 求向量 ( a − p ) (\boldsymbol a-\boldsymbol p) (ap) n \boldsymbol n n 方向上的投影: d = n ⋅ ( a − p ) d = \boldsymbol n\cdot(\boldsymbol a-\boldsymbol p) d=n(ap)
  2. 投影点 a ′ a^\prime a 即为: a ′ = a − d n a^\prime =\boldsymbol a - d\boldsymbol n a=adn

求解最小降维 OBB

最小OBB 就是包围点云最小体积的 Bounding Box 的方法。采用的方法为主成分分析。

主成分分析(PCA)

主成分分析(Principal Component Analysis, PCA) 是一种常用的降维技术,旨在通过特征值和特征向量将高维数据转换为低维数据,同时尽量保留原始数据的方差(信息)。
PCA 的步骤:

  1. 计算协方差矩阵:计算数据集的协方差矩阵,捕捉数据中各特征之间的相关性。

  2. 求特征值和特征向量:计算协方差矩阵的特征值和特征向量。特征向量表示新的基向量(主成分方向),特征值表示这些方向上的方差大小(信息量)。

  3. 选择主成分:按特征值的大小对特征向量进行排序,选择特征值较大的几个特征向量作为主成分。这些主成分对应了数据集的主要变化方向。

  4. 转换数据:将原始数据投影到这些主成分上,从而实现降维。

下面介绍一下协方差矩阵。

协方差矩阵

协方差矩阵是一个方阵,其中每个元素代表了一对变量之间的[[协方差]]。对于随机向量 X = ( X 1 , X 2 , . . . , X n ) X = (X_1, X_2, ..., X_n) X=(X1,X2,...,Xn),其协方差矩阵 Σ \Sigma Σ 定义为:
Σ = [ σ 1 , 1 σ 1 , 2 ⋯ σ 1 , n σ 2 , 1 σ 2 , 2 ⋯ σ 2 , n ⋮ ⋮ ⋱ ⋮ σ n , 1 σ n , 2 ⋯ σ n , n ] \Sigma = \begin{bmatrix} \sigma_{1,1} & \sigma_{1,2} & \cdots & \sigma_{1,n} \\ \sigma_{2,1} & \sigma_{2,2} & \cdots & \sigma_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{n,1} & \sigma_{n,2} & \cdots & \sigma_{n,n} \end{bmatrix} Σ= σ1,1σ2,1σn,1σ1,2σ2,2σn,2σ1,nσ2,nσn,n
其中, σ i , j \sigma_{i,j} σi,j X i X_i Xi X j X_j Xj 之间的协方差,计算公式为:
σ i , j = E [ ( X i − μ i ) ( X j − μ j ) ] \sigma_{i,j} = E[(X_i - \mu_i)(X_j - \mu_j)] σi,j=E[(Xiμi)(Xjμj)]
μ i \mu_i μi μ j \mu_j μj 分别是 X i X_i Xi X j X_j Xj 的期望值。
协方差矩阵是一种统计量,描述点云的方向分布和扩展。它的主方向(最大特征值对应的特征向量)可以用来估计点云的主要方向,进而可以确定 OBB 的方向和大小。

求矩阵特征值

以下是几种主要的求解矩阵特征值和特征向量数值方法的对比。这些方法各有优劣,适用场景也不同,具体对比如下:

方法适用矩阵类型特征值求解特征向量求解优点缺点
QR 分解法任意矩阵所有特征值所有特征向量能求所有特征值和特征向量,适用于稠密矩阵实现复杂度高,计算量大,适用于中小型矩阵
Jacobi 方法对称矩阵所有特征值所有特征向量简单易实现,适合小型对称矩阵,数值稳定仅适用于对称矩阵,效率低于 QR 法
分而治之法对称矩阵所有特征值所有特征向量高效,适合对称矩阵,能并行计算实现复杂,适用性较窄(仅对称矩阵)
Lanczos 方法大型稀疏矩阵部分特征值部分特征向量高效,内存消耗低,适用于大规模稀疏矩阵数值稳定性差,需稳定化处理,不适合稠密矩阵

因为要求解的矩阵是 3 维协方差矩阵,属于小型对称矩阵,并且需要稳定高精度的解,所以推荐使用 Jacobi 方法。

Jacobi 方法

Jacobi 方法的核心思想是不断应用旋转变换来消除矩阵中的非对角元素,逐步将矩阵逼近一个对角矩阵。每次迭代选择一个最大的非对角元素,将它变为零,最终,矩阵的对角元素就是特征值,对角化过程中形成的旋转矩阵乘积则为特征向量矩阵。
关键步骤包括:

  1. 找到最大非对角元素。
  2. 计算旋转角度并执行旋转。
  3. 更新矩阵和特征向量矩阵。
  4. 检查终止条件。

因为最终结果应为 OBB,所以可以对求解出的特征向量采用施密特正交化(Schmidt Orthogonalization)来进行正交化。

OBB 拉伸方法

考虑相机是透视视角的,投影OBB正常应该拉伸成一个截头锥体(frustum),但 frustrum 的碰撞计算过于耗费性能。又由于透视效果并不是很大,并且保证碰撞体景深方向距离尽可能小,所以替换为使用立方体来模拟。也是因为透视,在碰撞体原位置进行投影后拉伸即能保证最正确的视觉效果。
需要注意的一点时,会进行碰撞检测的任意两个碰撞组之间只需要有一方进行投影拉伸即可保证碰撞事件的触发,另一方也可以采用一些精度较高精度的碰撞体。

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

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

相关文章

[项目][CMP][Central Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Central Cache也是一个哈希桶结构,它的哈希桶的映射关系跟Thread Cache是一样的不同的是它的每个哈希桶位置挂的是SpanList链表结构(带头双向循环链表),不过每个映射桶下面的span中的大…

链式栈、队列

1、链式栈&#xff1a; 声明&#xff1a; #ifndef _STACK_H #define _STACK_H #include<stdlib.h>typedef int DataType;typedef struct snode //节点 {DataType data;struct snode *pnext; }SNode_t;typedef struct stack //链表 {SNode_t *ptop;int clen; }St…

Patlibc———更快捷的更换libc

起初是为了简化做pwn题目时&#xff0c;来回更换libc的麻烦&#xff0c;为了简化命令&#xff0c;弄了一个小脚本&#xff0c;可以加入到/usr/local/bin中&#xff0c;当作一个快捷指令&#x1f522; 这个写在了tools库&#xff08;git clone https://github.com/CH13hh/tools…

C++利用jsoncpp库实现写入和读取json文件(含中文处理)

C利用jsoncpp库实现写入和读取json文件 1 jsoncpp常用类1.1 Json::Value1.2 Json::Reader1.3 Json::Writer 2 json文件3 写json文件3.1 linux存储结果3.2 windows存储结果 3 读json文件4 读json字符串参考文章 在C中使用跨平台的开源库JsonCpp&#xff0c;实现json的序列化和反…

【有啥问啥】大模型应用中的哈希链推理任务

大模型应用中的哈希链推理任务 随着人工智能技术的快速发展&#xff0c;尤其是大模型&#xff08;如GPT、BERT、Vision Transformer等&#xff09;的广泛应用&#xff0c;确保数据处理和模型推理的透明性与安全性变得愈发重要。哈希链推理任务作为一种技术手段&#xff0c;能够…

会员营销如何利用JSON发送短信

在当今这个数字化时代&#xff0c;企业间的竞争日益激烈&#xff0c;如何高效地触达并维护用户群体&#xff0c;提升用户粘性和忠诚度&#xff0c;成为了每个企业都必须面对的重要课题。在众多营销手段中&#xff0c;会员营销因其精准性和个性化而备受青睐。而在会员营销的策略…

人工智能导论(上)

一、人工智能概述 人工智能这个基本概念的起源&#xff08;人工智能作为计算机科学的一个分支&#xff09; 很多应用研究领域都在人工智能的范畴里&#xff0c;比如机器人、语言识别、图像识别、自然语言处理和专家系统等等。更加通俗的说&#xff0c;人工智能是要让一部机器能…

传输层协议UDP

本篇将主要介绍 UDP 协议&#xff0c;介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项&#xff0c;以及有关 UDP 的 Socket 编程程序&#xff0c;同时重点介绍了操作系统对于 UDP 协议报文的管理。 接着介绍了有关端口号的映射。 …

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设&#xff0c;如 DMA 控制器、 UART、IIC 等等。 在这些中断源中&#xff0c;UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中…

哲学概述2(马克)

三、哲学的基本问题 思维是主观的&#xff08;对应意识&#xff09; 存在是客观的&#xff0c;不以人的意志为转移&#xff08;对应物质&#xff09; 恩格斯说&#xff1a;“全部哲学&#xff0c;特别是近代哲学的重大的基本问题&#xff0c;是思维和存在的关系问题” 哲学的基…

HTML生日蛋糕

目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽&#xff0c;小编亲测&#xff0c;发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福&#xff0c;快拿去送给你的好朋友吧&#xff01; 完整代码 <!DOCTYPE html>…

Python中的位运算-从入门到精通

你是否曾经好奇过计算机是如何在底层处理数据的?或者,你是否想知道为什么有些程序员总是津津乐道于位运算的强大?如果是,那么你来对地方了!今天,我们将深入探讨Python中的位运算,揭示它们的神奇之处,以及如何利用它们来优化你的代码。 目录 位运算:计算机的秘密语言为什么位…

JavaScript Web API入门day6

目录 1.正则表达式 1.1 什么是正则表达式 1.2 语法 1.3 元字符 1.3.1 边界符 1.3.2 量词 1.3.3 字符类 1.4 修饰符 1.5 案例 2.综合案例 2.1 小兔鲜页面注册 2.2 小兔鲜登录页面 2.3 小兔鲜首页页面 1.正则表达式 1.1 什么是正则表达式 正则表达式&#xff08;Re…

Chapter 12 Vue CLI脚手架组件化开发

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一&#xff0c;Vue CLI为开发者提…

会声会影哪个版本最新

会声会影2023永久免费版能通过多种不同的特效的添加和项目的编辑和处理&#xff0c;能迅速的帮助用户能实现多种不同格式下的结果的提升&#xff0c;让用户能直接的完成相应的帮助和完善提升。 会声会影2023永久免费版简介&#xff1a; 会声会影2023永久免费版是一款简单的视频…

多模态在京东内容算法上的应用

多模态在京东内容算法上的应用 作者&#xff1a;京东零售技术 2024-09-04 北京 本文字数&#xff1a;5226 字 阅读完需&#xff1a;约 17 分钟 本文作者唐烨参与 DataFunsummit2024&#xff1a;推荐系统架构峰会&#xff0c;在专题【多模态推荐论坛】中分享了多模态算法在京…

如何在Word中插入复选框

如何在Word中插入复选框&#xff1a;详细教程与技巧 在Word中插入复选框是一项非常实用的技巧&#xff0c;尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时&#xff0c;复选框不仅能提高文档的功能性&#xff0c;还能显得更加专业。本文将详细讲解…

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…

各类AI工具编程能力测试对比

各类AI工具编程能力对比 现在各类AI工具火爆&#xff0c;擅长各类问题解决&#xff0c;闲来无事&#xff0c;验证下各类AI工具的编程能力如何。问题&#xff1a;c 实现杨辉三角&#xff0c;并main函数测试 kimi 对话窗口输入问题&#xff0c;得到了c的完整程序&#xff1a; …

JS面试真题 part2

JS面试真题 part2 6、typeof 与 instanceof 区别7、JavaScript原型&#xff0c;原型链&#xff1f;有什么特点8、说说你对作用域链的理解9、谈谈this对象的理解10、说说new操作符具体干了什么 6、typeof 与 instanceof 区别 自己回答&#xff1a; typeof&#xff1a;用来判断数…