Ⅰ Java怎么使用物理引擎
插件:插件是可独立完成某个或一系列功能的模块.通常插件由宿主程序加载,不能独立运行.宿主:宿主是承载插件运行的环境,为插件提供基本服务.通常插件由宿主程序管理和控制.插件式:通常是由开发人员编写宿主程序,并预先定义好系统提供基本服务接口和插件接口.然后由其他开发人员根据系统插件接口编写插件功能.通常插件以一个独立功能模块的形式出现.对于宿主程序来说并不知道插件的具体功能,通常宿主启动时检索插件信息,并根据预定的插件接口装载插件.
Ⅱ adams怎么让物体左右运动
Adams可以通过设置运埋梁动模型和控制器来实现物含液亏体的左右运动。具体步骤如下:1. 在Adams中创建一个运动谈神模型;2. 在运动模型中添加物体;3. 设置物体的运动轨迹;4. 设置控制器;5. 运行模拟,查看物体的运动情况。
Ⅲ 3D物理引擎与2D物理引擎使用时的 不同碰撞函数的调用有什么不一样
3D物理引擎多了一个维度。
2D和3D物理引擎两者在使用上大体相似,主要区别是3D物理引擎比2D物理引擎多了一个维度。物理引擎是游戏设计中最为重要的步骤,主要包含刚体、碰撞、物理材质以及关节运动等。
游戏中物理引擎的作用是模拟当有外力作用到对象上时对象间的相互影响,比如赛车游戏中,驾驶员驾驶赛车和墙体发生碰撞,进而出现被反弹的效果。物理引擎在这里用来模拟真实的碰撞后效果。通过物理引擎,实现这些物体之间相互影响的效果是相当简单的。
Ⅳ Java如何使用物理引擎
那个是计算机术语
电子游戏里面会有很多的画面,比如你说的使命召唤,会有很多人拿着枪互相射击的画面。这些画面如果需要显示出来,需要进行物理运算和贴图运算。物理运算的内容包括子弹的弹道,人物的动作,尘土的飞扬,车辆的运转……而贴图则主要负责每个物体的颜色,细节,形状
我们的机器,其中显卡的部分负责贴图运算,而CPU负责物理运算。那么CPU进行物理运算的时候需要遵循一定的法则。简而言之,这些法则就是游戏设计人员事先设定好的运算规则,可以称之为物理引擎。
Ⅳ cocos2d中封装的bullet 3d物理引擎怎么用
1. Sprite3DBasicTest Sprite3D 两种基本创建方式 (1). 直接使用一个带有素材的obj (3dmax对象) Sprite3D::create("sprite3dTest/scene01.obj"); (2). 使用不带素材的对象,自和察中己设置素材唤山 auto sprite = Sprite3D::create("Sprite3DTest/boss1.ob。没盯
Ⅵ 如何使用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;
}
Ⅶ cocos2d-x 2.2.2版本里的物理引擎怎么使用
cocos2d-x 2.2.2版本里的物理引擎怎么使用
觉得我的具体经历可以帮助题主嫌亮理解这个问题。
第一个 cocos2d-x 项目(A 项目),我姿者枣们使用的是 quick2.2.3。为什么选择quick,在这里有说:Cocos2d-x script language binding:Lua or Javascript?
后来,我对其进行了较多的修改(详情见这里:zrong/quick-cocos2d-x · GitHub)。当然,所有的修改都是开源的,而且大多数修改都推送给 quick 官方库了(详见这里:Commits · chukong/quick-cocos2d-x · GitHub)。
基迹拆于这个修改版,我们把 A 项目完成了,但没有进行发布。
立项 B 项目时,cocos2d-x 已经升级到 3.3beta。于是我不再使用 quick,改用 cocos2d-x 3.3 lua。原因在这里有说:从 quick 转向 cocos2d-x 3.3 lua。
Ⅷ 物理引擎的作用是什么呢
物理引擎使用对象属性(动量、扭矩或者弹性)来模拟刚体行为,这不仅可以得到更加真实的结果,对于开发人员来说也比编写行为脚本要更加容易掌握。好的物理引擎允许有复杂的机械装置,像球形关节、轮子、气缸或者铰链。有些也支持非刚性体的物理属性,比如流体。物理引擎可以从另外的厂商购买,而一些游戏开发系统具备完整的物理引擎。
但是要注意,虽然有的系统在其特性列表中说他们有物理引擎,但其实是一些简单的加速和碰撞检测属性而已。当NVIDIA宣布正式收购Ageia及该公司的PhysX物理软硬件组件后,所有人都在期待,期待着NVIDIA会推出新的有关物理运算的东西出来。果不其然,最近当NVIDIA发布Forceware 177.79驱动后,意味着GeForce 8/9和GT200系列的GPU都支持PhysX引擎。这是因为NVIDIA将PhysX引擎集成到CUDA架构的物理运算中。这样,显卡就能自动进行物理加速运算。当然,PhysX在游戏上的运用仅仅是物理引擎众多运用的一方面,在整个CUDA通用运算领域上,都会有物理引擎的身影,比如计算天体间在相互引力的作用下,各自的运动轨迹等。
Ⅸ 使用物理引擎,怎么控制人物是匀速移动的
as3控制角色左右移动
as3仅仅对本帧起作用,也就是说,必须在某一胡码键帧上写as3的代码才有效,而且这一帧必须不能播放。
举个例子:
假如舞台有6帧:
你的角色在第1帧,就必须这么写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//先停在第一帧
gotoAndStop(1);
//添加一个按键的侦听函模液数
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardhandle);
//按键后的处理函数
function keyboardhandle(e:KeyboardEvent):void
{
if (e.keyCode==37)
{
//这里写左键移动的代码
//比如控制的对象为mc,则mc每次移动10像裤巧素
mc.x-=10;
}
if (e.keyCode==39)
{
//这里写右键移动的代码
mc.x+=10;
}
}
有没有重力没有关系