标签: physics

如何计算多面体的质量和惯性矩?

为了在刚体模拟中使用,我想计算质量和惯性张量(惯性矩),给定一个三角形网格表示(不一定是凸起的)对象的边界,并假设内部的密度恒定.

math physics rigid-bodies

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

跳跃比 重力

我正在开发我的第一个XNA 2D游戏,我有一点问题.如果我跳,我的精灵跳跃但不会跌倒.而且我还有另一个问题,用户可以按住空格键跳到他想要的高度,我不知道如何阻止他这样做.这是我的代码:跳转:

    if (FaKeyboard.IsKeyDown(Keys.Space))
        {
            Jumping = true;
            xPosition -= new Vector2(0, 5);
        }

        if (xPosition.Y >= 10)
        {
            Jumping = false;
            Grounded = false;
        }
Run Code Online (Sandbox Code Playgroud)

真正简单的基本重力:

    if (!Grounded && !Jumping)
        {
            xPosition += new Vector2(1, 3) * speed;
        }
Run Code Online (Sandbox Code Playgroud)

这里是通过碰撞将接地设置为True或False的位置

    Rectangle MegamanRectangle = new Rectangle((int)xPosition.X, (int)xPosition.Y, FrameSizeDraw.X, FrameSizeDraw.Y);
        Rectangle Block1Rectangle = new Rectangle((int)0, (int)73, Block1.Width, Block1.Height);
        Rectangle Block2Rectangle = new Rectangle((int)500, (int)73, Block2.Width, Block2.Height);

        if ((MegamanRectangle.Intersects(Block1Rectangle) || (MegamanRectangle.Intersects(Block2Rectangle))))
        {
            Grounded = true;
        }
        else
        {
            Grounded = …
Run Code Online (Sandbox Code Playgroud)

c# xna physics

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

重新定位刚体在子弹物理学中的位置

我正在编写一个使用Bullet Physics作为物理模拟引擎的角色动画渲染引擎。

序列将在屏幕上没有模型的情况下开始,然后将动画分配给该模型,模型将移至动画的第0帧,引擎将开始使用动画渲染模型。

在第0帧初始化刚体时,在刚体模型上重新放置刚体的正确方法是什么?

当前,我正在使用此代码,在将动画分配给模型并将骨骼移动到第0帧位置后立即调用该代码:

_world->removeRigidBody(_body);
bool k = (_type == Kinematics);
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans()));
tr *= _trans;
_body->setCenterOfMassTransform(tr);
_body->clearForces();
_body->setLinearVelocity(btVector3(0,0,0));
_body->setAngularVelocity(btVector3(0,0,0));
_world->addRigidBody(_body, _groupID, _groupMask);
Run Code Online (Sandbox Code Playgroud)

问题是有时候这行得通,有时则行不通。例如,以模特的裙子为例。有时它会以自然位置显示,其他时候略微偏离并落入到位,而其他时候它会完全夹在整个身体中,就像碰撞被关闭并且有些力将其推向那个方向一样。在大多数情况下,这确实很有意义,因为在测试动画中,我使用的模型的初始位置位于屏幕的中央,但是动画从屏幕的左侧开始。有谁知道如何解决这个问题?

我知道裙子上的骨骼不是问题,因为我关闭了物理功能,并强迫它在每个帧中手动更新骨骼位置,并且整个动画中的所有位置都正确。

编辑:我也有约束,可能是什么原因造成的?

physics position set bullet rigid-bodies

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

你如何输入分段函数到wolfram alpha?

我尝试了几种方法,比如在某些值上定义函数f(t),然后在我的方程中使用f(t),但到目前为止我没有任何工作.我喜欢使用wolfram alpha,它是帮助我更好地理解我的高级微分方程作业的宝贵资源.我试图绘制从0到5pi
的分段方波.方程式在 x'' + 2x' + x = f(t)哪里

__{0, (2n+1)*pi < t < (2n+2)*pi}

f(t) =

 __{5, 2n*pi < t < (2n+1)*pi} n = 0,1,2,3,4...etc  
Run Code Online (Sandbox Code Playgroud)

