Coliders и терраин

Физика в Unity

Coliders и терраин

Сообщение shutov 15 фев 2011, 19:27

Всем привет, у меня проблема, может кто поможет советом, короче, если сложному объекту( у которого много частей) назначить collider и например после это назначить ему точку куда он должен направляться, он начинает прыгать, как я понял это происходит потому, что коллайдер опускается ниже терраина, т.е. проходит терраин, но как это исправить, я не знаю(
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение shutov 15 фев 2011, 21:27

так никто не сталкивался? просто это достает...дело в коллайдерах....но как исправить чтобы они не выходили за плоскость терраина...
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение waruiyume 15 фев 2011, 21:30

Тестовую сцену в студию.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coliders и терраин

Сообщение shutov 15 фев 2011, 21:41

да я бы с радостью...ток она 2 Гб весит...
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение waruiyume 15 фев 2011, 21:47

shutov писал(а):да я бы с радостью...ток она 2 Гб весит...

Создайте новый проект и засуньте в него ваш составной объект без меша.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coliders и терраин

Сообщение shutov 15 фев 2011, 21:50

и все будет нормально, пробовал, и в этом проекте все норм сначала было, а потом объекты начали прыгать, может это из-за скрипта?
Синтаксис:
Используется javascript
var healthScaleX:float=1.0;
var healthScaleY:float=0.5;
var healthPositionY:float=10.0;
var icon :Texture;
var carcass : GameObject;
var heart = 100;
var minDistanceToTarget :float;
var maxDistanceToTarget :float;
var moveToTarget : boolean = false;
private var incoreMoveToTarget : boolean = false;
private var incoreTarget:GameObject;
var distanseStopToTarget : float=20;
var targetPosition : Vector3;
private var turretRotationForce = 83.5; // 53.5
private var barrelRotationForce = 43.5; // 53.5
private var barrelMinRotation = 20.0;
private var barrelMaxRotation = 330.0;
private var rotationForce = 1.1; // 2.5
private var targetReachedRadius : float = 2.0;
private var maxEngineForce : float = 10.0;// 14.0
private var engineForce : float = 0.0;
private var pitchForce : float = 0.0;
private var accelerationForce : float = 6.0; // 9.0
private var brakeForce : float = 20.0;
private var distanceToDestiantion : float = 0.0;
private var moveMode : MoveModeType = MoveModeType.STOP;
private var maximumFireRange = 80.0;
private var maximumEnemyDetectionRange = 130.0; // TODO HIER WEITERMACHEN MIT ENEMY SCANNING!
private var terrainLayerMask = 1 << 9;
private var nonTerrainLayerMask = ~terrainLayerMask;


var turret : GameObject;
var target : GameObject;
var barrel : GameObject;

var gunMuzzlePoint : GameObject;

// projectiles
var mainGunProjectile : Rigidbody;

var isSelected : boolean = false;

var healthBarPrefab : GameObject;
private var healthBar : GameObject;

// Skidmarks object
var skidmarks : Skidmarks;
public var lastSkidMark : int = -1;

 enum MoveModeType {
        STOP = 1,
        FORWARD = 2    
};

function Start() {
        //print("Tank start called...");
        var go : GameObject = GameObject.Find("UnitManager");
        go.SendMessage("AddUnit", gameObject);
       
        healthBar = Instantiate(healthBarPrefab, transform.position, Quaternion.identity);
        healthBar.transform.parent = gameObject.transform;
        healthBar.transform.position.y += healthPositionY;
        healthBar.transform.localScale+=Vector2(healthScaleX,healthScaleY);
   

        SetUnitSelected(true);
       
        //find skidmark object
    //var skidmarks : Skidmarks = GameObject.Find("Skidmarks").GetComponent(Skidmarks);
        skidmarks = GameObject.FindObjectOfType(Skidmarks);
        skidmarks.TestSkidmarks();
        //(Skidmarks)
}



function Update () {

if(incoreMoveToTarget==true){incoreTarget=target;}
if(incoreTarget==null){poiskEnemy();}
//poiskEnemy();


        if (moveToTarget) {
               
                var rotation = Quaternion.LookRotation(targetPosition - transform.position);
                str = Mathf.Min (rotationForce * Time.deltaTime, 1);
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, str);
               
                // Check direction angle. If greater than 60В° then first turn without moving, otherwise full throttle ahead.
                var targetDir = targetPosition - transform.position;
                var forward = transform.forward;
                var angle = Vector3.Angle(targetDir, forward);
                if (angle > 60.0) {
                        moveMode = MoveModeType.STOP;
                } else {
                        moveMode = MoveModeType.FORWARD;
                }
               
                // Add tank tracks
                //lastSkidMark = skidmarks.AddSkidMark(rigidbody.position, rigidbody.rotation.eulerAngles, 1, lastSkidMark);
               
                // check the distance
                distanceToDestiantion = Vector3.Distance(targetPosition, transform.position);
                //print ("Distance to other: " + dist);
                ///////////////////////////////////////////////////////////////////////////
                if(incoreMoveToTarget==true){targetReachedRadius=distanseStopToTarget;}else{targetReachedRadius=2.0;}
                ///////////////////////////////////////////////////////////////////////////
                if (distanceToDestiantion < targetReachedRadius) {
                        moveMode = MoveModeType.STOP;
                        moveToTarget = false;
                        distanceToDestiantion = 0.0;
                        incoreMoveToTarget=false;
                }
        }
       
        // If enemy is set, turn turret
        if (target) {

                // Rotation (Yaw) of the turret
                var targetVectorTurret : Vector3 = target.transform.position - turret.transform.position;
                var localTurretHeading : Vector3 = turret.transform.InverseTransformDirection(targetVectorTurret);
                var requiredYaw : float = Mathf.Rad2Deg * Mathf.Atan2(localTurretHeading.x, localTurretHeading.z);
                //var requiredPitch : float = Vector3.Angle(Vector3.up, localTurretHeading) - 90.0;
                        //var deltaYaw = (requiredYaw / 10) * turretRotationForce * Time.deltaTime;
                        //deltaYaw = Mathf.Clamp(deltaYaw, -2.0, 2.0);
                var deltaYaw = Mathf.Clamp((requiredYaw / 10) * turretRotationForce, -45.0, 45.0) * Time.deltaTime;
                turret.transform.Rotate(Vector3.up, deltaYaw, Space.Self);
               
                // Pitch of the barrel
                var targetVectorBarrel : Vector3 = target.transform.position - barrel.transform.position;
                var localBarrelHeading : Vector3 = barrel.transform.InverseTransformDirection(targetVectorBarrel);
                var requiredPitch : float = Vector3.Angle(Vector3.up, localBarrelHeading) - 90.0;
               
                var deltaPitch = Mathf.Clamp((requiredPitch / 10) * barrelRotationForce, -45.0, 45.0) * Time.deltaTime;
                //print("requiredPitch: " + requiredPitch + " barrel.x: " + barrel.transform.localEulerAngles.x + " " + deltaPitch);
                //if (barrel.transform.localEulerAngles.x > 20 && barrel.transform.localEulerAngles.x < 340) {
                //      deltaPitch = 0;
                //}
                barrel.transform.Rotate(Vector3.right, deltaPitch, Space.Self);
               
                // Check pitch bounds
                var pitchBounds : Vector3 = barrel.transform.localEulerAngles;
                //print("pitchBounds: " + pitchBounds);
                if (barrel.transform.localEulerAngles.x > barrelMinRotation && barrel.transform.localEulerAngles.x < 180) {
                        pitchBounds.x = barrelMinRotation;
                } else if (barrel.transform.localEulerAngles.x < barrelMaxRotation && barrel.transform.localEulerAngles.x > 180) {
                        pitchBounds.x = barrelMaxRotation;
                }              
                barrel.transform.localEulerAngles = pitchBounds;
               
                // Draw Debug Ray
                //var forward = barrel.transform.TransformDirection(Vector3.forward) * 10;
                //Debug.DrawRay (barrel.transform.position, Vector3.forward * 10, Color.green);
                //Debug.DrawRay (barrel.transform.position, barrel.transform.eulerAngles, Color.green);
        }
}




