Изменить направление движущегося объекта .... (чисто физический вопрос) - PullRequest
1 голос
/ 03 августа 2010

Это чисто физический вопрос, но я не знаю, почему он не работает .... У меня есть движущийся объект. Я получаю значение vcos (theta) и vsin (theta) ... из этогоя вычисляю скорость и угол движения ..... также я знаю другую точку (x, y) и хочу направить объект в эту точку. Я думаю, что мне нужно применить определенную силу (сила должна иметь оси X и Yзначение), чтобы направить объект к точке .... таким образом, чтобы получить требуемое количество силы, я просто следую формуле:-V1sin (theta1)

независимо от того, какой синтаксис приведен ниже (я даю это для тех, кто знает цель c) ......... мое уравнение не работает ....Может кто-нибудь помочь ......

    if (acceleration.x>1.5 || acceleration.y>1.5) {

            shakeCounter++;
            [_label setString:[NSString stringWithFormat:@"%d",shakeCounter]];  


        //get the velocity of moving object.......................  
        b2Vec2 mVelik = ballBody->GetLinearVelocityFromLocalPoint(localPoint);


        float angleOfCurrentDirectionOfMotion;
        float angleOfDesiredDirectionOfMotion;
         //calculate first velocity
        float V1=sqrt(pow(mVelik.x, 2)+pow(mVelik.y, 2));
        //calculate second velocity
        float V2=V1+factor;
        //calculate current  angle
        angleOfCurrentDirectionOfMotion=atan(mVelik.y/mVelik.x);
         //calculate desired angle
        angleOfDesiredDirectionOfMotion=atan(acceleration.y/acceleration.x);
///calculate FX and FY
        float X=V2*cos(angleOfDesiredDirectionOfMotion)-V1*cos(angleOfCurrentDirectionOfMotion);
        float Y=V2*sin(angleOfDesiredDirectionOfMotion)-V1*sin(angleOfCurrentDirectionOfMotion);

        b2Vec2 force = b2Vec2(X,Y);

 ///apply Force to change direction....   
        ballBody->ApplyForce(force, ballBody->GetPosition());

}

1 Ответ

1 голос
/ 03 августа 2010

У меня нет box2d для экспериментов, но я предполагаю, что он работает как надо.

Вы не можете игнорировать массу объекта; чем больше масса, тем меньше влияние силы.

Ваш расчет X и Y кажется правильным (хотя и слишком сложным). Вы можете изменить движение с помощью импульса , приложенного к центру масс ::

b2Vec2 impulse = b2Vec2(X,Y) * ballBody->GetMass() ;
ballBody->ApplyLinearImpulse(impulse, ballBody->GetLocalCenter());

Если вы действительно хотите использовать силу, а не импульс, есть ряд решений. Обычно вы можете сначала выбрать величину силы, а затем рассчитать направление или наоборот. Я могу дать вам уравнения (и, возможно, код), но это не будет иметь никакого смысла без понимания основ физики.

EDIT:
Хорошо, уравнение одномерного движения x = x 0 + V 0 t + при 2 / 2, поэтому WLOG принимает x = 1 в направлении целевую точку, и решить за время (время, когда х шарика будет равна х целевой точки). Затем поместите это время в уравнение для y и решите для y , и все готово.

...