新华社:JigLibX的基本物理
新华社本身不提供类来帮助我们在物理计算。 虽然可以检测到相同的碰撞,但是这是如何时,它被检测对象的行为,只取决于我们所编写的代码。 除非我们使用现成的库仆人。 我把最流行的壁纸XNA'ową开源库- JigLibX 。
你能实现?
在谈到对电影的作家,两个例子:
......由同一作者JigLibX的创建了一个例子:
更多视频项目工地 。
创建一个项目
你应该做的第一件事是从下载部分,最新的源代码JigLibX'a 下载 。 拆封后,我们创建了一个新的项目(在我的情况新华社3.1项目),点击我们项目(解NazwaNaszegoProjektu)的主要根源上解决方案资源管理器,右键单击并选择添加>现有项目

现有的项目添加到现有
然后选择你解压缩先前下载的物理引擎的文件夹:JigLibX> JigLibX.csproj。

现有的项目添加到现有
如果您选择在创建项目时,新华社3.1版的项目,你现在必须做的项目JigLibX升级到3.1版本。 我们可以通过右键点击项目的根JigLibX>升级解决方案。 我们这样做了以后能够加入该项目的主要项目参考JigLibX'a。 否则,这是不可能的,因为它目前是3.0版的打算。 然而,在3.1版本的变化是不够大,完全正确的库下运行这个版本的XNA。
然后,右键单击“我们的主要项目的根目录(在我的情况下,它被称为FizykaZJigLibX)>添加引用>项目> JigLibX。 树在我们的项目,应该出现的文件夹引用JigLibX。 现在,我们有访问该命名空间。
增加了系统的物理
首先,这将是必要的在您Game1.cs添加适当的命名空间。
使用JigLibX.Physics; 使用JigLibX.Geometry; 使用JigLibX.Collision;
因此,我们可以使用JigLibX'a的创造者写的类。 对于初学者来说,在我们的类的构造函数中,我们创建了两个对象。
公共Game1() { 图形=新GraphicsDeviceManager(本); Content.RootDirectory =“内容”; PhysicsSystem PhysicsSystem世界=(); CollisionSystemSAP world.CollisionSystem =新(); }
对象世界,这PhysicSystem实例,启动一切必要的变量和控制器将感受到我们的应用程序内发生的事件。 有关物理的事件。 在下一行,属性CollisionSystem,我们分配一个CollisionSystemSAP创建的对象,这是必要的,以发现任何碰撞。 这个类用于碰撞检测,而在这个例子中,将有足够的1算法“扫描和剪枝”,但如果看的项目JigLibX碰撞中的文件夹,我们看到公司能够充分利用其他现成的类,使用不同的算法,如基于网格(Grid)。 如果你省略这一步,我们不能以冲突作出反应,这些设施将只是他们通过没有任何反应。
你应该做的一件事,即定期更新我们的设备的物理存储的逻辑。 要做到这一点,只是更新的方法,添加以下代码:
步长=浮动(浮动)gameTime.ElapsedGameTime.Ticks / TimeSpan.TicksPerSecond; PhysicsSystem.CurrentPhysicsSystem.Integrate(步长);
,因为PhysicsSystem.CurrentPhysicsSystem是静态的一个组成部分,它是从我们的项目中的任何地方,这无疑增加了该解决方案的便利。
演员类的创建
Actor类,它实际上将有助于创建对象,这将设置参数的定义在我们的应用程序中的对象,这是需要与环境冲突的任何计算。
让创建通过点击我们的项目>新增>类的根类BoxActor.cs ......

创建一个类BoxActor.cs
把下面的代码内部文件BoxActor.cs的:
使用系统; 使用Microsoft.Xna.Framework; 使用Microsoft.Xna.Framework.Graphics; 使用JigLibX.Math; 使用JigLibX.Physics; 使用JigLibX.Geometry; 使用JigLibX.Collision; 命名空间FizykaZJigLibX { 公共类BoxActor:DrawableGameComponent的 { 私人Vector3位置; 私人Vector3规模; _body私人机构; 公共机构的主体 { 获得 { _body返回; } } 私人CollisionSkin _skin; 公共CollisionSkin皮肤 { 获得 { _skin返回; } } 的公共BoxActor(比赛中,Vector3位置,Vector3规模):基地(游戏) { this.position =位置; this.scale =规模; } } }
因为演员必须绘制在屏幕上,所以我们可以看到发生了什么BoxActor类继承类DrawableGameComponent。 杆位持有约箱内的中央点,信息和规模 - 其尺寸的身体是被作为一个变量,存储有关我们的对象的运动和旋转的信息了解皮肤是负责检测碰撞。
创建机构和CollisionSkin
下一步将增加在年底BoxActor类的构造,下面的代码:
_body =新机构(); _skin =新CollisionSkin(_body); _body.CollisionSkin = _skin;
为_body变量,分配身体的一个实例,这将存储在该对象所在国的有关的基本信息。_skin将有关于“壳”我们的设施,将根据先前设置的_body创建的信息。 最后,它仍设置 _body CollisionSkin财产。
现在,决定什么样的形状,将有我们的演员。 取决于将如何表现在舞台上。 寻找发现在JigLibX>基元的原语类。
在我们的例子中,我们希望我们的对象,像一个盒子,所以我们使用这个类中,通过添加下面的代码的类构造BoxActor结束。
箱箱新箱(Vector3.Zero,Matrix.Identity,规模); _skin.AddPrimitive(箱,新MaterialProperties(0.8f,0.8f,0.7f));
在上面,我们创建盒类的新对象,其构造函数中的参数代表:在我们的盒子,盒方向(单位矩阵是指没有旋转,等等),和规模的中心,将被设置构造的对象BoxActor时的位置。
第二条生产线,表面碰撞增加了我们的设施,以便它可以与其他物体的反应。 第一个参数是与我们打交道的对象类型,第二个参数指定的材料(摩擦和弹性)的行为。
确定物体的质量
来确定物体的质量,其中除了重心,将不同的力量,这将影响该对象的方向而定,作者JigLibX,创建下面的方法添加到类BoxActor。
Vector3 SetMass私人(浮法群众) { PrimitiveProperties primitiveProperties =新PrimitiveProperties( PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass,地下); 漂浮的垃圾; vector3 COM; 汇总表; 矩阵ITCOM; Skin.GetMassProperties(primitiveProperties,滥发了COM,出出ITCOM); Body.BodyInertia = ITCOM; Body.Mass =垃圾; COM的回报; }
在同一类的构造年底,我们确定大众如下:
COM =的Vector3 SetMass(1.0F); 而这,当它来接管我们的对象的质量
。 当然,没有什么能够阻止,在应用中,可以改变物体的质量。
设置正确的地方Box'aw
在这一步,我们设定我们的信箱,你将在创造我们的演员在构造上的项目。 这是必要的,以适应我们的工厂的身体,以及碰撞面,根据相同的对象,效果是足够的和现实的。
在年底的BoxActor构造,添加以下代码:
_body.MoveTo(位置,Matrix.Identity); _skin.ApplyLocalTransform(新变换(-COM,Matrix.Identity)); _body.EnableBody();
第一行移动“身体”我们的演员在一个特定的项目。 MoveTo方法的第二个参数,表示对象的方向。
第二行设置碰撞面积分别财产的重力中心。
最后一行,使模拟_body,也是一个演员。 此行是必要的,因为默认情况下禁用模拟。
创造的世界。
框架有关的所有设置已经确定,所以你可以去创造世界。 在我们项目game1.cs的主文件的构造,添加下面的代码:
fallingBox =新BoxActor(这一点,新Vector3(5,20,5),新Vector3(2,2,2)); immovableBox =新BoxActor(这一点,新Vector3(0,-5,0),新Vector3(10,10,10)); immovableBox.Body.Immovable =真; Components.Add(fallingBox); Components.Add(immovableBox);
Game1类的所有方法添加组件仍然是:
BoxActor fallingBox; BoxActor immovableBox;
前两行弥补我们的演员。 构造函数的参数,主张:第一- 演员在其中创建的实例,在这种情况下,我们的应用程序的主类Game1,第二个 -的位置,第三个参数是该项目的规模。
第三行表示第二个对象是一动不动,并传递给构造函数的参数,这将是远高于第一个对象(5倍)。
由我们创造的第四和第五线将对象添加到一个组件集合,游戏类,它继承您的应用程序后会自动将绘制。
画
我们现在到最后阶段,即丢弃到屏幕上的结果实际上是漂亮的话,你画的场景。 但首先,我们必须添加模型框,这是我们在我们的项目中使用。 样品从模型的创新游戏 ,你可以在这里下载。
解压缩文件,并复制2所包含的文件(该模型和纹理)应该在解决方案资源管理器后,右击的内容文件夹(在我们的项目),并选择“添加>现有项...和选择模型文件。FBX和重复步骤,选择一个文件,从质地。
的的类BoxActor,创建一个新的方法,该方法将加载我们的模型:

