⑴ 虚拟现实程序设计 怎样实现动画控制 starttime
虚拟现实软件系列产品功能介绍我给你写一下吧。根据项目的复杂程度不同用到的软件也不同。一、软件1、三维场景编辑器(用于可视化三维场景的编辑,简单易用,面向美工,两天学会一周精通。完全可视化的材质编辑和交互设置,简单易学,节省了时间、提高了效率。可广泛应用于旅游景点、文物古建、工业产品、工厂校园、房产旅游等行业场景的制作。)2、二次开发工具包 (SDK是基于Converse3D引擎的二次开发包,本SDK开放了所有模块的接口,包括:场景载入、模型操作、动画、相机、UI、角色系统、虚拟社区。使用本SDK可用于各行业开发出集VR场景、数据库、业务系统等多种资源与一体的大型系统。)3、虚拟社区系统(C3D-Community三维虚拟社区系统实现角色在虚拟世界的互动与交流,角色以化身形式登录三维仿真场景,角色彼此可以相见,可以通过文字、语音、视频进行聊天,亦可进行肢体互动。它的出现使三维场景不再是孤立的单体场景,而是一个生机勃勃的社会系统,是未来人们网上生活的重要组成部分。)4、粒子特效编辑器(C3D粒子特效编辑器支持特效的脚本配置功能,可以模拟雾、雪、雨、烟火、山崩地裂等各种特殊效果,使得制作粒子特效简单而灵活)5、物理引擎系统(物理引擎通过为刚性物体赋予真实的物理属性的方式来计算它们的运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的——简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现。然而,当游戏需要比较复杂的物体碰撞、滚动、滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了。物理引擎使用对象属性(动量、扭矩或者弹性)来模拟刚体行为,这不仅可以得到更加真实的结果,对于开发人员来说也比编写行为脚本要更加容易掌握。)二、硬件系统 多通道立体投影(C3D多通道环幕立体投影系统采用N+1(一台主控机和N台客户机)台主机和若干台投影仪及环形屏幕组建而成,多通道立体显示系统扩展了视野,使得进入视野的信息更多了,给观众以极强的沉浸感和真实感。是虚拟旅游实训、科博馆、展览馆等场所进行三维展示的最佳选择。C3D多通道环幕融合模块实现软件边缘融合、软件弧形校正,消除通道间的硬边、使画面过度自然无接缝。同时实现动画、角色、特效等动态物体在通道之间无缝穿越。C3D立体投影模块采用偏振被动式立体,可将三维场景进行视觉分离,输出为左眼、右眼两个通道,以实现立体影像,景深和立体效果可实时调整。) 对虚拟场景的控制简单的可以有鼠标 键盘,高级的有数据手套和一些外围的感应设备,让感受更加真实。
⑵ FIFA的碰撞引擎到底是个什么东西
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算它们的运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的——简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现。然而,当游戏需要比较复杂的物体碰撞、滚动、滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了。物理引擎使用对象属性(动量、扭矩或者弹性)来模拟刚体行为,这不仅可以得到更加真实的结果,对于开发人员来说也比编写行为脚本要更加容易掌握。
好的物理引擎允许有复杂的机械装置,像球形关节、轮子、气缸或者铰链。有些也支持非刚性体的物理属性,比如流体。
物理引擎可以从另外的厂商购买,而一些游戏开发系统具备完整的物理引擎。但是要注意,虽然有的系统在其特性列表中说他们有物理引擎,但其实是一些简单的加速和碰撞检测属性而已。
⑶ 游戏使用的物理引擎是如何能够模拟出现实的情景变化
首先物理引擎是不能够“确实”地模拟现实的物理情景变化,物理引擎只是对现实的物理情景进行非常粗略的“近似”模拟。 同时物理引擎和实际做出来的游戏还是有不小的差距的,可以理解为用3D工具制作出来的模型以及骨骼是木偶,物理引擎是就是拉动他们按照“近似”于现实的物理规律进行运动的线。 以2D物理引擎2DBox的命名为例,大部分的物理引擎都会包含这些基本的概念 World(模拟世界)World可以理解为一个舞台,在这个舞台的边界范围内,你可以设置各种各样的物理参数,也只有在这个舞台内物理引擎才会生效。 Fixture(定制器)Fixture定义了物体的碰撞边界,密度,摩擦系数,恢复系数等等的内容,你可以理解为一个标签,贴在了模型上,赋予了他们在World中的物理属性。 其中Sensor(传感器)算是一种特殊的Fixture,因为它本身不带有碰撞或者密度等物理特性,但对于进入它的边界中的物体可以施加作用。 Constraint(约束)Constraint的名字其实就很好的说明了它的性质,它可以是施加在一个物体上,限制这个物体的转动角度,速度等等物理特性的(或者说是移除了一定的自由度)。 也可以是连接多个物体,并同时限制与多个物体相关的物理特性的,这的Constraint称为Joint(关节),Joint有很多不同的类型,比如Joint limit,Joint motor,都有各自不同的功能。
⑷ 一个游戏的物理引擎到底是什么有什么用
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现。然而,当游戏需要比较复杂的物体碰撞、滚动、滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了。
⑸ Unity的物理引擎是如何实现碰撞的呢
Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器碰撞器是触发器的载体,碰撞器被物理引擎所忽略,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数;
当Is Trigger=true时
⑹ 如何使用Bullet物理引擎 碰撞检测
Bullet教程: Hello World 实例
更多信息请关注 物理引擎中文社区http://www.physicsengine.org
欢迎加qq群 52821727 讨论更多关于Bullet的东西
这篇文章里我们将尽可能简单的向你展示怎么使用Bullet, 怎样初始化Bullet, 设置一个动力学世界, 还有一个球落向地表 这个对鉴别你的build是否成功非常有用并且也能够让你快速的学习到Bullet的API. 首先,我们假设你的Bullet已经正确安装并且正确设置了Bullet的include路径(例如. /usr/local/include/bullet) 确保能连接到正确的lib. 否则请参阅Installation安装. 如果你用的是gcc来编译,请确保你的静态库反序,就是说. dynamics, collision, math.
初始化程序
以一个标准的hello world程序开始:
[cpp] view plain
#include <iostream>
int main ()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
创建世界
现在我们要添加一个子弹(Bullet)模拟. 首先写入以下语句:
#include <btBulletDynamicsCommon.h>
我们想把btDiscreteDynamicsWorld 实例化但是在做此之前我们还需要解决一些其他事情. 对于一个“hello world”例子来说它太复杂我们并不需要. 但是,为了能更符合我们自己的工程, 他们可以用来微调(fine-tuning)模拟环境.
我们需要指出使用什么样的 Broadphase algorithm(宽相算法). 选择什么样的泛型算法很总要,如果有许多刚体在绘制场景里, since it has to somehow check every pair which when implemented naively(天真) is an O(n^2) problem.
宽相(broadphase)使用 传统的近似物体形状并且被称之为代理.我们需要提前告诉子弹最大的代理数, 所以才能很好的分配内存避免浪费. 下面就是世界里任何时候的最大刚体数.
int maxProxies = 1024;
一些 broadphases 使用特殊的结构要求世界的尺度提前被告知, 就像我们现在遇到的情况一样. 该broadphase可能开始严重故障,如果离开这个物体体积. 因为 the AxisSweep broadphase quantizes 空间基于我们使用的整个空间的大小, 您想这差不多等于你的世界.
使它小于你的世界将导致重大问题, 使它大于你的世界将导致低劣的性能.这是你程序调整的一个简单部分, 所以为了确保数字的正确多花点时间也不防.
在这个例子中,世界从起点开始延伸10公里远。
[cpp] view plain
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
这个broadphase是我们将要使用的, 这个执行的是扫描和裁剪, 这里可以看到更多解释Broadphase .
[cpp] view plain
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
该broadphase是一个极好的空间以消除不应碰撞的成队物体. 这是为了提高运行效率.
您可以使用碰撞调度注册一个回调,过滤器重置broadphase代理,使碰撞系统不处理系统的其它无用部分
. 更多信息请看 Collision Things.
碰撞配置可以让你微调算法用于全部(而不是不是broadphase )碰撞检测。这个方面现在还属于研究阶段
[cpp] view plain
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
我们还需要一个"solver". 这是什么原因导致物体进行互动得当,考虑到重力,游戏逻辑等的影响,碰撞,会被制约。
它工作的很好,只要你不把它推向极端,对于在任何高性能仿真都有瓶颈有一些相似的可以线程模型:
[cpp] view plain
* solver = new ;
终于我们可以初始化了世界了:
[cpp] view plain
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
很明显我们把重力方向设置成了Y轴的负方向,即Y轴是像上的
[cpp] view plain
dynamicsWorld->setGravity(btVector3(0,-10,0));
子弹的政策是“谁分配,也删除” 记住,必须符合这样的结果
在main()后记的删除.
我们提供了一个通用的结果. 代码如下:
[cpp] view plain
#include <btBulletDynamicsCommon.h>
#include <iostream>
int main () {
std::cout << "Hello World!" << std::endl;
// Build the broadphase
int maxProxies = 1024;
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
// 设置好碰撞属性 和调度
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
// 实际上的物理模拟器
* solver = new ;
// 世界.
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
// 这里做一些你想做的事
// 作为一个好的编程习惯 做好删除工作
delete dynamicsWorld;
delete solver;
delete dispatcher;
delete collisionConfiguration;
delete broadphase;
return 0;
}
碰撞包围体
我们将创造一个接地平面[静态刚体] ,和一个球体,将属于在地上[动态刚体] 。每个刚体需要参考碰撞包围体. 碰撞包围体只解决碰撞检测问题, 因此没有质量,惯性,恢复原状等概念. 如果您有许多代理,使用相同的碰撞形状[例如每飞船模拟是一个5单元半径范围]。这是个好做法,只有一个子弹形状的碰撞,并分享它在所有这些代理. 但是我们这里的两个刚体形状都不一样,所以他们需要各自的shape.
地面通常是向上的并且里原始点1米的样子. 地面会和远点交叉,但子弹不允许这样做,
因此,我们将抵消它的1米和用来弥补,当我们把刚体设置好以后。
[cpp] view plain
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
我们将让它从天上掉下来,它是一个球体,半径为1米.
[cpp] view plain
btCollisionShape* fallShape = new btSphereShape(1);
这里需要做碰撞形状的清理工作.
刚体
在,我们可以添加形状的碰撞到我们的现场,并将它们定位.
让我们先初始化地面. 它的方向是特定的, 子弹的四元数形式 x,y,z,w . 位置在地面下一米, 将要补充一米我们不得不做的. 运动状态在这里可以得到详细的说明:MotionStates
[cpp] view plain
btDefaultMotionState* groundMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
在第一个和最后一个参数,在下面的构造函数中是质量和地表的惯性. 由于地面是静止的所以我们把它设置成0. 固定不动的物体,质量为0 -他是固定的.
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
最后我们把地面加到世界中:
[cpp] view plain
dynamicsWorld->addRigidBody(groundRigidBody);
新增下跌领域非常相似。我们将其置于50米以上的地面.
[cpp] view plain
btDefaultMotionState* fallMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
由于它是动态刚体,我们将给予质量1公斤。我不记得如何计算一个球体的惯性,但是,这并不重要,因为子弹提供它的实现
[cpp] view plain
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
现在,我们可以建造刚体只是像以前一样,并把它加到世界中:
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
一个快速的解释btRigidBody::btRigidBodyConstructionInfo是为了; 物体的构建是通过某些参数的. 这是通过一个特殊的结构实现的。 该部分的btRigidBodyConstructionInfo被复制到物体当你建造的时候,并只用于在初始化的时候. 如果你想创建几千个属性一样的物体, 你只需要建立一个btRigidBodyConstructionInfo, 并通过它创建所有的.
开始模拟
这就是有趣的开始。我们会加强模拟200倍,间隔60赫兹. 这使它有足够的时间降落的地面上. 每一步, 我们都会打印出它离地面的高度.
这stepSimulation 在做你所期待, 不过他的接口确实很复杂. 读Stepping The World 以获得更多消息.
进后,我们审查的状态下降领域.位置和方向都封装在btTranform对象,我们摘录下降领域的运动状态. 我们只关心位置,我们退出变换getOrigin ( ) 。然后,我们打印y组成部分的立场载体.
[cpp] view plain
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
这应该产生一个输出看起来像这样的东西:
sphere height: 49.9917
sphere height: 49.9833
sphere height: 49.9722
sphere height: 49.9583
sphere height: 49.9417
sphere height: 49.9222
sphere height: 49.9
...
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
看起来不错迄今。如果你图这对输出迭代次数,你就会得到这个:
这个球体开始于地表的一米处. 这是因为取的是几何中心并且它的半径为1米. 这个球刚开始会有一个大的反弹然后渐渐的减缓弹起高度.
这是可以预料的实时物理引擎,但它可以尽量减少,增加频率的模拟步骤
. 试试再说!
现在你可以把这个动态世界代入你的程序 实时绘制出这个球体. 也可以看看其他的 Collision Shapes . 试试一堆盒子 或者圆柱体然后用一个球去扔向他们.
完整代码
[cpp] view plain
#include <iostream>
#include <btBulletDynamicsCommon.h>
int main (void)
{
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
int maxProxies = 1024;
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
* solver = new ;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0,-10,0));
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
btCollisionShape* fallShape = new btSphereShape(1);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
dynamicsWorld->addRigidBody(groundRigidBody);
btDefaultMotionState* fallMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
dynamicsWorld->removeRigidBody(fallRigidBody);
delete fallRigidBody->getMotionState();
delete fallRigidBody;
dynamicsWorld->removeRigidBody(groundRigidBody);
delete groundRigidBody->getMotionState();
delete groundRigidBody;
delete fallShape;
delete groundShape;
delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;
return 0;
}
⑺ as3 如何实现多物体碰撞
建议你研究一下box2d,模拟物理引擎,比你自己写要方便多了。
⑻ 物理引擎是怎样写出来的具体怎样工作
在游戏中,特别是在3D游戏中,真实性往往是需要高标准的硬件设施才能达到的。在3D技术发展早期,图形芯片只能完成常规的渲染操作,而关键的建模和光照运算必须以软件模拟的方式由CPU来完成,而NVIDIA在1999年8月推出的一款具有革命意义的GeForce256芯片,它具有硬件T&L引擎,可独自完成建模和光照运算,大大降低了CPU的负担,显卡的3D效能也获得了突飞猛进的提升!不过,尽管GPU的出现让CPU负担减轻,但除了工艺水平改进,频率提升,管线堆叠之外,没有真正实质性的变革,CPU仍需负责图形相关的物理运算工作,依然采用沉闷的游戏渲染方式。正是在这种形势下,一些公司提出物理加速的概念,让我们看到一丝黎明前的曙光……物理加速,顾名思义,专门进行模拟物理计算的处理运算,它是一个全新的硬件类别,它是用于沟通虚拟电子世界和普遍存在的物理真实,比如在游戏中,当你正驾驶坦克在不断获得一次次胜利,争取更大战果的时候,你却被前面的一片灌木丛挡住了去路,这在真实世界,会有问题吗?也许这样的问题一提出,就会惹来一片嘘声:这还是游戏?物理加速技术就是要改变这一现状。众所周知,目前每款重要的游戏大作后面都离不开最新显卡技术的跟进、支持。nVIDIA在推出GeForce之时首先提出了显卡首先提出了GPU的概念,GPU主要是分担部分CPU的处理工作,有效减低了CPU的负担,并可提供更好的视觉效果及品质。但有趣的是,随着图形内容的迅速膨胀,CPU在一些协调管理准备工作以及其他任务的需求也迅速增加,特别物理交互环境深度和质量的增长,将会带来人工智能,游戏逻辑以及渲染的膨胀,GPU此时已经显得有所力不从心。这是因为GPU在处理各种图形计算的同时还要负责去运算这些物理变化,而GPU的运算性能在受到物理处理瓶颈时就会影响到其他的图形处理效果,所以就会直接导致帧数的下降。而在大型的3D游戏中,为了使游戏的画面更加的真实,开发小组就会在游戏中设计许多接近现实的物理计算,比如:自由落体,物体运动,空气流动,力的反弹以及各种物体间碰撞等等。但是在传统的计算机中,游戏的物理运算基本上是通过物理引擎加上CPU处理后的物理参数后再反馈到中游戏之中,这种方式往往在遇到大规模的物理运算时就会出现运算瓶颈,这也就造成了游戏中一旦出现大量物理运算时,帧数就会明显下降。不知道各位喜爱玩显卡和3D游戏的玩家记不记得,在3DMark 03测试软件中有着一个测试场景,在一个树木茂密的大自然中,阳光普照,有着河流和各种植物,十分漂亮。相信用3DMark 03测过显卡性能的玩家一定都会记得吧。这一幅场景中,画面由河流中转入到岸上场景以后,相信大家就会发现帧数下降得非常利害,性能较好的显卡大概可保持在每秒20~30帧左右,而普通的低端入门级显卡就有些惨不忍睹了……这时就需要一个专门的物理处理引擎来接管这些物理计算任务。dsoftware Jhon Carmack曾表示说:“我们仍然在做一些很基础琐碎的事……未来的游戏将模拟天气,模拟流体,模拟空气中的粉尘……”,可以看出物理模拟的现实发展可行性和紧迫性。祝你好运!
⑼ 物理引擎和虚拟引擎有什么区别
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算它们的运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的——简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现。然而,当游戏需要比较复杂的物体碰撞、滚动、滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了。物理引擎使用对象属性(动量、扭矩或者弹性)来模拟刚体行为,这不仅可以得到更加真实的结果,对于开发人员来说也比编写行为脚本要更加容易掌握。
好的物理引擎允许有复杂的机械装置,像球形关节、轮子、气缸或者铰链。有些也支持非刚性体的物理属性,比如流体。
物理引擎可以从另外的厂商购买,而一些游戏开发系统具备完整的物理引擎。但是要注意,虽然有的系统在其特性列表中说他们有物理引擎,但其实是一些简单的加速和碰撞检测属性而已。
虚幻3引擎的所有编写观念都是为了更加容易的内容制作和编程的开发,为了让所有的美术开发人员能够牵扯到最少程序开发内容的情况下使用抽象程序助手来自由创作虚拟环境,以及提供程序编写者高效率的模块和可扩展的开发构架用来创建,测试,和完成各种类型的游戏制作。
⑽ 物理引擎是前端还是后端
物理引擎是前端,物理引擎是一个计算机程序,使用质量、速度、摩擦力和空气阻力等变量,模拟了一个近似真实的物理系统,为刚性物体赋予真实的物理效果,比如重力、旋转和碰撞等效果,让物体的行为表现的更加趋向真实。
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理也可以在一定程度上通过编程或编写脚本来实现。
物理引擎可以从另外的厂商购买,而一些游戏开发系统具备完整的物理引擎。但是要注意,虽然有的系统在其特性列表中说他们有物理引擎,但其实是一些简单的加速和碰撞检测属性而已。
流体
流体运动更多的则是展现水从水管内喷出,水冲击到物体后,物体的表现,比如木箱被冲翻。而那些被冲翻的木箱翻倒的方向每次都各不相同,又比如在一个NⅥDIA Logo形状的玻璃容器中,用鼠标来控制玻璃容器的位置,让容器里的液体流动。
以上内容参考网络-物理引擎