PhysX学习笔记(2): 动力学(1)

本文介绍了物理引擎的基本概念,包括场景(Scene)、模拟时序(Timing)和异步步进等内容,并探讨了如何通过调整时间步进确保物理模拟的稳定性和可重现性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景(Scene):

物理模拟发生的场所, 包含了actor, joint, effector. 跟图形引擎里的Scene差不多, 可以有多个实例存在, 互不干涉.

场景没有特别的大小限制. 功能有重力, 射线拣取, 开关硬拼检测等.

模拟时序(Timing):

物理模拟导致物体的一些属性随着时间进行变化, 如位置, 速度等.

模拟每经过一次时间步进进行一次, 通常要与渲染帧数进行同步.

前进(也可以说是更新):

void simulate(NxReal elapsedTime);

elapsedTime会被分成多个时间步进来决定物理模拟进行了多少

时序可以用setTiming设置, decriptor也可. 默认值就能够满足大多数程序的要求了.

固定的时间步进可以确保稳定且可以重现的物理模拟, 需指定NX_TIMESTEP_FIXED.

异步的步进:

PhysX是多线程的, 物理模拟发生在自己的线程里. 状态变化如下:

1) 开始模拟

2) 确保数据已被发送到模拟线程

3) 检测模拟是否完成, 如果是, 更新状态数据缓冲, 并且->

4) 交换状态数据缓冲, 这样结果可以被程序访问, 后台缓冲可以继续参数模拟(就像D3DBackBuffer)

NxScene* gScene; NxReal myTimestep = 1.0f/60.0f; ... void mySimulationStepFunction() { gScene->simulate(myTimestep); gScene->flushStream(); //...perform useful work here using previous frame's state data gScene-> fetchResults(NX_RIGID_BODY_FINISHED, true); }

注意fetchResults(NX_RIGID_BODY_FINISHED, true)是一个阻塞调用, 可以用这两种方式代替:

while(!gScene->checkResults(NX_RIGID_BODY_FINISHED, false) { // do something useful } while(!gScene->fetchResults(NX_RIGID_BODY_FINISHED, false) { // do something useful }

注意: 一些函数对于异步的状态改变不可知, overlapraycasting, 直到simulte()/fetchResult()执行后才可.

外壳宽度(Skin Width):

通俗点说, 就是能两个物体能相互插入多么深….. 因为模拟是以时间步进为单位的, 所以两次步进之间就会产生一个跳变, 这种互相越界的现象不可避免. 于是乎引入这么一个量, 用于保证稳定性.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值