Помогите выставить центр масс[Решено]

Физика в Unity

Помогите выставить центр масс[Решено]

Сообщение waruiyume 13 фев 2011, 14:22

Сделал скрипт соединяющий объекты в группы и включающий rigidbody (отламываем ветки и они падают).
Посчитал новый центр масс, нарисовал лучик и он в нужном месте.
Назначил центр масс, нарисовал лучик, но тот почему-то не там где я поставил центр масс.
Синтаксис:
Используется javascript
                        if (transform.rigidbody==null)
                        {
                                gameObject.AddComponent (Rigidbody);
                                rigidbody.mass=1000;
                                rigidbody.isKinematic =true;
                        }

private var tr:Transform;
tr=transform;
private var marc : Transform;
marc=tr;
var connected_obj : Transform ;
private var destr : boolean ;
private var leafs = new Array();

function explode_d()
{
        destr=true;
}

function leaf(p:Vector3)
{
        leafs.Add(p);
}

function explode(m:Transform)
{
        tr.parent=null;
        if (connected_obj!=null)
        {
                if (destr!=false)
                {
                        marc=connected_obj;
                }
                else
                {
                        marc=m;
                }
                connected_obj.gameObject.SendMessage ("explode",marc,SendMessageOptions.DontRequireReceiver);
        }
        else
        {
                marc=m;
                m.gameObject.SendMessage ("leaf",tr.position,SendMessageOptions.DontRequireReceiver);
        }
       
                if (tr!=marc)
                {
                        tr.parent=marc;
                        marc=tr;
                }
                else
                {
                        if (rigidbody!=null)
                        {
                                                        rigidbody.isKinematic =false;
                                leaf(tr.position);
                                var c_o_m : Vector3;
                                for (var cp:Vector3 in leafs)
                                {
                                        c_o_m=c_o_m+cp;
                                }
                                c_o_m = c_o_m/leafs.length;
                                c_o_m = tr.InverseTransformDirection (c_o_m);
                                Debug.DrawRay(tr.TransformDirection (c_o_m) ,Vector3.up*100, Color.white);
                                rigidbody.centerOfMass =c_o_m;
                                Debug.DrawRay(rigidbody.worldCenterOfMass ,Vector3.up*100, Color.red);
                        }

                }
}
 

Демка
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dc268.4shared.com/download/J-gYAmg_/WebPlayer.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>

Сцена
http://dc268.4shared.com/download/T9GP-geO/center.unitypackage
Подскажите где ошибка?
p.s.
Если добавить rigidbody, а не выключать isKinematic центр масс рассчитывается автоматически,
но для длинных цепочек FPS падает раза в 4 после каждого добавления rigidbody (видимо
как-раз расчет центра масс)
Последний раз редактировалось waruiyume 17 фев 2011, 10:12, всего редактировалось 1 раз.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Помогите выставить центр масс[Решено]

Сообщение waruiyume 17 фев 2011, 10:11

Причина [curved_hands].
Было "c_o_m = c_o_m/(leafs.length)", а нужно "c_o_m = c_o_m/(leafs.length)-tr.position".
Поставил 3.2 и необходимость изменять центр масс отпала. Теперь если убирать детей из rigidbody
с составными коллайдерами, центр масс выставляется автоматически.
Вот собственно зачем были пляски с бубном

Синтаксис:
Используется javascript
private var tr:Transform;
tr=transform;
private var marc : Transform;
marc=tr;
var connected_obj : Transform ;
private var destr : boolean ;

private var leafs = new Array();

private var old_vel:Vector3;
private var old_rot_vel:Vector3;

function Set_vel(vectors:Vector3[])
{
        old_vel=vectors[0];
        old_rot_vel=vectors[1];
}

function destroy_colliders()
{
        var bt1 : Component[];
        bt1 = GetComponentsInChildren (Collider);
        for (var t:Collider in bt1)
        {
                DestroyImmediate(t);
        }
}

function Update_collider(t:Transform)
{
        var c:Collider=t.GetComponent(Collider);
        DestroyImmediate(c);
        t.gameObject.AddComponent (BoxCollider);
}

function explode_d()
{
        destr=true;
}

function leaf(p:Transform)
{
        leafs.Add(p);
}

function chain(m:Transform)
{
        tr.parent=null;
        if (connected_obj!=null)
        {
                if (destr==true)
                {
                        marc=connected_obj;
                }
                else
                {
                        marc=m;
                }
                connected_obj.gameObject.SendMessage ("chain",marc,SendMessageOptions.DontRequireReceiver);
        }
        else
        {
                marc=m;
                m.gameObject.SendMessage ("leaf",tr,SendMessageOptions.DontRequireReceiver);
        }
                if (tr!=marc)
                {
                        tr.parent=marc;
                        marc=tr;
                }
                else
                {
                                destroy_colliders();
                                if (rigidbody==null)
                                {
                                        tr.gameObject.AddComponent (Rigidbody);
                                        rigidbody.mass=1000;
                                        rigidbody.velocity=old_vel;
                                        rigidbody.angularVelocity=old_rot_vel;
                                }
                                for (var cp:Transform in leafs)
                                {
                                        if (cp!=null)
                                        {
                                                Update_collider(cp);
                                        }
                                }
                                var bt : Component[];
                                bt = GetComponentsInChildren (Transform);
                                for (var t:Transform in bt)
                                {
                                        yield new WaitForFixedUpdate ();
                                        if (t!=null)
                                        {
                                                if(t.parent==tr||t==tr)
                                                {
                                                        Update_collider(t);
                                                }
                                                else
                                                {
                                                        break;
                                                }
                                        }
                                }
                }
}

function explode(m:Transform)
{
                        var h_root:Transform=tr.root;
                        if(h_root.rigidbody!=null)
        {
                var vels:Vector3[];
                vels=new Vector3[2];
                vels[0]=h_root.rigidbody.velocity;
                vels[1]=h_root.rigidbody.angularVelocity;
               
                if(connected_obj!=null)
                {
                        connected_obj.gameObject.SendMessage ("Set_vel",vels,SendMessageOptions.DontRequireReceiver);
                }
        }
chain(m);
}
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в PhysX

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3