Страница 1 из 2

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

СообщениеДобавлено: 20 сен 2011, 17:44
int
Здравствуйте. У меня несколько вопросов, возможно нубских.

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 );

}


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

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

СообщениеДобавлено: 20 сен 2011, 18:32
seaman
Попробуйте перейти по моей подписи - почитать. Может натолкнет на какие-то мысли.

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

СообщениеДобавлено: 20 сен 2011, 19:52
int
спасибо гляну.

а вообще, я что-то сложное спросил или все просто, поэтому никто ответить не хочет? неужели нет функции вращения относительно произвольной точки или относительно координат объекта?

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

СообщениеДобавлено: 20 сен 2011, 20:00
seaman
Сорри. Я второй вопрос даже не заметил.
Читаем документацию.
Quaternion.AngleAxis
Transform-rotation

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

СообщениеДобавлено: 20 сен 2011, 20:07
waruiyume
int писал(а): ...неужели нет функции вращения относительно произвольной точки ...?

Transform.RotateAround

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

СообщениеДобавлено: 20 сен 2011, 20:48
Angel 07
Основной принцип, чтобы камера не пролетала сквозь объекты - это пускать луч от игрока в камеру, и если он на этом пути встречается с каким-либо объектом, то перемещать камеру в точку пересечения. Поможет класс RaycastHit.

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

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

Quaternion.AngleAxis
Transform-rotation

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

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

СообщениеДобавлено: 20 сен 2011, 22:00
seaman
может я задачу описал нечетко.. Берем чупа-чупс и вращаем палочку относительно центра шарика, или дуло танка относительно башни -вто это мне надо.

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

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

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

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


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

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

Изображение

Неужели чтобы сделать простейшее вращение нужно поворачивать родительский объект, а потом относительно него как-то поворачивать потомка? Что-то мне Юнити с каждым днем все меньше и меньше нравится..

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

СообщениеДобавлено: 20 сен 2011, 23:25
burlak
int писал(а):Что-то мне Юнити с каждым днем все меньше и меньше нравится..


Пичаль...


TransformAround работает нормально, не так как на картинке, по крайней мере если правильно геометрию задать.

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

СообщениеДобавлено: 20 сен 2011, 23:40
seaman
Что-то мне Юнити с каждым днем все меньше и меньше нравится.

Нужно просто не терять ориентировки в пространстве - тогда любой движок будет нравится.
Изображение

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

СообщениеДобавлено: 21 сен 2011, 00:29
int
Ага, вроде разобрался. Спасибо 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);
Хотя привязав угол к мыши исчезла плавность, ну с этим уже как-нибудь буду бороться сам.

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

СообщениеДобавлено: 22 сен 2011, 02:09
int
Головная боль с поворотом продолжается. Поворот по У при помощи 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 но примень пока правильно не смог, может и не в этом причина?

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

СообщениеДобавлено: 23 сен 2011, 16:09
int
АП, наверное предыдущее сообщение никто не читал.

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

СообщениеДобавлено: 23 сен 2011, 16:28
Zaicheg
Не рекомендуется апать темы чаще, чем раз в месяц и без веских причин. Устное предупреждение.