Траектория прыжка персонажа

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Траектория прыжка персонажа

Сообщение kasfan 23 авг 2014, 01:51

Всем привет, помогите пожалуйста.
Есть персонаж 2D, который совершает прыжок из точки А в точку В, эти точки мы знаем, но необходимо перемещать персонажа по правдоподобной траектории прыжка. Нужен алгоритм создания функции описывающей траекторию прыжка.
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение Salamandr 23 авг 2014, 03:00

парабола
возможно всё, вопрос лишь в том, есть ли у тебя на это время
группа вк: _ttp://vk.com/sector5661
Аватара пользователя
Salamandr
UNITрон
 
Сообщения: 228
Зарегистрирован: 30 июл 2014, 13:04
Откуда: Астрахань, Каменск-Уральский
Skype: zzzubec
  • ICQ

Re: Траектория прыжка персонажа

Сообщение bwolf88 23 авг 2014, 03:32

Как вариант при прыжке задавай ускорение, которое постепенно уменьшай до 0, затем так же постепенно ускоряй вниз до приземления (если без физики).
Если с физикой, то используй Ригидбоди - он все сам сделает.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Траектория прыжка персонажа

Сообщение Syberex 23 авг 2014, 04:30

Намного удобней использовать AnimationCurve, я так и делаю ;)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Траектория прыжка персонажа

Сообщение kasfan 23 авг 2014, 08:57

Salamandr писал(а):парабола

Спасибо капитан. А каким образом составить функцию параболы по двум точкам?
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение kasfan 23 авг 2014, 09:00

bwolf88 писал(а):Как вариант при прыжке задавай ускорение, которое постепенно уменьшай до 0, затем так же постепенно ускоряй вниз до приземления (если без физики).
Если с физикой, то используй Ригидбоди - он все сам сделает.

Тут проблема в том, что есть координаты точки А из которой совершается прыжок в координаты точки В, за время t. Соответственно мы не можем задавать ускорение или использовать Rigidbody.
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение kasfan 23 авг 2014, 09:03

Syberex писал(а):Намного удобней использовать AnimationCurve, я так и делаю ;)

А нет примера? Просто я пробовал вначале сделать именно так, но получается нереалистично.
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение kasfan 23 авг 2014, 09:03

Syberex писал(а):Намного удобней использовать AnimationCurve, я так и делаю ;)

А нет примера? Просто я пробовал вначале сделать именно так, но получается нереалистично.
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение Salamandr 23 авг 2014, 10:50

Я начну с того, что парабола в отличии от кривой, становится более "тяжелой" именно в своей вершине (там где сходятся её ветки, чем ближе мы к вершине, тем медленней "подъем"), что прекрасно подходит для имитации струи и прыжка.
Изображение
типичная перевернутая парабола: y=-x^2+4x+C
квадратичное уравнение ЛЮБОЙ параболы: (ax^2+bx+c). Меняются только числа a,b,c и знаки.
если a>=0 ветки параболы смотрят вверх, если a<0 ветви смотря вниз (перевернутая).
Точка С точное пересечение левой ветки с осью OY, но это не единственная точка которая может быть самой левой (просто ей проще управлять, ведь она входит в уравнение)
b - всегда определяет высоту параболы

итак,
a=-1 b=4 c=0 (y=-1x^2+4x+C ) единица у x, как бы подразумевается, потому что любое число умноженное на 1, будет равно самому числу.
найдем точку B (точка C будет равно удалена от точки B, так же как конечная точка D от точки B)
найдем координаты вершины:
находим X, x=-b/2a (формула), x=-4/2*-1 = -4/-2 = 2
находим Y, подставив в формулу y = -x^2+4x+C найденный нами X, получим y = -1*(2)^2+4*(2)+0 = -4 + 8 = 4
точки вершины B(2,4)
точки C (0,0)
D можно даже не считать (так как она равно удалена от точки B), разве что проверить
d1 = Bx-Cx = 2-0 = 2 (расстояние по X от B до C), если добавим к B это число узнаем точку D(Bx+d1,Сy) = D(4,0);
но можно и подсчитать, поставив вместо X нужное нам число (4)
находим Y, подставив в формулу y = -x^2+4x+C

могу с полной уверенностью утверждать что будет = 0 ))))

