Что в этом скрипте не так?
| |
Artemoid | Дата: Воскресенье, 24 Мая 2015, 20:23 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Привет всем! Делаю игру про космос, а точнее её управление, покачто. Надо так: повернул камеру, космический корабль медленно довернул до поворота камеры. Прицепил я на пустой обьект камеру(координаты пустого обьекта такие же как у модельки корабля) и сделал обычный скрипт поворота мышью. На корабль нацепил вот(покачто только для оси Y для начала) :
Код public class RotShip : MonoBehaviour { public GameObject GameObject1; public GameObject Ship; public float RotSpeed = 1.0f; // Use this for initialization void Awake () { }
// Update is called once per frame void Update () { //RotSpeed *= Time.deltaTime; if (GameObject1.transform.rotation.y > Ship.transform.rotation.y) { transform.Rotate(0,RotSpeed,0); } } }
Всё вроде бы хорошо, но когда доходит корабль до 180 градусного поврота, то отказывается поворачиваться. Что в этом скрипте не так?
|
|
| |
MANMANA | Дата: Воскресенье, 24 Мая 2015, 22:03 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| if (GameObject1.transform.rotation.y > Ship.transform.rotation.y) { transform.rotation хранит координаты в кватернионе
if (GameObject1.transform.localEulerAngles.y > Ship.transform.localEulerAngles.y) {
но тут стоит учитывать, что после 360 градусов идет 0. Часто возникает такая ситуация, что у пустого объекта может быть угол в 10 градусов, а у корабля - в 350 градусов, и здесь не всегда подходит сравнение "если 350 > 10"... Однако учитывая, что у вас поворот идет в одну сторону, то это не важно
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
Artemoid | Дата: Вторник, 26 Мая 2015, 22:08 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Цитата MANMANA ( ) О Понял как это сделать, но опять проблема: корабль при повороте дёргается(поворот уже по двум осям). Судя по всему просто выполняется поворот по двум осям по очереди...как это сгладить? Скрипт: Код void FixedUpdate () { razY = GameObject1.transform.localEulerAngles.y - Ship.transform.localEulerAngles.y; razX = GameObject1.transform.localEulerAngles.x - Ship.transform.localEulerAngles.x;
float x = 0; float y = 0;
//Ось Y if (razY > 1) { if (razY > 180) { y = -RotSpeedY; } else if (razY < 180) { y = RotSpeedY; } } if (razY < -1) { if (razY < -180) { y = RotSpeedY; } else if (razY > -180) { y = -RotSpeedY; } }
//Ось X if (razX > 1) { if (razX > 180) { x = -RotSpeedX; } else if (razX < 180) { x = RotSpeedX; } }
if (razX < -1) { if (razX < -180) { x = RotSpeedX; } else if (razX > -180) { x = -RotSpeedX; } }
transform.Rotate (x, y, 0); }
|
|
| |
Valter | Дата: Вторник, 26 Мая 2015, 22:46 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Проблема в том, что Вы не хотите работать с кватернионом, как с цельным объектом, а пытаетесь менять отдельно x,y через эйлеровы углы. Повести вот это на свой объект:
Код void Update () { Vector3 cur_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector3 rel_pos = cur_pos - transform.position; transform.rotation = Quaternion.LookRotation(new Vector3(rel_pos.x, rel_pos.y, transform.position.z)); }
|
|
| |
Artemoid | Дата: Среда, 27 Мая 2015, 16:58 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Цитата Valter ( ) Повести вот это на свой объект: Я в принцепе понимаю что там, но у меня работает не понятно как и я не понимаю почему.. Цитата Valter ( ) Вы не хотите работать с кватернионом Да, не хочу ибо не нашёл нормального обьяснения нигде. На той же офф.документации обьяснено в качестве какой-то штуки, которая связана с углами и основанна она на высшей математике..Добавлено (27 мая 2015, 16:58) ---------------------------------------------
Цитата Artemoid ( ) Да, не хочу Сделал Ship.transform.rotation = Quaternion.Slerp (Ship.transform.rotation, GameObject1.transform.rotation,Time.deltaTime * RotSpeed ); Как теперь сделать разную скорость поворота по разным осям?
|
|
| |
Ranger | Дата: Среда, 27 Мая 2015, 17:12 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| разложить на углы эйлера и слерпить к ним с разной скоростью
Сообщение отредактировал Ranger - Среда, 27 Мая 2015, 17:27 |
|
| |
Artemoid | Дата: Четверг, 28 Мая 2015, 20:06 | Сообщение # 7 |
частый гость
Сейчас нет на сайте
| Цитата Ranger ( ) разложить на углы эйлера и слерпить к ним с разной скоростью Напишите ,пожалуйста, пробовал по разному и не понимаю как :/
|
|
| |
Ranger | Дата: Четверг, 28 Мая 2015, 20:38 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Набирал код в блокноте. Могут быть ошибки. Но идея, думаю, понятна.
Код { Quaternion sx,sy,sz; sx = Quaternion.Euler(transform.rotation.euler.x,0,0); sy = Quaternion.Euler(0,transform.rotation.euler.y,0); sz = Quaternion.Euler(0,0,transform.rotation.euler.z); Quaternion tx,ty,tz; tx = Quaternion.Euler(target.transform.rotation.euler.x,0,0); ty = Quaternion.Euler(0,target.transform.rotation.euler.y,0); tz = Quaternion.Euler(0,0,target.transform.rotation.euler.z); transform.rotation = Quaternion.Slerp(sx,tx,Time.deltatime*Vx)*Quaternion.Slerp(sy,ty,Time.deltatime*Vy)*Quaternion.Slerp(sz,tz,Time.deltatime*Vz); } Есть вероятность нахватить Замок Эйлера. Нужно пробовать, если возникнет проблема, тогда брать относительный поворот Quaternion.FromToRotation и раскладывать его. вращать этим Quaternion.RotateTowards. float maxDegreesDelta считать от угловых скоростей.
Сообщение отредактировал Ranger - Четверг, 28 Мая 2015, 20:46 |
|
| |
|