function Awake() {
       
        FireMainGun();
}

function FireMainGun() {

        if (isTargetInFiringArc()) {
                var instantiatedProjectile : Rigidbody = Instantiate (mainGunProjectile, gunMuzzlePoint.transform.position, gunMuzzlePoint.transform.rotation);
                instantiatedProjectile.velocity = gunMuzzlePoint.transform.TransformDirection(Vector3 (0, 0, 80.0));
                audio.Play();
                 //instantiatedProjectile.velocity = transform.TransformDirection (Vector3.forward * 10);
       
                //var direction = transform.TransformDirection(Vector3.forward);
                //instantiatedProjectile.velocity = direction;
                //Physics.IgnoreCollision(instantiatedProjectile.collider, barrel.transform.root.collider);
        }
        yield WaitForSeconds(3.5);
        //FireMainGun();
        StartCoroutine("FireMainGun");
        //yield
}

function isTargetInFiringArc()
{
        if (target)
        {
                var position : Vector3 = barrel.transform.position;
                var direction : Vector3 = target.transform.position - position;
                var distance : float = direction.magnitude;

                var angle : float = Vector3.Angle(barrel.transform.forward, direction);
                var halfFireingArc = 5.0;
                //print("angle: " + angle);
                if (angle < halfFireingArc && distance < maximumFireRange)
                {
                        return true;
                        // RaycastHit hit;
                        // if(Physics.Raycast(position, direction, out hit, distance))
                        // {
                        //      if(hit.distance > distance - 3.0f)
                        //              return true;
                        // }
                }
        }

        return false;
}