f(t)是0和pi之间的值为5的方波,然后是pi之间的0 2*pi,然后是2*pi和3*pi之间的5 ...等等f(t)是ODE的驱动函数.什么是图之间的0 < t < 5*pi 任何帮助输入到绘图仪,如wolfram alpha将非常感谢,ty!

math physics wolframalpha differential-equations

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

刚体仿真摩擦力

我目前正在研究3D刚体仿真程序.我目前设法让刚体与地板碰撞并使用冲动正确弹跳.然而,我的问题是,一旦它们反弹,它们会不断加速,尽管使用摩擦矢量试图减慢它们.

当你到达地面时,这是代码

Rvector fDirection(m_Bodies[i].Vel.x,0.0,m_Bodies[i].Vel.z);
Rvector relativeVelocities = m_Bodies[i].Vel - floorVelocity;
fDirection.normalize();


Real impulse = -(1+e) * (Rvector::dotProduct(relativeVelocities,floorNormal)) 
/ (1/m_Bodies[i].mass + floorMass);
Rvector friction = fDirection*mu*gravity.length()*m_Bodies[i].mass;

Rvector collision_forces = Rvector(0,1,0)*impulse;
collision_forces += friction ;

m_Bodies[i].Vel += (collision_forces/m_Bodies[i].mass);
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:这是集成代码.

