Плавный поворот за мышкой, не зависящий от ее скорости.

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

Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение Kvestpro 24 апр 2013, 06:48

Появилась проблема. Мне нужно, чтобы объект крутился в сторону мышки. Это легко реализовать, но мне не нужен мгновенный поворот, мне нужна плавность.
Прочитав много похожих тем, я сделал этот поворот , но он зависит от скорости мышки
(Input.GetAxis("Mouse X") и выглядело это просто ужасно. Поставив такие условия, чтобы (Input.GetAxis("Mouse X")
Был не меньше -1 и не больше 1, но после этого, я увидел, что объект не стремится к центру экрана (как мне надо), а стремится непонятно куда.
Как на C# реализовать плавное вращение объекта по оси x (влево-вправо)?
Плавное - немного не успевает за мышью (центром экрана).
Когда я использовал Input.GetAxis("Mouse X"), то вращение делал через Quaternion.Slerp
Kvestpro
UNIт
 
Сообщения: 63
Зарегистрирован: 13 апр 2013, 19:51
Откуда: Москва
Skype: Kvestpro

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение KorsaiR 24 апр 2013, 06:52

можно transform.rotation = Quaternion.Lerp(transform.rotation, camera.rotation, 0.1f);

но это поворот по всем осям
Мои игры: Sunrise, Fireground, Spacerift
Sunrise: _www.sunsurv.ru , _https://store.steampowered.com/app/6631 ... _survival/
Fireground: _https://store.steampowered.com/app/1026 ... ND/?beta=0
Spacerift: _https://vk.com/spacerift
Аватара пользователя
KorsaiR
Старожил
 
Сообщения: 797
Зарегистрирован: 09 июл 2012, 12:20
Откуда: Новосибирск
Skype: pwiliya

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение Kvestpro 24 апр 2013, 09:49

KorsaiR писал(а):можно transform.rotation = Quaternion.Lerp(transform.rotation, camera.rotation, 0.1f);

но это поворот по всем осям

А как заблокировать по некоторым осям? Нужно стремление к центру экрана.
Kvestpro
UNIт
 
Сообщения: 63
Зарегистрирован: 13 апр 2013, 19:51
Откуда: Москва
Skype: Kvestpro

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение nile 24 апр 2013, 09:56

хм :-?
А не проще использовать
Синтаксис:
Используется csharp
curX = Mathf.Lerp(curX,Input.GetAxis("Mouse X"),Time.deltaTime * dump);

вместо Input.GetAxis("Mouse X")?
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение Kvestpro 24 апр 2013, 10:53

nile писал(а):хм :-?
А не проще использовать
Синтаксис:
Используется csharp
curX = Mathf.Lerp(curX,Input.GetAxis("Mouse X"),Time.deltaTime * dump);

вместо Input.GetAxis("Mouse X")?

А в чем разница?
Туррель (у меня танк) будет поворачиваться лицом к центру экрана?
Kvestpro
UNIт
 
Сообщения: 63
Зарегистрирован: 13 апр 2013, 19:51
Откуда: Москва
Skype: Kvestpro

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение nile 24 апр 2013, 11:16

Вот про туррель танка и надо было написать в первом посте, я то подумал, что у тебя объект напрямую использует input
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение Kvestpro 24 апр 2013, 12:09

nile писал(а):Вот про туррель танка и надо было написать в первом посте, я то подумал, что у тебя объект напрямую использует input

Я думаю, что Slerp вполне подходит и проблема не в нем. Дело в Input.GetAxis("Mouse X"), ведь эта функция возвращает 0, если мышь не двигается, а мне надо, чтобы туррель неуклонно поворачивалась к центру экрана, каждый кадр обновляя этот центр каждый кадр.
Как реализовать это?
Kvestpro
UNIт
 
Сообщения: 63
Зарегистрирован: 13 апр 2013, 19:51
Откуда: Москва
Skype: Kvestpro

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение extravert 24 апр 2013, 13:30

берешь позицию в точке на экране, пускаешь луч, узнаешь позицию в мировой координате и используя этот
Синтаксис:
Используется csharp
var rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping);

код, домысливаешь что и как.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение Kvestpro 24 апр 2013, 14:06

extravert писал(а):берешь позицию в точке на экране, пускаешь луч, узнаешь позицию в мировой координате и используя этот
Синтаксис:
Используется csharp
var rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping);

код, домысливаешь что и как.

Допустим, у меня разрешение экрана 1280x1024 => середина 640x480.
Я пускаю луч, но откуда и куда?? Из какой точки?
Дальше, я понимаю. Нужно пустить луч длиной в ноль и крутить в ту сторону,
Но откуда луч пускать и куда?
Kvestpro
UNIт
 
Сообщения: 63
Зарегистрирован: 13 апр 2013, 19:51
Откуда: Москва
Skype: Kvestpro

Re: Плавный поворот за мышкой, не зависящий от ее скорости.

Сообщение nile 24 апр 2013, 14:16

Синтаксис:
Используется csharp
Ray ray = Camera.main.ScreenPointToRay(new Vector2(Screen.width/2,Screen.height/2)); //луч из центра экрана в 3d пространство, перпендикулярно экрану
RaycastHit hit; //точка касания
if (Physics.Raycast(ray, out hit)) //пускаем луч
           {

//импортируем из стандартных ассетов Scripts и пользуем код из SmoothLookAt от камеры. В качестве target у нас будет hit.point (transform заменить на Vector3)

}
 



А чтобы фиксировать вращиение по одной из осей - достаточно просто погуглить unity3d smooth lookat axis

ПС если точки касания нет, например если смотрим в небо, то в качестве той точки можно использовать одну из точек на этом луче.
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17


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

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

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