function FixedUpdate() {
       
        switch (moveMode)  {
                case MoveModeType.STOP:
                        engineForce -= brakeForce * Time.deltaTime;
                        if (engineForce < 0) {
                                engineForce = 0;
                        }
                        // no pitchforce if we stop!
                        pitchForce = 0.0;
                        break;
                case MoveModeType.FORWARD:
                        engineForce += accelerationForce * Time.deltaTime;
                        if (engineForce > maxEngineForce) {
                                engineForce = maxEngineForce;
                        }
                       
                        var pitchAngle = transform.localEulerAngles.x;
                        if (pitchAngle > 180) {
                                // vehicle's nose is up, value is below 360В°. Normalize to -x degree.
                                pitchAngle = -(360 - pitchAngle); // now normalized to (+/-)0-x degree
                        }
                        pitchForce = maxEngineForce * pitchAngle / 100.0;
                        // if (pitchForce > (maxEngineForce / 2.0)) {
                        //                              pitchForce = maxEngineForce / 2.0;
                        //                      }
                        //print("pitchAngle: " + pitchAngle + " pitchForce: " + pitchForce);
                        break;
        }

        //if (moveToTarget && allowedToMove) {
                //rigidbody.AddRelativeForce (0, 0, 10);
                //var speed = Vector3 (3, 0, 0);
                //rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
                transform.Translate(Vector3.forward * Time.deltaTime * (engineForce + pitchForce));
        //}
}

function MoveToPoint(newTarget : Vector3) {
        moveToTarget = true;
        moveMode = MoveModeType.FORWARD;
        targetPosition = newTarget;
        //print ("Tank moving to: " + targetPosition);
}

// Gets called from the unit manager when this unit gets selected
function SetUnitSelected(selected : boolean) {
        isSelected = selected;
        healthBar.GetComponent("HealthBar").SetHealthEnabled(isSelected);
}

