Как изменить центр масс unity

Suggest a change

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Your name

Your email

Suggestion*

Cancel

Switch to Manual

Description

The center of mass relative to the transform’s origin.

If you don’t set the center of mass from a script it will be calculated automatically from all colliders attached to the rigidbody. After a custom center of mass set, it will no longer be recomputed automatically on modifications such as adding or removing colliders, translating them, scaling etc. To revert back to the automatically computed center of mass, use Rigidbody.ResetCenterOfMass.

Setting the center of mass is often useful when simulating cars to make them more stable.
A car with a lower center of mass is less likely to topple over.

Note: centerOfMass is relative to the transform’s position and rotation, but will not reflect the transform’s scale!

// Expose center of mass to allow it to be set from
// the inspector.
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour { public Vector3 com; public Rigidbody rb;

void Start() { rb = GetComponent<Rigidbody>(); rb.centerOfMass = com; } }

Сдвинуть центр массы

Сдвинуть центр массы

Есть спрайт
на нем есть коллайдер2D
и есть риджитбади2D
можно как-то адекватно опустить центр массы вниз по Y ?
пробовал через дочерние пустые объекты,расположенные в необходимой точке,но в таком случае у них какая-то своя вымышленная физика
Заранее спасибо за любую помощь!

Аватара пользователя
AndyGriffits
UNIт
 
Сообщения: 84
Зарегистрирован: 08 апр 2014, 20:42

Re: Сдвинуть центр массы

Сообщение Diab10 05 дек 2014, 14:53

AndyGriffits писал(а):Есть спрайт
на нем есть коллайдер2D
и есть риджитбади2D
можно как-то адекватно опустить центр массы вниз по Y ?
пробовал через дочерние пустые объекты,расположенные в необходимой точке,но в таком случае у них какая-то своя вымышленная физика
Заранее спасибо за любую помощь!

Не знаю как там в 2D, но в 3D при помощи кода можно установить центр массы RigidBody в нужную позицию

Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Сдвинуть центр массы

Сообщение Левш@ 05 дек 2014, 15:18

Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Сдвинуть центр массы

Сообщение AndyGriffits 05 дек 2014, 22:50

Левш@ писал(а):http://docs.unity3d.com/ScriptReference/Rigidbody2D-centerOfMass.html

Я извиняюсь за дотошность,сам неточно описал вопрос
Про код собственно и спрашиваю
мне просто написать Rigidbody2D.centerOfMass(0,-15) ?
вроде пробовал,но результата не заметил

Аватара пользователя
AndyGriffits
UNIт
 
Сообщения: 84
Зарегистрирован: 08 апр 2014, 20:42

Re: Сдвинуть центр массы

Сообщение AndyGriffits 05 дек 2014, 23:53

Сделал так

Используется csharp

public Vector2 Mass = new Vector2(0,15);
        void Start () {
                rigidbody2D.centerOfMass = Mass;
        }

круто,все вроде бы работает с одним но
на спрайте с круглым или яйцеобразным коллайдером опускаю центр тяжести вниз,чтобы получить неваляшку
Падая на поверхность под углом он возвращается,раскачиваясь,к вертикальному положению,но очень сильно проскальзывает вбок по поверхности при этом
Может кто знает как этого избежать? :-??

Аватара пользователя
AndyGriffits
UNIт
 
Сообщения: 84
Зарегистрирован: 08 апр 2014, 20:42

Re: Сдвинуть центр массы

Сообщение AndyGriffits 06 дек 2014, 00:44

+ Увеличил Angular Drag у риджитбади,чутка помогло,но сам эффект скольжения при раскачивании остается,как ни крути

Аватара пользователя
AndyGriffits
UNIт
 
Сообщения: 84
Зарегистрирован: 08 апр 2014, 20:42

Re: Сдвинуть центр массы

Сообщение Левш@ 06 дек 2014, 12:38

RB в своем репертуаре, ничего не попишеш. :)
Поиграй еще массой, хз — может поможет.

Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Сдвинуть центр массы

Сообщение AndyGriffits 06 дек 2014, 13:09

Левш@ писал(а):RB в своем репертуаре, ничего не попишеш. :)
Поиграй еще массой, хз — может поможет.

Понятно,спасибо,буду пробовать :)

Аватара пользователя
AndyGriffits
UNIт
 
Сообщения: 84
Зарегистрирован: 08 апр 2014, 20:42


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

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

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



  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /

avatar image


0

Im making a racing game and 7/8of my cars are working perfectly: what I mean is, they are driving well, their center of mass is good, but it comes down to one ve$$anonymous$$cle. See, im using the catamount car from unitys car tutorial asset with my own script. The driving is working well, but the problem is, whenever I turn hard to right/left, it just bicycles.(goes on 2 wheels.) I dont know,if its the COM, or a problem with wheel colliders. Heres a snippet of my COM code so you can see.

 #pragma strict
 var centerOfMass : Vector3
 function Start (){
 GetComponent.<Rigidbody>.centerOfmass = centerOfMass;
 SetValues();
 }
 

I assume you set the centerOfMass values to something like (0, -0.5f, 0), right? Anyway, imagine sitting in a real car, driving fast and suddenly turning hard left or right, wouldn’t the car go on two wheels or even flip? It’s (kind of) realistic behavior, I would think. Also, I don’t know about the car set up of the tutorial, but a real car also hass a suspension that helps in those cases.

Lowering center of mass is not best solution for making car stable if you want realistic car physics, but for arcade its ok. If you try turn at high speed you need reduce max angle of wheel rotation, so your max angle base on curent speed of car.

My center mass is -0.5,-1.2,0. This works fine for me, but if i set the suspens ion to 0. But even this causes the car to act really weird. Also i forgot to mention that it lifts up even at lower speeds. I just need an, if you could, a solution, like increasing the mass of the wheel colliders, or maybe increasing the rigidbody mass, or interpolation? Thx anyway

1 Reply

·
Add your reply

  • Sort: 

avatar image


8

Answer by UziMonkey · Jun 28, 2015 at 10:17 PM

The easiest way to do t$$anonymous$$s is add a c$$anonymous$$ld empty object called Com or somet$$anonymous$$ng. Then in your script set the empty’s local position to the rigid body’s center off mass. T$$anonymous$$s makes it easily adjustable and not hardcoded, and the script that sets the center off mass will be reusable. Just remember to use localPosition, as the center of mass property will only work with local coodinates.

I couldn’t reposition my vehicle because it was twisting like a worm. It was from using position instead of localPosition. Thanks!

Your answer

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Related Questions

Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.

Получаем/задаем вектор скорости объекта:

var velocity = GameObject.rigidbody.velocity;
GameObject.rigidbody.velocity = Vector3(0, 1, 0);

Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:

GameObject.rigidbody.drag = 100;

Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:

GameObject.rigidbody.mass = 5;

Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:

GameObject.rigidbody.useGravity = false;

Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:

GameObject.rigidbody.isKinematic = true;

Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:

GameObject.rigidbody.freezeRotation = true;

Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.

GameObject.rigidbody.centerOfMass = Vector3(1, 0, 0);

Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:

GameObject.rigidbody.detectCollisions = false;

Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.

Задать плотность объекта:

GameObject.rigidbody.SetDensity(1.5);

Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.

GameObject.rigidbody.AddForce(5, 0, 0);

Применить импульс к объекту с вектором в его (объекта) системы координат:

GameObject.rigidbody.AddRelativeForce(0, 0, 5);

Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс GameObject.rigidbody.centerOfMass.

GameObject.rigidbody.AddTorque(0, 1, 0);

Тоже самое, что и предыдущий пример, но относительно координат объекта:

GameObject.rigidbody.AddRelativeTorque (1, 0, 0);

Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.

GameObject.rigidbody.AddForceAtPosition(Vector3(0, 5, 7), Bomb.transform.position);

Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:

GameObject.rigidbody.AddExplosionForce(power, explosionPos, radius, 2.0);

Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:

GameObject.rigidbody.Sleep();

Проверить «заснул» ли объект:

GameObject.rigidbody.IsSleeping();

«Разбудить» объект для возможности дальнейшего применения влияния физики на него:

GameObject.rigidbody.WakeUp();

В этой статье попробуем разобрать принцип работы физических объектов в связке с джойнтами и построить простые весы с их помощью.

Для начала возьмем простую форму весов и разделим ее на два отдельных объекта: основу, которая будет выполнять роль фона, и чаши весов, куда будут помещаться объекты.

Помещаем основу на сцену.

