当前位置:首页 > 读后感 > 【动力学模拟简介】 kinetic模拟反应动力学
 

【动力学模拟简介】 kinetic模拟反应动力学

发布时间:2019-07-18 09:42:44 影响了:

本节介绍物理模拟的一般性概述,并介绍某些使用 reactor 时可能用到的概念。

物理模拟

reactor 中使用的Havok 的物理学技术,依赖于一个称为“物理模拟”的过程,其目的是为场景中的对象提供动态环境。那么“物理模拟”到底是指什么呢?

它是一个根据对象的物理属性自动确定其运动状态的过程。其实现方法是:在一个强有力的有效引擎中封装一些物理法则,如牛顿运动定律,从而计算各个对象随时间向前推进时的位置。同样的道理,动画是由很多单独的图像或帧组成的,物理模拟把时间分割成小的离散步幅,然后预测各个对象在各个步幅期间的运动。所有这些步幅的累加效果就是流畅、连续、可信的运动。

和传统的基于关键帧的动画不同(传统情况下动画师需要指定一组关键帧配置),而物理模拟根据对象的属性确定其运动。这就减轻了动画师的负担,现在他们不需要为一次爆炸中的每一个碎片、一幅角色特技动画中的每一块骨骼或者一块布料中的每一个顶点手动设置动画。

在物理模拟中,会将物理属性(质量、弹力)指定给场景中的所有对象。之后,会与一组外力(如重力或风)和/或约束(如弹力或球形套接配置)相互补充。借助所有这些信息,物理学引擎会计算一组连续的状态,它可以随即显示出来(实时显示,如果计算足够快的话)或者转换成关键帧(将要在稍后阶段复制)。

物理学引擎的作用

像 Havok 这样的物理学引擎要执行三个基本任务:

碰撞检测 — 跟踪场景中所有对象的移动,然后检测它们发生碰撞的时间。

更新系统 — 根据对象属性解析碰撞,为已经碰撞的对象确定合适的响应;对于所有其他(非碰撞)对象,则根据力更新这些对象。

与应用程序接口 — 一旦确定了所有对象的新位置和状态,我们通常需要(在 3d 窗口中)显示对象或者(以关键帧的形式在建模工具内)存储它们的状态。

注意:物理学引擎不知道,也不关心它进行模拟的对象是如何显示的。它根据对象的物理(而非图形)描述对这些对象的运动和交互过程进行模拟,而该描述信息有可以用于生成“追踪”模拟的显示。

倘若我们要对连续向前推进的状态(即,通常状况下对象始终处在运动、碰撞和反作用状态)进行模拟,就需要将它映射为一系列快照,以便生成动画。例如,在电脑游戏中,我们通常想让世界以每秒钟 60 次的频率进行显示(因为这是很多图形系统重绘屏幕的频率)。创建动画时,我们可能想存储每帧的状态(创建关键帧)。例如,在 60 FPS 下,这样做也会在每秒钟内创建 60 个关键帧,这实际上意味着如果物理学引擎知道所有对象在该时间间隔的起始状态以及作用在这些对象上的外力,则必须能够以 1/60 秒的速度向前推进“世界”。以**这个简单案例作为示例,并假设我们感兴趣的是 60Hz(Hz = 每秒的循环数或帧数)的动画。

对**进行模拟

让我们暂时忽略碰撞,只考虑对刚从大炮中发出的**的模拟。已知**的位置(和方向,但暂时忽略后者)、速度和加速度、重量,并假设已知环境的状态(即空气阻力、风力、重力)。有了这些已知条件,则可以开始用物理学引擎做出预测。

该图说明了我们要完成的内容。经过一段时间,**的上升速率应该由于重力而减慢,而且它应该在沿着一条标准的抛物线(假设无空气阻力)飞行之后最终落在地面上。

在给定的时间点上,可以检查**的状态(它的速度 v 和加速度 a),而且在已知作用在其上的外力情况下,可以推测它在经过一段时间(定义这段时间为 h 秒)后的位置变化。该推测是对多个因素的组合:

假设牛顿运动定律支配着**的运动

假设在时间段 h 内,所有作用在**上的外力都是恒定的(所以这段时间内的空气阻力、风力和重力不会改变。)

假设用于计算新位置的数学方法是精确的

一般而言,a) 通常是一个正确的假设(除非是在相对论或量子规模上,此时我们的假设应该由其他系统来处理)。但 b) 和 c) 会引发问题,而且和执行计算的时间段 h 紧密相连。现在,检查该时间段的大小对模拟准确性的影响。

时间步

一般而言,作用在对象上的力很少是完全恒定的(重力自始至终几乎为恒定,但其他多数力,如风力、空气阻力等都不是恒定的)。因此就**这个示例而言,可以设想大气中有一个风层,**如下图所示穿过该风层。

在左侧的模拟中,假设采用的时间步为 1 秒(该时间步对于物理模拟来说确实是相当大的,但用在此处来阐明要点)。已知时刻为 t1 时作用在**上的所有力,因此可以用一些数学方法预测经过 1 秒后,时刻为 t2 时的新位置和新速度。我们将假设这段时间内作用在**上的风力是恒定的。在该示例中,我们要计算新的位置,该位置将处在疾风区域之上的一个高度(所以通过一个非常大的跳跃,我们有效地避开了风的影响)。在右侧的第二个示例中,我们使用的时间步为 1/2 秒。在该案例中,确定了时刻为 t2 时的新位置之后,我们发现**位于风力区域的中部。该区域导致巨大的风力作用在**上,这将在下一个时间步中予以考虑,我们会在这一点重新评估数学方法,然后确定**在时间为 t3 时的新位置,该位置和在左侧模拟中确定的位置不同(即:风已经把**往左边吹了一点,并降低了**的速度),尽管每个案例中进行模拟的时间是相同的。

一般而言,采用的时间步越小,该时间步结束时的结果越精确 – 因此,如果想在时间上以较大的时间步 t 向前步进,最好将其分割成 n 个时间间隔更短的步长 t/n。

这对数学方法而言也是正确的。当模拟变得更加复杂时,计算模拟中对象的新位置和新速度所需的数学方法也会变得更加复杂,其结果是,由该数学方法产生的推测结果也越来越不精确。

所以,原则上应采用小的时间步,计算所有作用在对象上的力,确定对象在该时间步结束时的新位置和新速度(以及其他参数),然后重新开始。我们最后得到的结果是系统在向前推进的过程中的一系列状态的快照,如上图所示。

子步

上一节中,我们讲过物理引擎在确定了所有对象的新位置之后会通过必要的信息以更新显示。但如果不想更新每个模拟时间步中的显示,该怎么办呢?

假设我们确实需要每隔 1/60 秒更新一次应用程序(即:我们是在播放一个以 60Hz 刷新屏幕的实时游戏,或是在为一部 60FPS 影片的每个帧创建一个关键帧)。这实际上意味着我们想让物理引擎以 1/60 秒的时间间隔进行步进。在很多情况下,这样做不会出现问题,但假设如果模拟不够精确(记住:时间步越小意味着精确度越高),那么我们想进一步减小时间步,假设为 1/120 秒。可是这意味着生成的图像/关键帧数目是我们需要的两倍,这是不经济的。为解决这一问题,Havok 引擎允许您指定要采用的子步数目。

子步参数指定的是物理引擎在更新应用程序之前采用的步数。这样就能够控制物理模拟的间隔,而与显示更新/关键帧创建频率无关。因此当子步为 1 时,每一次 3D 显示更新使用的是单一模拟步。当子步为 2 时,每次更新应用程序之前采用的是 2 个物理步幅,依此类推。

在该图中,我们指定了物理模拟以 1/240 秒的时间间隔步进,但我们只是每 1/60 秒创建一个关键帧。其实现方法是让物理引擎采用 4 个子步。因此,对于每 4 个步幅,我们只创建一个关键帧 – 红点表示关键帧和模拟步,黄点仅表示模拟步。通过设置子步的数目,我们可以控制物理模拟的精确性,而与所创建的关键帧数目无关。

刚体和可变形体

刚体

Havok 模拟中的大多数对象都是作为刚体进行模拟的。刚体是一种在模拟过程中其几何形状从不会改变的对象。其外形不会(显而易见)改变的任何真实对象 – 从钢笔到滚下山坡的巨石 – 都可以作为刚体进行模拟。用这种方法对对象进行模拟有利于快速实时物理模拟 – 根据对象外形不会随模拟步的改变而改变这一事实,物理引擎在检测碰撞时可以做出某些假设。

可变形体

若要对布料、绳索或其他外形会随时间改变的材质进行模拟,需要使用不同类型的实体 – 可变形体。就可变形对象而言,碰撞检测变得更加困难 – 因为对象在时间步之间可以显著改变外形,并且也可以尝试与其自身发生碰撞。为此,对可变形体的模拟成本更高。

尺寸

作为一门知识体系,物理学是非常庞大的。我们在此处所关注的事情应当更精确地描述为真实规模下有关对象交互情况的机械模拟。我们要使用的牛顿力学,即由埃萨克牛顿爵士推广的、为众人所知的运动定律,它描述了对象在其他对象和外力影响下的行为。此后,我们已经发现这些定律在非常小的(即亚原子的)和非常大的(即行星的)规模下是无效的。

人们已经设计出新的物理学系统(例如相对论和量子理论)来处理这些规模的对象,但这些方式超出了我们所说的物理学引擎范围。我们所说的物理模拟技术所面对的规模是,在日常生活中要与之打交道的对象,如椅子、汽车、建筑物和足球等等的规模。默认情况下,引擎工作时使用的单位是米和千克。

务必记住工作时所使用的尺寸。例如,我们所见的人们最常犯的错误之一就是先创建一个 100*100*100 米的长方体,然后纳闷它降落的时间为什么那么长。当从一个足以看见整个长方体的距离(比方说 1km 远)查看该尺寸的长方体时,其降落速度看起来会和从 1 千米远处查看飞机库从某一高度下落时的速度相同,非常缓慢。

更改尺寸

Havok 物理学引擎在指定对象大小或重力强度时不关心所使用的度量单位,它只关心数字 – 所以举个例子,您可以以英寸为单位进行工作。不过,要实现逼真的(或至少是可预测的)结果,必须格外注意保持一致。所以举例来说,如果您以米为单位进行工作,就需要确保以米为单位将重力设定为适当的数值(如果需要类似地球上的重力,就应该使用 9.8 m/s2)。否则您可能会发现对象显示的降落速度远比您所期待的要更快或更慢。

注意:由于 CPU 浮点的精度,物理学引擎在处理量级尽可能接近 1 的数字时最为精确(即,像 10000000 这样的数值是不好的,像 0.0000001 这样的数值也是不好的)。因此,为了实现真实的场景,在创建 1*1*1 大小的对象时,以米或英尺要比以厘米或千米(或者英寸/英里)为单位进行工作更有效,因为您最经常模拟的都是些大于方糖块且小于足球场的对象。为此,很多物理引擎中的默认值通常都是以米为单位进行指定的。

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3