Как вращать второй объект используя вращение первого

Программирование на Юнити.

Как вращать второй объект используя вращение первого

Сообщение TheRabbit 23 янв 2012, 03:02

Добрый день!

Пришел к русским умам т.к. американские давали слишком глупые советы.

И так, изучаю юнити. Решил сделать руль, который можно вращать бесконечно методом в стиле drag & drop.

Выглядит таком образом. У меня есть штурвал
Изображение

Вращаю я его на 360 (от 0 до 360), он крутится.

Дальше, у меня есть куб - мне надо передавать ему значение вращения штурвала, но деленное на 2 к примеру. Число деления должно быть переменной.

Америкосы мне советуют в ЛС на сайте такую штуку:

Синтаксис:
Используется javascript
wheel_roation_angle = transform.eulerAngles.z / 2;


Но я то понимаю, что это бред. Выходит, что мой штурвал проверулся на 360 градусов, я считал ровно половину - т.е. 180 градусов. Как только штурвал проходит 360 - снова начинаем с 0 и так до бесконечности.
Так же и отнесенный к нему объект вращается от 0 до 180. А мне надо, чтоб я сделал 2 полных вращения к примеру - объект провернулся на 1.

Банальный подсчет количества вращений не предлагайте, не то.

В итоге имеем такой код сейчас, где objectB второй объект нуждающийся в "деленном" повороте.
Синтаксис:
Используется javascript
transform.rotation = Quaternion.Euler(0,180,  targetAngle);
        wheel_roation_angle= transform.eulerAngles.z;
        objectB.transform.rotation = Quaternion.Euler ( 0, wheel_roation_angle, 0 );


Весь поворот происходит в function OnMouseDrag, т.е. не в постоянном Update и соотв. как-то надо решить без Time.deltaTime эту задачу :)

Я уже чувствую тупым себя. На ActionScript для флеша я такое делал когда-то за 10 минут. Но там другая математика - не надо заморачиваться с дибильными углами Еулера.
По-этому перенеси сюда логику невозможно.

Моя задача из вот этой строки wheel_roation_angle= transform.eulerAngles.z; сделать что-то, что поможет решить вопрос, что же передавать сюда objectB.transform.rotation = Quaternion.Euler ( 0, wheel_roation_angle, 0 );

помогите кто чем может пожалуйста )
TheRabbit
UNец
 
Сообщения: 10
Зарегистрирован: 17 сен 2011, 17:42
Откуда: 50\50 Харьков-Москва

Re: Как вращать второй объект используя вращение первого

Сообщение Golandez 23 янв 2012, 03:15

Синтаксис:
Используется csharp
Vector3 startRotate;
Vector3 thisTimeRotate;

void Start()
{
 startRotate= transform.eulerAngles;
}

void Update()
{
 thisTimeRotate=transform.eulerAngles;
 var cubeDeltaRotate=(thisTimeRotate.z-startRotate.z)/2;
}
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Как вращать второй объект используя вращение первого

Сообщение TheRabbit 23 янв 2012, 03:37

Доходит до 180 и снова в 0 =(

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

Как ни крути сбрасывает. Мне интересно как можно крутить не на 0-360, а к примеру на 0-в бесконечность? почему в редакторе 2 оборота отображает как 720 градусов, а углы еулера как 360 все равно ?
TheRabbit
UNец
 
Сообщения: 10
Зарегистрирован: 17 сен 2011, 17:42
Откуда: 50\50 Харьков-Москва

Re: Как вращать второй объект используя вращение первого

Сообщение Battle Angel Alita 23 янв 2012, 04:10

А как насчёт поступить наоборот - "вращать первый объект используя вращение второго". В единичном случае думаю будет норм.
Если вращать надо много чего и с разными передаточными отношениями, то лучше будет использовать инкрементальное вращение.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Как вращать второй объект используя вращение первого

Сообщение Perf 23 янв 2012, 07:50

Может быть так:
Синтаксис:
Используется csharp
objectB.transform.RotateAroundLocal( new Vector3( 0,0,1), wheel_roation_angle );
 

Только wheel_roation_angle надо считать в виде приращения от последнего OnMouseDrag
Perf
UNец
 
Сообщения: 39
Зарегистрирован: 22 июл 2011, 13:05

Re: Как вращать второй объект используя вращение первого

Сообщение TheRabbit 23 янв 2012, 13:01

Battle Angel Alita писал(а):А как насчёт поступить наоборот - "вращать первый объект используя вращение второго". В единичном случае думаю будет норм.
Если вращать надо много чего и с разными передаточными отношениями, то лучше будет использовать инкрементальное вращение.

Дело в том, что у меня в нижнем левом экране "руль" этот, вращая который - у меня вращается основой объект. Скажем это у меня корабль будет. И вращать корабль для вращения руля как-то не правильно :) Корабль (куб) я не буду видеть целиком. Он громадный :)

