标签: farseer

Farseer Physics教程,帮助文件

是否有一个tutotial或帮助文件,适合初学c#程序员使用.

c# silverlight farseer .net-3.5

11
推荐指数
2
解决办法
1万
查看次数

Farseer Physics奇怪的碰撞

我正在开始游戏,我正在使用Farseer作为物理引擎.

我已经设置了几个用作地形图块的框和一个用作播放器的框.这两者之间的碰撞非常奇怪,当它不是"直接"撞击时它们相交并滑动.

以下是发生了什么的GIF:http://i.imgur.com/HR0J0D3.gifv

以下是片段:

//Creating the body
PhysBody = BodyFactory.CreateRectangle(
    Transform.World.PhysWorld,
    ConvertUnits.ToSimUnits(Width * Transform.Scale),
    ConvertUnits.ToSimUnits(Height * Transform.Scale),
    5,
    ConvertUnits.ToSimUnits(Transform.Position.ToVector2()));

//The tiles are static, the player is not
PhysBody.BodyType = Static ? BodyType.Static : BodyType.Dynamic;

//Drawing the test rectangles
ShapeRenderer.Instance.DrawRectangle(
    sb,
    ConvertUnits.ToDisplayUnits(PhysBody.Position).ToVector2(),
    new Size2((int)(Width * Transform.Scale), (int)(Height * Transform.Scale)),
    Color.White);
Run Code Online (Sandbox Code Playgroud)

我不认为其余的很重要,我所做的就是创造一个9.8重力的世界.

我也尝试过不使用Transform.Scale并且在播放器下方只有一个框,问题仍然存在.

我正在使用的图形引擎是紫外线

c# physics farseer

8
推荐指数
0
解决办法
272
查看次数

身体不会因重力而面朝下旋转

我有一个长方体,从45度角的佳能射出.身体也以45度角向上旋转,我已将质量设定在身体的前部.

然而,身体在空气中上升,当身体回到地面时,它不会旋转.有没有办法让大众方面先下来?

我的现实世界的例子是,扔一个带有绳子的网球.目前,当重力发挥作用时,弦不会落在球后面.

这是我的'球'

Body = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(texture.Width), ConvertUnits.ToSimUnits(texture.Height),100f, postition, this);
Body.Mass = 1;
Body.LocalCenter = new Vector2(ConvertUnits.ToSimUnits(Texture.Width), ConvertUnits.ToSimUnits(Texture.Height / 2));
Body.UserData = this;
Body.BodyType = BodyType.Dynamic;
Body.CollisionCategories = Category.All;
Body.CollidesWith = Category.All;
Body.IgnoreGravity = false;
float ang = BarrelJoint.JointAngle;
Body.Rotation = ang;
Run Code Online (Sandbox Code Playgroud)

然后我这样做解雇它:

Body.ApplyLinearImpulse(new Vector2((float)Math.Cos(ang) * 100, (float)Math.Sin(ang) * 100));
Run Code Online (Sandbox Code Playgroud)

我猜我有一些设置或计算我忘了.

c# farseer

7
推荐指数
1
解决办法
241
查看次数

Farseer还是Box2D?自上而下的射手物理实现

其中哪一个更适合自上而下的射击游戏?

我听说Box2D表现得更快,但我也注意到它缺乏对XNA的更广泛的社区支持(它似乎用于闪存 - 出于我不知道的原因).

然而,Farseer是为XNA而构建的,似乎适合它并且表现非常好.在我看来,Farseer的优点还在于它干净,易于使用的API(它也非常适合我的游戏引擎结构).但是我很害怕如果我使用它会有一些缺点(子弹和高速机体?奇怪的不是数字崩溃?)

总的来说,如果您指出哪一个适合更好的XNA/PC开发,我将不胜感激.

我需要这个的原因:

  • 它不会仅用于一个自上而下的射击游戏,它意味着与游戏框架集成.
  • 即使是自上而下的射手也会在碰撞更好,物理逼真的环境中更具吸引力 - 例如你可以移动一个盒子进入掩体?
  • 以像素完美的方式手动控制碰撞将太昂贵(我没有时间对其进行优化 - 如果存在高级碰撞检测算法的高性能物理引擎,我也不需要它),而边界框碰撞是方式不切实际.

我现在应该得到你的意见吗?请保持直截了当告诉我,我使用Farseer而不是Box2D做了错误的步骤吗?(我必须在等待答案时开始工作.)

提前致谢

xna physics farseer box2d game-physics

6
推荐指数
1
解决办法
4238
查看次数

简单的2D火箭动力学

我目前正在使用Farseer Physics库在XNA中试验一些物理玩具,但我的问题不是特定于XNA或Farseer - 而是任何2D物理库.