Начнем с создания центра масс. Это объект, к которому будут крепится все остальные составляющие весов. Добавим компонент Rigidbody2D, чтобы сделать его физическим объектом и выставим параметр Body type, в настройках, в режим Static, так как центр масс будет неподвижным.

Далее создаем новый объект в виде длинной платформы. Именно к этой платформе в будущем будут крепиться чаши весом, сама же платформа, в свою очередь, будет крепиться к центру масс.

Важно расположить этот объект точно в центре объекта “центра масс”.

Добавляем созданной платформе компоненте FixedJoint2D, чтобы можно было зафиксировать ее на сцене. Сам компонент FixedJoint2D находится во вкладке Component -> Physics 2D -> Fixed Joint 2D

Вместе с компонентом FixedJoint2D, платформе автоматически добавляется компонент Rigidbody2D и теперь мы имеем полноценный физический объект.

Для начала в настройках компонента Rigidbody2D запрещаем объекту двигаться по осям X и Y, чтобы платформа не опускалась под тяжестью весов, но оставляем ей возможность вращаться.

Теперь переходим к настройкам компонента Fixed Joint 2D. Здесь все достаточно просто – крепим платформу к центру масс, просто перенеся объект в поле Connected Rigid Body.

Далее переходим к следующей части создания весов – креплению чаш.

Переносим основу для создания чаши на сцену и выставляем высоту на которой они будут крепиться под платформой.

Теперь, чтобы прикрепить чашу к краю платформы весов, добавляем ей компонент DistanceJoint2D. Этот компонент, в отличие от компонента FixedJoint2D, позволяет присоединять объекты на определенном расстоянии от точки крепления. Найти компонент DistanceJoint2D можно там же, где и FixedJoint2D во вкладке Component -> Physics 2D -> Distance Joint 2D.

Переходим к настройкам компонентов чаши. Первым делом в настройках компонента Rigidbody2D, запретим чаши вращаться, чтобы не перекинуться.

Далее переходим к настройкам компонента Distance Joint 2DЧтобы закрепить чашу к платформе, достаточно перенести объект – платформу в поле Connected Rigid Body, как это уже делали раньше с креплением платформы к центру масс.

Как видно на изображении сверху, чаша автоматически присоединилась к центру платформы, а нужно, чтобы соединение было к ее краю. Поэтому с помощью мыши перетаскиваем точку крепления из центра к краю платформы.

Готово, чаша присоединена к платформе. Далее необходимо добавить чаше один из коллайдеров, чтобы на ней можно было располагать физические объекты.

На изображении выше используется полигональный коллайдер PolygonCollider2D, чтобы придать коллайдеру изогнутую форму, но можно использовать и любой другой коллайдер.

Теперь необходимо повторить все эти же действия для второй чаши: также крепим ее к другому краю платформы весов и добавляем коллайдер.

Можно протестировать работу весов и запустить проект.

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

Сейчас чаши не реагируют на физические объекты, помещенные на них. Это потому, что платформа жестко закреплена к центру масс через компонент FixedJoint2D и не реагирует на то, что в находится в чашах.

Чтобы весы заработали необходимо “ослабить” фиксацию платформы к центру масс.

Возвращаемся к настройкам платформы и ее компоненту FixedJoint2D, где нам понадобится поработать с двумя настройками Damping Ratio и Frequency.

Первый параметр, Damping Ration, регулирует от 0 до 1 значение силы крепления объекта к центру, где 0 означает полную фиксацию объекта, а 1 наоборот – полную свободу объекта. Этот параметр можно сравнить с обычным болтом или саморезом, чем сильней и плотней прикручивать объект саморезом или болтом к поверхности тем слабее он будет поддаваться любому движению. Так как нам нужно чтобы платформа свободно могла вращаться выставим этому параметру значение 1.

Далее параметр Frequency, показывает как сильно объект “стремится” принять исходное положение после совершения какого либо движения. Этот параметр может быть сколько угодно большим, и чем больше его значение тем сильней объект будет стараться принять исходное положение. Для примера поставим значение равное 5.

Теперь можно снова запустить проект и убедиться, что чаши теперь свободно реагируют на помещенные в них объекты.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить центр груди
  • Как изменить ценовую группу для группы номенклатуры
  • Как изменить ценности человека
  • Как изменить цель сна на айфоне
  • Как изменить цель подвижности на айфоне

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии