Пятница, 22 Ноября 2024, 08:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Ограничение отклонения углом
GopaДата: Пятница, 15 Января 2016, 18:57 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет. Ситуация такая: есть шар, у него есть парент. На шарике висит скрипт у которого в update задействована функция lookat. Вопрос: как ограничить отклонение forward шарика от forward парента 30ю градусами, при этом выходя за границу в 30 градусов шар продолжал тянуться к цели но не пересекал ее (ну как глаз работает, то же самое).
allodsДата: Пятница, 15 Января 2016, 23:08 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Mathf.Clamp вам поможет в блокировке
Mathf.DeltaAngle найдет разницу между углами

Дальше просто
GopaДата: Суббота, 16 Января 2016, 01:55 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата allods ()
Mathf.Clamp вам поможет в блокировке

я честно не представляю что именно можно в данной ситуации заблокировать.. если через transform.localEulerAngles работать, то блокировка будет происходить по квадрату, если же напичкать этот способ до кучи условиями (что я в самом начале сделал) то получается громоздкий некрасивый код, работающий при том через пень колоду! А если вы имеете ввиду угол между векторами, то я не знаю как его можно контралировать (а это было бы решением проблемы).
Меня уже трясет всего, задача то элементарнейшая!! Глаз должен следовать за целью, и уператься в границу, но по прежнему тянуться к цели (т.е. если цель вне поля его видимости он все равно пытается взглянуть на цель, но не должен отклониться своим поворотом больше чем на 30 градусов от основной оси)
Цитата allods ()
Mathf.DeltaAngle найдет разницу между углами

я не понимаю между какими углами и боюсь что вы не поняли суть моей проблемы, если вы имели ввиду отклонение одного вектора от другого, то в моем коде угол между векторами я нахожу так:
Код
using UnityEngine;
using System.Collections;

public class myeyelookat : MonoBehaviour {
    
    public Transform target;
    public Transform otheros;

    void Update () {
  if (target) {
   transform.LookAt (target);
   if (Vector3.Angle (otheros.transform.forward, transform.forward)>30) {
    /*
                    как-то блокируем дальнейший наклон
                    */
   }
  }
    }
}

вообщем мне нужно узнать как мы это делаем)
allods, спасибо за отклик
KamiRoninДата: Суббота, 16 Января 2016, 09:34 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
попробуй так:
Код

void Update () {
      if (target) {
           if (Mathf.Abs(Vector3.Angle (otheros.transform.forward, transform.forward)) < 30)
                  transform.LookAt (target);
}


как только сдвинется любой форвард и уменьшится угол - сработает LookAt.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
GopaДата: Суббота, 16 Января 2016, 16:33 | Сообщение # 5
был не раз
Сейчас нет на сайте
KamiRonin, спасибо за отклик.
Цитата KamiRonin ()
как только сдвинется любой форвард и уменьшится угол - сработает LookAt.

Но проблема в том, что форварды мы двигаем этой самой функцией lookat)
да и если глаз доходит до границы, он не должен останавливаться, как вкопанный, а нужно что бы он пытался взглянуть на цель, но не преодолевая границы.
KamiRoninДата: Суббота, 16 Января 2016, 23:59 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата Gopa ()
Но проблема в том, что форварды мы двигаем этой самой функцией lookat)

пока между форвардами угол в пределах допустимого - лукэт движется за таргетом. изменился таргет - произойдет лукэт, изменится форвард.
как только угол превысил предел - то "пытаться взглянуть на цель НО НЕ преодолевая границы" - это значит вылезти из глазниц?? ))
потому что если таргет выходит за границу видимости когда глаз его отслеживал - то за направлением взгляда начинает двигаться голова "сохраняя максимальный угол поворота глаза". а за головой - туловище (еще один предельный угол для головы).

я просто ОЧЕНЬ НАДЕЯЛСЯ что догадаешься обрабатывать else по углу:
Код

void Update () {
      if (target) {
           if (Mathf.Abs(Vector3.Angle (otheros.transform.forward, transform.forward)) < 30)
                  transform.LookAt (target);
           else{ // << ВОТ ТУТ
                 // тут поворачиваем голову вслед за взором на таргет
                 // или проверяем угол между форвардом головы и направлением на таргет и делаем что-то исходя из этого
                 // и тп.    
           }
}

Более того - LookAt мгновенно выставляет направление, а для любого глаза - это неестественно. Тут нужен плавный поворот. поэтому одним люкэтом не обойтись! А когда будет плавный поворот - то его код будет практически одинаковый и для головы.


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


Сообщение отредактировал KamiRonin - Воскресенье, 17 Января 2016, 00:01
berilДата: Воскресенье, 17 Января 2016, 03:24 | Сообщение # 7
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
А не проще условие наоборот сделать ?

Код
if (Vector3.Angle (otheros.transform.forward, transform.forward)<30) {
                  transform.LookAt (target);
}




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
GopaДата: Понедельник, 18 Января 2016, 23:39 | Сообщение # 8
был не раз
Сейчас нет на сайте
Ребята, всем спасибо, что отозвались. Пожалуй, что бы не морочить никому голову лишними задачами, сконцентрируемся, как можно заблокировать дальнейшее отклонение от основной оси. А что бы было понятней, что именно мне нужно, приведу рисунок, как должно это работать (вид спереди глаза, объект на 1й перед глазом, на последующих сбоку, не попадая в поле зрения.)
http://s1.uploadpics.ru/images/ZJkpMDFFhg.png

Добавлено (18 января 2016, 23:39)
---------------------------------------------
В общем, за не имением времени и лучших идей, вернулся к начальному варианту, немного отредактировав и оптимизировав код.
Сам код выставляю для критики и предложений.
Код
using UnityEngine;
using System.Collections;

public class myeyelookat : MonoBehaviour {
    
    public Transform target;
    public Transform otheros;

    void Update () {
  if (target) {
   transform.LookAt (target);
   if (Vector3.Angle (otheros.transform.forward, transform.forward)>30) {
    Vector3 myeuler = transform.localEulerAngles;
    myeuler.z = 0f;
    bool minus_x = false;
    bool minus_y = false;
    if (myeuler.x>180){
     myeuler.x = myeuler.x - 360;
     minus_x = true;
    }
    if (myeuler.y>180){
     myeuler.y = myeuler.y - 360;
     minus_y = true;
    }
    myeuler.x = Mathf.Sqrt (900f / (1+(myeuler.y*myeuler.y)/(myeuler.x*myeuler.x)));
    myeuler.y = Mathf.Sqrt (900 - myeuler.x*myeuler.x);
    if (minus_x){
     myeuler.x = -myeuler.x;
    }
    if (minus_y){
     myeuler.y = -myeuler.y;
    }
    transform.localEulerAngles = myeuler;
   }
  }
    }
}

Всем спасибо за оказанную инициативу!


Сообщение отредактировал Gopa - Понедельник, 18 Января 2016, 23:42
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг