Коллизии камеры и поворот объектов

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

Коллизии камеры и поворот объектов

Сообщение int 20 сен 2011, 17:44

Здравствуйте. У меня несколько вопросов, возможно нубских.

1. задача настроить камеру так, чтобы она не пролетала сквозь объекты. Для этого я думаю можно приближать камеру к игроку, но вот какреализовать? . По логике надо добавить сферический триггер-коллайдер + ригидбади с включенным is kinematic. Я использую стандартный скрипт smooth follow для камеры. в нем есть строка

transform.position -= currentRotation * Vector3.forward * distance;

вот distance и надо изменять, но вопрос как.

Сделал вариант с триггером для пробы, но камера начитает дрожать сильно при столкновении, и иногда проскакивает стену.
Синтаксис:
Используется javascript
var target : Transform;
// The distance in the x-z plane to the target
var distance = 5.0;
var dist_low =false;
// the height we want the camera to be above the target
var height = 5.0;
// How much we
var heightDamping = 2.0;
var rotationDamping = 3.0;

function LateUpdate () {
        // Early out if we don't have a target
        if (!target)
                return;
       
        // Calculate the current rotation angles
        wantedRotationAngle = target.eulerAngles.y;
        wantedHeight = target.position.y + height;
               
        currentRotationAngle = transform.eulerAngles.y;
        currentHeight = transform.position.y;
       
        // Damp the rotation around the y-axis
        currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

        // Damp the height
        currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);

        // Convert the angle into a rotation
        currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
       
        // Set the position of the camera on the x-z plane to:
        // distance meters behind the target
        transform.position = target.position;
       
        //transform.position.x -=10;
        if(dist_low==true) distance-=0.3;
        else{
       
        if(distance<5.0) distance+=0.2;
       
        }
        transform.position -= currentRotation * Vector3.forward * distance;

        // Set the height of the camera
        transform.position.y = currentHeight;
       
        // Always look at the target
        transform.LookAt (target);
       
        //Debug.Log(distance);
}

    function OnTriggerEnter (other : Collider) {  // ставлю флаг коллизии  для LastUpdate
    dist_low=true;
    Debug.Log("dist low"+distance);
        }
       
        function OnTriggerExit (other : Collider) {
    dist_low =false;
    }


Потому что камера двигается с разной скоростью, и менять distance нужно плавно, с учетом скорости коллизии, линейное изменение тут не подходит. Думаю надо смотреть в сторону OnCollisionEnter, но пока не доходит. Может есть стандартные решения, я искал не нашел.

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

f
Синтаксис:
Используется javascript
unction LateUpdate () {

y =- Input.GetAxis("Mouse Y") * ySpeed * 0.02;

transform.Rotate( 0, 0,Time.deltaTime+y );

}


Проблема в том что цилинд крутится относительно своего центра, а надо относительно края. Пробовал засунуть его в пустой объект и там сдвинуть относительно родительских координат как мне надо и применить скрипт вращения к родителю -но все равно цилиндр продолжает крутиться вокруг своего центра. Тут даже не знаю в какую сторону думать.
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение seaman 20 сен 2011, 18:32

Попробуйте перейти по моей подписи - почитать. Может натолкнет на какие-то мысли.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Коллизии камеры и поворот объектов

Сообщение int 20 сен 2011, 19:52

спасибо гляну.

а вообще, я что-то сложное спросил или все просто, поэтому никто ответить не хочет? неужели нет функции вращения относительно произвольной точки или относительно координат объекта?
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение seaman 20 сен 2011, 20:00

Сорри. Я второй вопрос даже не заметил.
Читаем документацию.
Quaternion.AngleAxis
Transform-rotation
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Коллизии камеры и поворот объектов

Сообщение waruiyume 20 сен 2011, 20:07

int писал(а): ...неужели нет функции вращения относительно произвольной точки ...?

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

Re: Коллизии камеры и поворот объектов

Сообщение Angel 07 20 сен 2011, 20:48

Основной принцип, чтобы камера не пролетала сквозь объекты - это пускать луч от игрока в камеру, и если он на этом пути встречается с каким-либо объектом, то перемещать камеру в точку пересечения. Поможет класс RaycastHit.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Коллизии камеры и поворот объектов

Сообщение int 20 сен 2011, 21:26

Transform.RotateAround
- это что-то наподобии вращения Земли вокруг Солнца. может я задачу описал нечетко.. Берем чупа-чупс и вращаем палочку относительно центра шарика, или дуло танка относительно башни -вто это мне надо.

Quaternion.AngleAxis
Transform-rotation

читал про эти функции, но понять как их настроить не смог, потому и спрашиваю здесь. примеры из справки вставил -они деформировали цилиндр так, что я даже не понял как эти функции работают.
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение seaman 20 сен 2011, 22:00

может я задачу описал нечетко.. Берем чупа-чупс и вращаем палочку относительно центра шарика, или дуло танка относительно башни -вто это мне надо.

поворот объекта относительно нужной точки

Что нужно? Относительно точки, или относительно родителя?
Если относительно точки, то waruiyume привел самый удобный вариант. Перечитайте еще раз описание метода. Он вращает вокруг указанной оси, проходящей через указанную точку на указанный угол. Что еще надо?
Если же относительно родителя, то опять таки смотрим в справке:
Transform-localRotation
Изменяя эту переменную поворачиваем объект относительно поворота родителя. Чтобы поворот задавать в углах используем это:
Transform-localEulerAngles
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Коллизии камеры и поворот объектов

Сообщение int 20 сен 2011, 23:00

Что нужно? Относительно точки, или относительно родителя?
Если относительно точки, то waruiyume привел самый удобный вариант. Перечитайте еще раз описание метода. Он вращает вокруг указанной оси, проходящей через указанную точку на указанный угол. Что еще надо?


transform.RotateAround (Vector3(0,-1,0), Vector3(1,0,0), 20* Time.deltaTime);

Vector3(0,-1,0) - это координаты точки вращения, но происходит spin а надо rotate, Transform.RotateAround запускает мой цилиндр по окружности вокруг оси, но мне не это надо.

Изображение

Неужели чтобы сделать простейшее вращение нужно поворачивать родительский объект, а потом относительно него как-то поворачивать потомка? Что-то мне Юнити с каждым днем все меньше и меньше нравится..
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение burlak 20 сен 2011, 23:25

int писал(а):Что-то мне Юнити с каждым днем все меньше и меньше нравится..


Пичаль...


TransformAround работает нормально, не так как на картинке, по крайней мере если правильно геометрию задать.
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Коллизии камеры и поворот объектов

Сообщение seaman 20 сен 2011, 23:40

Что-то мне Юнити с каждым днем все меньше и меньше нравится.

Нужно просто не терять ориентировки в пространстве - тогда любой движок будет нравится.
Изображение
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Коллизии камеры и поворот объектов

Сообщение int 21 сен 2011, 00:29

Ага, вроде разобрался. Спасибо seaman и waruiyume. Посмотрев в примере transform.RotateAround (Vector3(0,0,0), Vector3(1,0,0), 20* Time.deltaTime); я думал что Vector3(0,0,0) указывает на центр объекта, а он вообще непонятно на что указывает, наверно на глобальный центр мира.

Когда изменил точку вращения на координаты родительского контейнера все вроде стало нормально transform.RotateAround (target.position, Vector3(1,0,0), 20* Time.deltaTime);
Хотя привязав угол к мыши исчезла плавность, ну с этим уже как-нибудь буду бороться сам.
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение int 22 сен 2011, 02:09

Головная боль с поворотом продолжается. Поворот по У при помощи Input.GetAxis("Mouse Y") не очень корректный, особенно если мышь выходит за границы экрана.

Решил сделать через луч.

Синтаксис:
Используется javascript
function Update(){

var ray: Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var hit : RaycastHit;

if(Physics.Raycast (ray.origin,ray.direction, hit, 1000)){
     Debug.DrawLine (target.transform.position,hit.point);
     target.transform.LookAt(hit.point);
  }
}


Все работало хорошо, скрипт вешал на контейнер с цилидром и вращение было правильным, вокруг нужной точки. Но вот когда я вложил этот контейнер в нужный мне родительский объект -все начало косячить - деформируется объект. Подозреваю, что это из-за несоответсвия глобальных и локальных координат. Только как их преобразовать не знаю.. Методы вроде бы нашел: transform.TransformDirection и transform.TransformPoint но примень пока правильно не смог, может и не в этом причина?
Последний раз редактировалось int 23 сен 2011, 16:10, всего редактировалось 1 раз.
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение int 23 сен 2011, 16:09

АП, наверное предыдущее сообщение никто не читал.
int
UNец
 
Сообщения: 11
Зарегистрирован: 20 сен 2011, 17:18

Re: Коллизии камеры и поворот объектов

Сообщение Zaicheg 23 сен 2011, 16:28

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

След.

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

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

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