function SetSelected() {
        print("I got selected... " + name);
        var go : GameObject = GameObject.Find("UnitManager");
        go.SendMessage("AddSelectedUnit", gameObject);
}

////////////////////////////////////////////////////////////////////////*Incore code START*//////////////////////////////////////////////////////////////////////////////
function poiskEnemy() : GameObject {
    // Find all game objects with tag Enemy
    var gos : GameObject[];
    gos = GameObject.FindGameObjectsWithTag("Enemy");
    var closest : GameObject;
    var distance = Mathf.Infinity;
    var position = transform.position;
    // Iterate through them and find the closest one
    for (var go : GameObject in gos)  {
        var diff = (go.transform.position - position);
        var curDistance = diff.sqrMagnitude;
        if (curDistance < distance) {
            closest = go;
            distance = curDistance;
                        if(distance < maxDistanceToTarget && distance > minDistanceToTarget)
                        {
                        target= closest;
                        }else {target=null;}
        }
    }
    return closest;    
}

function MarkerTarget(ggo:GameObject) {
target=ggo;
}

function incoreMoveTarget(go:boolean) {
incoreMoveToTarget=go;
}





///////////////////////////////////////////////////////////////////////*Incore code END*/////////////////////////////////////////////////////////////////////////////
 
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение WhiteDevil 16 фев 2011, 00:05

Ты не понял. Тебе сказали создать новый проект с твоим объектом и терраином мелким. Воспроизведи ситуацию и кидай сюда
В говногоде разбираться втрижды сложнее
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Coliders и терраин

Сообщение shutov 16 фев 2011, 00:19

я же написал...для особо непонятливых еще раз напишу, что в заново созданном проекте, все норм, я попросил помощи, потому что это даже не из-за скриптов, а из-за погрешностей физики, а точнее из-за коллайдеров, которые начинают криво взаимодействовать с коллайдером терраина, после движения объекта, они почему-то проходят сквозь терраин, и по "законам" PhysX он их выталкивает, вот отсюда идет "прыганье", но как это исправить - я не знаю
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение Neodrop 16 фев 2011, 09:19

shutov писал(а):я же написал...для особо непонятливых еще раз напишу, что...

Я опасаюсь, что "особо непонятливые" просто не станут больше отвечать на ваши вопросы, при таком отношении к камрадам... :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Coliders и терраин

Сообщение Zaicheg 16 фев 2011, 09:34

Шутов, смотри какая маза. Если на чистом проекте всё путём, а в рабочем -- лажа по физике, то дело не в физическом движке юнити, а в проекте твоём -- в скриптах, в контенте.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Coliders и терраин

Сообщение Neodrop 16 фев 2011, 09:38

Ещё может начинаться трясучка, если объекты сильно далеко от центра мира. Более 10 000 - 20 000 по любой оси.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Coliders и терраин

Сообщение shutov 16 фев 2011, 10:21

ну извините, за такое отношение... навряд ли в скриптах, так как эти же скрипты если запихнуть в новый проект, то все норм, но через некоторое время все снова начинает дергаться
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение Ert Donuell 16 фев 2011, 11:24

Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Coliders и терраин

Сообщение shutov 16 фев 2011, 11:34

Ert Donuell писал(а):Была аналогичная проблема. Решена.


там проблема решена тем что поставлена галочка Is Kinematic, я такое пробовал, но тогда объекты просто проваливаются сквозь терраин, да, они не дергаются, но появляется другая проблема :(
Аватара пользователя
shutov
UNITрон
 
Сообщения: 173
Зарегистрирован: 16 ноя 2010, 13:31
Откуда: Ульяновск
  • ICQ

Re: Coliders и терраин

Сообщение Ert Donuell 16 фев 2011, 12:05

А если объект, а точнее, его коллизии разместить над террейном? Тогда он должен будет остаться на земле. А ещё можно отключить "Use Gravity" :)
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

След.

Вернуться в PhysX

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

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