Надо помнить о следующих вещах: точка C не является завершением точек параболы, парабола бесконечна, и можно использовать гораздо удаленные точки от вершины чем точка C; и вторая вещь, изменяя ax можно контролировать ещё и размах ветвей. Чем меньше ax тем больше размах, для примера y = (0.5)x^2+4x+c будет шире в два раза чем предыдущая.

Времени немного, а я школьную программу давно забыл. Просто поиграйтесь со значениями abc, и вы всё поймете ;)
^ - это знак квадрата (мало ли), x^2 = 2, 4, 16, 256, 65536

если чё, есть ещё вот такое решение http://www.gamedev.ru/code/forum/?id=177644#m10
возможно всё, вопрос лишь в том, есть ли у тебя на это время
группа вк: _ttp://vk.com/sector5661
Аватара пользователя
Salamandr
UNITрон
 
Сообщения: 228
Зарегистрирован: 30 июл 2014, 13:04
Откуда: Астрахань, Каменск-Уральский
Skype: zzzubec
  • ICQ

Re: Траектория прыжка персонажа

Сообщение Syberex 24 авг 2014, 10:23

Синтаксис:
Используется csharp
public AnimationCurve curveBrake;
public AnimationCurve curveJump;

        private void Move()
        {

                if (state == stateTypes.Run)
                        transform.position = transform.position + transform.forward * speedRun * Time.deltaTime;
                else if (state == stateTypes.Walk)
                        transform.position = transform.position + transform.forward * speedWalk * Time.deltaTime;
                else if (state == stateTypes.Brake)
                {
                        float speed = stateOld == stateTypes.Run ? speedRun : speedWalk;
                        speed = speed * curveBrake.Evaluate(timerBrake);
                        transform.position = transform.position + transform.forward * speed * Time.deltaTime;
                        if (speed < speedBrakeMin)
                        {
                                state = stateTypes.Idle;
                                // другая анимация включится сама после выхода из анимации торможения Brake
                        }
                }
                else if (state == stateTypes.Jump)
                {
                        float speedX = stateOld == stateTypes.Run ? speedRun : (stateOld == stateTypes.Walk ? speedWalk : 0f);
                        float speedY = heightJump * curveJump.Evaluate(timerJump);
                        Vector3 offset = new Vector3(speedX * Time.deltaTime * input.direction, speedY - transform.position.y, 0f);
                        transform.position = transform.position + offset;
                }
        }
 


Примерно так, но скрипт еще не готов, например прыжок по высоте заложен жестко. И нет гравитиации. Нет реакции на коллайдер пола и тд.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Траектория прыжка персонажа

Сообщение Syberex 24 авг 2014, 10:49

Раньше я тоже извращался с формулами параболы, косинусами и синусами. Но с AnimationCurve более гибко и меньше хлопот в коде ;)
Довольно часто нужно использовать только часть изгиба кривой, приходится вставлять ограничения, подбирать методом тыка и тд.

С AnimationCurve в этом случае можно либо в реальных масштабах заложить кусок кривой или привести к 1.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Траектория прыжка персонажа

Сообщение kasfan 24 авг 2014, 21:58

Syberex писал(а):Раньше я тоже извращался с формулами параболы, косинусами и синусами. Но с AnimationCurve более гибко и меньше хлопот в коде ;)
Довольно часто нужно использовать только часть изгиба кривой, приходится вставлять ограничения, подбирать методом тыка и тд.

С AnimationCurve в этом случае можно либо в реальных масштабах заложить кусок кривой или привести к 1.


Спасибо, посмотрю как время появится
kasfan
UNец
 
Сообщения: 33
Зарегистрирован: 26 июл 2013, 13:03

Re: Траектория прыжка персонажа

Сообщение waruiyume 26 авг 2014, 16:53

:ymparty:
Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Collections;

public class Jump : MonoBehaviour
{
    public float xSpeed = 10;

    public Transform tar;

    void SetJumpSpeed()
        {
        float g = -Physics.gravity.y;

        float xTar = tar.position.x - transform.position.x;
        float yTar = -(tar.position.y - transform.position.y);

        float sX = xSpeed*(xTar > 0 ? 1:-1);

            float t = xTar/sX;
        float y = t*t*g/2 - yTar;

        if(y<0||Math.Abs(t - 0) < Mathf.Epsilon)
        {
            Debug.Log("Can't reach target for given x speed");
            return;
        }

            float s = y/t;

        rigidbody.velocity = new Vector3(sX, s, 0);
        }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            SetJumpSpeed();
        }
    }
}
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 27