我想添加"类似火箭"的运动(我说火箭就像它不必是火箭一样 - 它可能是水面上的飞机或船只或任何类似的情况)我的2D场景中的某些对象.我知道如何使用运动学模拟实现这一点,但我想使用动态模拟(即随时间推移施加力)来实现它.我对如何实现这一点感到很遗憾.

为了简化操作,我不需要动力学来旋转几何体,只是为了影响身体的速度.我正在使用一个设置为不在Farseer中旋转的圆几何,所以我只关心对象的速度.

我甚至不确定最好的抽象应该是什么.从概念上讲,我有身体当前移动的方向(单位矢量),我希望它去的方向,以及表示我希望它改变方向的速度的值,同时保持速度相对恒定(小的变化是可接受的).

我可以直接使用这种抽象,或使用类似"舵"值的东西来控制物体改变方向的速度(顺时针或逆时针).

我应该用什么样的力量来模拟我正在寻找的运动?请记住,我也希望能够在飞行中调整火箭的"推力".

编辑:我看到它的方式,并纠正我,如果我错了,你有两种力量(暂时忽略主推力):

1)你有一个静态的"鳍",总是指向与身体相同的方向.如果主体旋转使得翅片不与运动方向对齐,则空气阻力将沿着翅片的长度施加力,与运动方向和翅片之间的角度成比例.

2)你有一个"舵",它可以在指定的范围内自由旋转,这个范围与身体的质心相距一定距离(在这种情况下,我们有一个圆圈).同样,当该平面不平行于运动方向时,空气阻力沿着方向舵的长度引起比例力.

我的问题是,不同的说法,我如何计算空气阻力对鳍和方向舵的这些比例力?