保障覆盖无效LoadContent方法() { 模型= Game.Content.Load(“boxModel”); }
并添加在这个类的所有方法,声明一个变量模型:
私营模型模型; 然后添加同一类的,下面的方法:
GetWorldMatrix私人矩阵(){。返回Matrix.CreateScale(规模)* _skin.GetPrimitiveLocal(0)Transform.Orientation * _body.Orientation * Matrix.CreateTranslation(_body.Position);} 它返回我们复杂世界的阵列,而我们获得序列中的矩阵相乘:碰撞表面的规模,和真的时它是坐落的角度,对“身体”的对象(角),并在“身体”的对象的位置。
我们将需要更多的投影和视图矩阵,这将添加到主应用程序类(文件game1.cs):
民营矩阵_view; 公共矩阵视图 { 获得 { _view返回; } } 民营矩阵_projection; 公共矩阵投影 { 获得 { _projection回报; } }
在Game1类的构造,让投影矩阵设置,添加以下行:
Matrix.CreatePerspectiveFieldOfView _projection =( MathHelper.ToRadians(45.0f) (浮法)/(浮动)graphics.PreferredBackBufferWidth graphics.PreferredBackBufferHeight, 0.1F, 1000.0f );
我不会形容投影矩阵的参数,因为我认为在这个阶段,他们很清楚,但如果没有,我请你这篇文章对msdn'ie 。
离开我们已经设置了视图矩阵,我们将做的方法更新,Game1.cs文件,加入下面的代码行:
Matrix.CreateLookAt _view =( 新Vector3(0,10,20), fallingBox.Body.Position, Vector3.Up );
这条线会导致屏幕的中心,会有我们的下落物体。 在秋天,我们将看到如何,碰撞来已固定的对象。
最后,它仍然为我们添加一个BoxActor档,它会自动调用此对象的绘制方法。
公众覆盖无效抽奖(GameTime gameTime) { BasicWorldGame游戏=(BasicWorldGame)游戏; 矩阵[转换] =新的Matrix [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(转换); WorldMatrix,= GetWorldMatrix矩阵(); FOREACH(ModelMesh网在model.Meshes) { 的foreach(BasicEffect在mesh.Effects作用) { effect.EnableDefaultLighting(); effect.PreferPerPixelLighting =真; effect.World =变换[mesh.ParentBone.Index] * worldMatrix; effect.View = game.View; effect.Projection = game.Projection; } mesh.Draw(); } }
与第一线,你将有访问视图和投影矩阵,创建一个引用到我们的应用程序的主体。 代码的其余部分,是典型的BasicEffect类渲染对象。 唯一重要的事情是使用世界矩阵,矩阵的实时计算,实际上JigLibX我们计算。
文章在这里找到文件的基础上,但有迹象表明,这里复制的文本是过时的,写我的版本应该更好地工作。 也许,这是由于使用XNA 3.1不完全兼容,但我在看着的方法,其中一人已经从三个减少到两个参数。 JigLibX版本0.3.1(截至2009年9月11日)。
已完成项目的下载电(记者3.1) (2.1 MB)
编译演示电(记者3.1) (0.3 MB)
相关条目
3评论/ S
一个非常有趣的项目,不玩的图,但我高兴地阅读它。 谢谢!




















































好吧,我会告诉你是不是在这里发表评论,张贴像往常一样高的水平上。