2016-02-10 3 views
0

У меня есть шар с прикрепленным пустым объектом, объект находится на поверхности планеты, ракета запускается из этого пустого объекта. Сфера вращается. Моя ракета может летать по спиральной траектории от центра его создающего места. Проблема, которую я не могу решить, заключается в том, что траектория ракеты не зависит от вращения планеты. Это обновление() функция для ракеты:Как улучшить траекторию ракеты (Unity 3d)

void Update() { 
    angle += speed * Time.deltaTime; 
    x = Mathf.Cos (angle) * radius; 
    z = Mathf.Sin (angle) * radius; 
    rb.velocity = new Vector3(x,0.0f,z); 
    radius += stepOfRadius; 
} 

Что у меня есть: enter image description here

Как я хочу, чтобы это было (без Луны и возвращение на Землю): enter image description here

+0

«Проблема, которую я не могу решить это траектории, ракеты не зависит от вращения планеты» возможно, что просто, у вас есть ракеты, как ребенок на планете? ** если да, отделите его. ** используйте '.parent =', чтобы установить родительский объект Transform - например, '= null' - google 100000 страниц. – Fattie

+0

Хорошо, если вы пытаетесь поддерживать точный контроль над тем, что происходит, вы НЕ должны использовать физику единства для траекторий - только для проверки столкновений, срабатывания вещей и т. Д. И да, причина, по которой ваш корабль объявил независимость, также является продуктом Unity Physics двигатель. Я настоятельно рекомендую вам делать вычисления в FixedUpdate и вручную перемещать ваш корабль. Вы можете поддерживать локальную переменную «скорость», чтобы вести себя, и вы не сомневаетесь, что за сценой не будет никакой другой магии. –

+0

Не будет использовать здесь алгоритм n-body? – trojanfoe

ответ

0

Я не знаю много о единстве3d, но x и z кажутся компонентами положения, а не скоростью.

Если это возможно, попробуйте заменить

rb.velocity = new Vector3(x,0.0f,z); 

по

rb.position = new Vector3(x,0.0f,z); 

или

Vector3 position(x,0.0f,z); 
rb.MovePosition(position); 

В противном случае, вы можете сохранить rb.velocity, определив эти компоненты скорости (Я полагаю, speed является угловая скорость):

x = (stepOfRadius/Time.deltaTime) * Mathf.Cos(angle) - radius * speed * Mathf.Sin(angle); 
z = (stepOfRadius/Time.deltaTime) * Mathf.Sin(angle) + radius * speed * Mathf.Cos(angle); 
+0

С 'rb.position = new Vector3 (x, 0.0f, z);' Ракета становится независимой не только от Земли, но и от места запуска, и ракета всегда начинается со дна планеты. Другой код также не помог. –

+0

Извините, я не знаю единства, чтобы помочь вам больше. Я просто замечаю, что вы вычисляете позицию, но вы рассматриваете ее как скорость. Я предлагаю вам добавить код об определении ракеты/планеты и их движении, это поможет людям ответить – cromod