| 
	
		
		
			| Что в этом скрипте не так? |  |  |  | 
| 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 |  |  |  |  |  
 |