void RigidBodySimulation::eulerIntegration(float dTime)
{
    Rvector newVel;
    Rvector newPos;
    Rvector zero(0.0, 0.0, 0.0);
    Real one_over_mass;
    Rvector accel;
    for( unsigned int i = 0 ; i < m_Bodies.size(); i++)
    {   
        one_over_mass = 1/m_Bodies[i].mass;
        newVel = m_Bodies[i].Vel + m_Bodies[i].force*one_over_mass*dTime;
        newPos = m_Bodies[i].Pos + m_Bodies[i].Vel*dTime;
        accel …
Run Code Online (Sandbox Code Playgroud)

c++ 3d physics rigid-bodies

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

为Unity创建绳索物理

我想在Unity中创建一个类似蹦极的游戏,因此我需要绳索物理.我特别需要弹性绳索,能够在稍微伸展后以速度拉动物体.你知道有什么地方可以开始吗?因为我不知道如何开始这样的脚本.

我看了资产商店.有一些绳索物理模拟器,但我必须自己做,加上它们真的很贵.

我已经尝试在Unity中使用Spring和/或Configurable Joints,但是他们没有给出我想要的东西.

编辑:我现在正在审查雅各布森的放松方法.如果您有更多方法可以提供,或者对方法有深入了解,请随时帮助我.

physics unity-game-engine

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

iPhone上最快的反方形根

我正在开发一款涉及某些物理计算的iPhone应用程序,每秒进行数千次.我正在努力优化代码以提高帧速率.我正在寻求改进的其中一个方面是反平方根.现在,我正在使用Quake 3快速反平方根方法.然而,在做了一些研究之后,我听说使用NEON指令集有一种更快捷的方法.我不熟悉内联汇编,无法弄清楚如何使用NEON.我尝试实现math-neon库,但是由于大多数基于NEON的函数缺乏,我遇到了编译器错误return.

编辑:我突然得到一些"不明确的问题"关闭投票.虽然我认为它非常明确,而且那些回答明显的人都明白,也许有些人需要明确说明: 你如何使用Neon来执行更快的计算?它是否真的是在iPhone上获得反平方根的最快方法?

编辑:我今天在Neon VS Quake上做了一些更正式的测试,但如果有的话,我现在对结果更加不确定:

  • 应用内测试:(当前在应用商店中的应用,其invsqrt方法已修改)

    1. 地震方法(在压力条件下平均FPS略有增加)
    2. 霓虹灯(这是一个非常接近的电话,但似乎Quake稍快一点)
    3. 1/sqrtf()(差异更明显,1-3 FPS下降).
  • "正式"测试(吞噬我的手机CPU的应用程序.计算每种方法通过1​​0000000随机生成的浮点数组所需的时间)

    1. 霓虹灯(显然是最快的,如果它用于一次做两个sqrts,速度加倍).
    2. 1/sqrtf()(只比霓虹灯慢一点.这个令人惊讶的结果让我认为这个测试"没有结果",直到我进一步调查)
    3. Quake(令人惊讶的是,这种方法比其他两种方法慢了几个数量级.鉴于它在其他测试中的表现,这尤其令人惊讶.)

虽然在应用程序性能测试中,地震与霓虹灯的距离太近而无法确定,但在第一次测试中,地震vs 1/sqrtf()显然已被切断,第二次测试与输出的值非常一致.但最重要的是应用程序性能,所以我将根据该测试做出最终决定.

optimization physics objective-c neon ios

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

C#中的N体仿真

我正在尝试使用Runge Kutta 4或Velocity Verlet集成算法在C#中实现N体模拟.

在我移动到更大数量的粒子之前,我想通过模拟围绕太阳的地球轨道来测试模拟,然而,由于某种原因,我得到了一个奇怪的螺旋而不是椭圆轨道.

我无法弄清楚这个问题,因为我使用相同的算法对太阳系进行了简单的模拟,其中太阳被固定在适当的位置并且一切都运行良好.积分器工作得很好,因为我使用哪一个并不重要,我得到两者的螺旋.

任何帮助,将不胜感激.

这是代码:

class NBODY
{
    public static double G = 4 * Math.PI * Math.PI;

    class Particle
    {
        public double[] r;       // position vector
        public double[] v;       // velocity vector
        public double mass;    

        //constructor
        public Particle() {}
        public Particle(double x, double y, double z, double vx, double vy, double vz, double m)
        {
            this.r = new double[3];
            this.v = new double[3];

            this.r[0] = x;
            this.r[1] = y;
            this.r[2] = z;
            this.v[0] = vx;
            this.v[1] …
Run Code Online (Sandbox Code Playgroud)

c# algorithm simulation physics numerical-methods

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

Modelica中的七体机制

我必须在Modelica中建模一个"七体机制": 在此输入图像描述

给出了初始角度:从左侧(K5和K7)开始:

Modelica模型:

在此输入图像描述

  • 是否可以将K5模型化为一个体型,并指定质心?
  • 我在哪里可以设置K5和K7的初始角度?在"revolute2"模型中,可以设置一个"phi_start"
  • 我应该将哪种型号用于"固定"B和O?有这个参数:从世界帧到frame_b的位置矢量,在世界帧中解析.

编辑:我想我可以用两个不同的角度解决问题 - 我刚刚添加了另一个轮回: 在此输入图像描述

我有下一个问题:如何模拟K5和K4相遇的旋转?我不确定我是否也应该使用2个旋转?如何建模修复B和O?A固定在原点,但我不确定B和O的位置向量.

我总是得到一个错误"所有力量都不能被唯一计算"

非常感谢您的帮助

physics modelica

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

物理圈碰撞弹出并滑向界限

在Java中,我正在为Android编写一个移动应用程序,以便与我自己编写的某些类进行交互.重力取决于手机的倾斜度.

我注意到当我在一个角落里蜷缩成一堆球时,其中一些会开始抖动,或者有时会在与其他球碰撞时滑动.这可能是因为我正在以错误的顺序执行步骤吗?

现在我有一个循环通过每个球到:

  • 模拟迭代
  • 检查与其他球的碰撞
  • 检查与场景边界的碰撞

我应该补充一点,我与边界有摩擦,当发生球与球的碰撞时,只是为了失去能量.

以下是处理冲突的部分代码:

    // Sim an iteration
    for (Ball ball : balls) {
        ball.gravity.set(gravity.x, gravity.y);

        if (ball.active) {
            ball.sim();

            // Collide against other balls
            for (Ball otherBall : balls) {
                if (ball != otherBall) {
                    double dist = ball.pos.distance(otherBall.pos);
                    boolean isColliding = dist < ball.radius + otherBall.radius;
                    if (isColliding) {
                        // Offset so they aren't touching anymore
                        MVector dif = otherBall.pos.copy();
                        dif.sub(ball.pos);
                        dif.normalize();
                        double difValue = dist - (ball.radius + otherBall.radius);
                        dif.mult(difValue);
                        ball.pos.add(dif);

                    // Change …
Run Code Online (Sandbox Code Playgroud)

java physics collision

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