Perf писал(а):objectB.transform.RotateAroundLocal( new Vector3( 0,0,1), wheel_roation_angle );

Спасибо, сейчас буду смотреть.

Я на самом деле не такой тупой. Просто я дико удивлен крайне нелепому подходу у Unity к системе исчисления. Я когда-то под OpenGL писал на C++, DirectX. Использовал другие движки - там это делалось очень просто, т.к. небыло не нужный переменных и функций :)

Посмотрел - не работает. Это заставляет без перестану вращаться вокруг оси :) Я мышку не двигал даже, а оно начинает колбасить его :)
Видимо придется отказаться от полного вращения руля во все стороны =(
TheRabbit
UNец
 
Сообщения: 10
Зарегистрирован: 17 сен 2011, 17:42
Откуда: 50\50 Харьков-Москва

Re: Как вращать второй объект используя вращение первого

Сообщение Perf 23 янв 2012, 13:25

wheel_roation_angle надо считать в виде приращения от последнего OnMouseDrag
Perf
UNец
 
Сообщения: 39
Зарегистрирован: 22 июл 2011, 13:05

Re: Как вращать второй объект используя вращение первого

Сообщение seaman 23 янв 2012, 21:49

1. А это - Quaternion.ToAngleAxis тоже считает от 0 до 360? Проверь. (Мне проверять не хочется :( )
2. Можно самому считать угол > 360. Проверять изменение с предыдущего кадра. И если оно близко к -360 - значит проскочили поворот. Прибавлять 1 к счетчику полных поворотов. Ну а полный поворот считать 360*счетчик + transform.eulerAngles. Хотя это, конечно жуткие костыли.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как вращать второй объект используя вращение первого

Сообщение Battle Angel Alita 23 янв 2012, 22:26

Решение ещё проще - хранить поворот штурвала в прокси-переменной, в которой нет клампа от 0 до 360.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Как вращать второй объект используя вращение первого

Сообщение TheRabbit 24 янв 2012, 00:23

seaman писал(а):1. А это - Quaternion.ToAngleAxis тоже считает от 0 до 360? Проверь. (Мне проверять не хочется :( )
2. Можно самому считать угол > 360. Проверять изменение с предыдущего кадра. И если оно близко к -360 - значит проскочили поворот. Прибавлять 1 к счетчику полных поворотов. Ну а полный поворот считать 360*счетчик + transform.eulerAngles. Хотя это, конечно жуткие костыли.

надо пробовать будет завтра. Я вообще в юнити не шуруплю )

Battle Angel Alita писал(а):Решение ещё проще - хранить поворот штурвала в прокси-переменной, в которой нет клампа от 0 до 360.

Об этом пожалуйста поподробнее. Как использовать и что это такое? я в юнити толком 0. API понимаю, а вот связать чтоб работало никак.
TheRabbit
UNец
 
Сообщения: 10
Зарегистрирован: 17 сен 2011, 17:42
Откуда: 50\50 Харьков-Москва

Re: Как вращать второй объект используя вращение первого

Сообщение Battle Angel Alita 24 янв 2012, 00:40

TheRabbit
>Об этом пожалуйста поподробнее.
Ну смотри, сейчас ты делаешь что-то вроде shturval.transform.Rotate(0.0f, Input.mousePosition.x, 0.0f); (незнаю как ты делаешь, предположим что так)
Так вот, сначала засовываешь в переменную rot = Input.mousePosition.x, а потом уже пишешь:
shturval.transform.Rotate(0.0f, rot, 0.0f);
korabl.transform.Rotate(0.0f, rot*0.5f, 0.0f);
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Как вращать второй объект используя вращение первого

Сообщение TheRabbit 24 янв 2012, 15:07

Battle Angel Alita писал(а):TheRabbit
>Об этом пожалуйста поподробнее.
Ну смотри, сейчас ты делаешь что-то вроде shturval.transform.Rotate(0.0f, Input.mousePosition.x, 0.0f); (незнаю как ты делаешь, предположим что так)
Так вот, сначала засовываешь в переменную rot = Input.mousePosition.x, а потом уже пишешь:
shturval.transform.Rotate(0.0f, rot, 0.0f);
korabl.transform.Rotate(0.0f, rot*0.5f, 0.0f);



Так у меня OnMouseDrag следит за движением мышки. Даже если просто зажать кнопку и мышку не двигать - функция срабатывает как Update и выходит, что transform.Rotate заставит вращаться без остановки как - только я зажал кнопку мышки и свинул мышку. А если я перестал двигать - оно продолжит считать и будет так, что я мышку остановил, а вращения корабля идет дальше :)
TheRabbit
UNец
 
Сообщения: 10
Зарегистрирован: 17 сен 2011, 17:42
Откуда: 50\50 Харьков-Москва

Re: Как вращать второй объект используя вращение первого

Сообщение Ert Donuell 24 янв 2012, 16:20

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


Вернуться в Скрипты

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

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