编辑:作为参考,这里是我编写的一些代码来测试接受的答案:

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
        float dc = 0.001f;
        float lc = 0.025f;
        float angle = MathHelper.ToRadians(45);
        Vector2 vel = new Vector2(1, 0);
        Vector2 pos = new Vector2(0, 0);
        for (int i = 0; i < 200; i++)
        {
            Vector2 drag = vel * angle * dc;
            Vector2 sideForce = angle * …
Run Code Online (Sandbox Code Playgroud)

c# xna physics 2d farseer

6
推荐指数
1
解决办法
2571
查看次数

带有Farseer Physics的C#XNA中的OnCollision事件处理程序问题

我现在在我的游戏中有这个工作正常(ish),但我在数学方面并不出色.当两个原发性物质发生碰撞时,如果施加于原色的力超过设定的阈值,我希望它们粉碎成微小的碎片.我目前的碰撞事件处理程序看起来像这样.

public bool Collision(Fixture fixtureA, Fixture fixtureB, Manifold manifold) 
{ 
   Vector2 position = manifold.LocalNormal; 
   float angle = (float)Math.Atan2(position.Y, position.X); 
   Vector2 force = Vector2.Zero; 
   if (angle < 0) 
     force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi + angle) * fixtureA.Body.LinearVelocity.Y); 
   else 
     force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi - angle) * fixtureA.Body.LinearVelocity.Y); 
   double XForce = Math.Sqrt(force.X * force.X); 
   double YForce = Math.Sqrt(force.Y * force.Y); 
   double totalForce = XForce + YForce; 
   if ((Breakable) && (totalForce > BreakForce)) 
   { 
      Breakable = false; 
      Active = …
Run Code Online (Sandbox Code Playgroud)

c# xna farseer

6
推荐指数
2
解决办法
3752
查看次数

更改Farseer Physics Engine设置以提高性能

我已成功使用Farseer使用XNA开发我的一款游戏.游戏就像Windows和WP7中的魅力一样.我目前正致力于使用MonotouchMonogameIOS中移植我的游戏.我已成功编译和使用Farseer,而不是我的游戏的第一个版本移植到Monotouch和Monogame.一切都很好,除了表演.iPhone设备上的游戏运行速度要慢得多.我做了一些代码调查,似乎主要的瓶颈是Farseer.当它需要连接一个固定装置(圆圈)来管理超过5-6个实体时,它变得非常慢.

阅读文档我注意到要调整Farseer我可以更改Setting static class中的值:

性能

为了充分利用引擎,您应该尝试遵循以下指南:

启用睡眠 睡眠使您可以拥有世界上大量的身体.它还可以增加发动机的稳定性,因为一堆物体中的小运动不会在堆叠中扩散.睡眠的身体几乎没有头顶,因此建议启用它.

禁用CCD 连续碰撞检测可防止隧道效应,但会降低性能.如果你没有隧道问题,你应该一起禁用CCD.

最小化位置和速度迭代 的次数大量的迭代使得引擎以性能为代价更加稳定.您应该调整值以适合您的游戏.

坏消息是如果我改变那个类的任何值,似乎什么也没发生.我尝试更改值如下:

EnableDiagnostics = false
VelocityIterations = 6
PositionIterations = 2
ContinuousPhysics = false
Run Code Online (Sandbox Code Playgroud)

我也尝试使用较低的值,如VelocityIterations = 1,但似乎没有任何改变....

任何人都已更改设置类值以提高性能?

iphone farseer xamarin.ios monogame

6
推荐指数
1
解决办法
1063
查看次数

XNA中让播放器在屏幕上平滑绘画的最佳方法是什么?

我正在开发一个wp7游戏,其中玩家在程序中绘制线条并且球从它们反弹.我正在使用XNA和farseer物理.用户绘制直线,然后让程序将其转换为物理对象或至少是vector2s列表的最佳方法是什么?我已经尝试创建一个TouchLocations列表,但是如果用户没有画得很慢,就像我附上的图片一样,它会变得不稳定.有什么建议?谢谢 http://img829.imageshack.us/img829/3985/capturehbn.png

这是一些代码:我正在使用gamestatemanagement示例,这是在HandleInput方法中

foreach (TouchLocation t in input.TouchState) {
  pathManager.Update(gameTime, t.Position);
}
Run Code Online (Sandbox Code Playgroud)

pathManager类管理路径类的集合,这些路径类是可绘制的物理对象.这是pathManager.Update

public void Update(GameTime gameTime, Vector2 touchPosition) {
  paths.Add(new Path(world,texture, new Vector2(5,5) ,0.1f));
  paths[paths.Count-1].Position = touchPosition;
}
Run Code Online (Sandbox Code Playgroud)

这就是我现在正在做的事情,我愿意把它扔掉.您认为每个触摸位置都有一个5x5的矩形会破坏性能,但使用farseer我没有看到任何掉落,即使是大多数全屏.但是,如果快速绘制线,则此系统根本不会创建平滑线.

我怀疑这有什么帮助,但这里是Path构造函数.

public Path(World world, Texture2D texture, Vector2 size, float mass) {
  this.Size = size;
  this.texture = texture;
  body = BodyFactory.CreateRectangle(world, size.X * pixelToUnit, size.Y * pixelToUnit, 1);
  body.BodyType = BodyType.Static;
  body.Restitution = 1f;
  body.Friction = 0;
  body.Friction = 10;
}
Run Code Online (Sandbox Code Playgroud)

c# xna farseer windows-phone-7 xna-4.0

6
推荐指数
1
解决办法
465
查看次数

如何在物理引擎中有效地模拟静态矩形网格?

我正在制作一个太空射击游戏,它发生在一个大的地牢里,它由大的矩形组成,用来定义墙壁.使用Farseer Physics对游戏中的所有内容进行物理模拟.但是有一个问题:我希望地牢看起来足够大,但这需要我的网格中至少有80x80个矩形,这意味着在最坏的情况下,我有6400个物理模拟的物体,这不完全是性能友好,你可以猜到.

我的临时解决方案是在垂直切片中划分网格,这样,对于每一列,使用布尔添加操作添加所有矩形,然后使用生成的凹多边形创建一个主体.它会稍微提高性能,但是多边形容易陷入混乱,变得不存在,阻塞通常应该可以遍历的方式甚至变得无效并导致Farseer崩溃.

我一直在考虑制作某种算法,以某种方式找到最大的墙壁区域,并将它们合并为一个大矩形,并继续为较小的矩形做这个,直到所有的孔都被填满,但我不知道如何实现这个.这似乎是一个完美的解决方案,因为它解决了性能问题以及我现在所拥有的凹形多边形混乱.有没有人知道如何实现这样的东西?

它不是完全停止使用物理引擎的解决方案,因为我游戏中的很多东西都依赖于它.

编辑:这是一个关于身体现在如何看起来的一个小例子:(每个数字都是一个身体) http://i.imgur.com/6x06o.png

这就是我希望他们成为的样子:

在此输入图像描述

c# physics farseer game-physics

5
推荐指数
1
解决办法
601
查看次数

如何使物理角色在不旋转的情况下移动

目前我正在开发一个使用物理引擎的简单游戏(Farseer for XNA).

我想问一下如何制作这个角色让他可以在地面上行走,在平台上跳跃而不会自行旋转.

因为我需要更新身体位置和旋转,因为它是一个物理对象,所以它会像通常那样自行旋转.

任何人都知道如何解决它?

xna farseer

3
推荐指数
1
解决办法
1224
查看次数