Перемещение камеры - Форум Игроделов
Пн, 20 Май 2024, 03:18 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Игроделов » UNITY3D » HELP & FAQ » Перемещение камеры (C#)
Перемещение камеры
korveenДата: Чт, 29 Май 2014, 15:44 | Сообщение # 1
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
Доброго времени суток!
Как реализовать плавное перемещение камеры в случайные точки (к примеру от -5 до 5(x) и -5 до 10(у) координатам)
Это мне надо для реализации дыхания при прицеливании


 
СообщениеДоброго времени суток!
Как реализовать плавное перемещение камеры в случайные точки (к примеру от -5 до 5(x) и -5 до 10(у) координатам)
Это мне надо для реализации дыхания при прицеливании

Автор - korveen
Дата добавления - 29 Май 2014 в 15:44
NapalmRainДата: Чт, 29 Май 2014, 15:53 | Сообщение # 2
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
korveen, Vector3.Lerp
Насчёт дыхания не знаю. Но у меня в сцене меню реализовано плавное перемещение камеры именно с помощью Lerp
Случайные точки можно получить через к примеру
Код
int tempX = Random.Range(5);

За правильность написания не ручаюсь пишу из головы, могу пару буковок перепутать, но суть, думаю, понятна.


Сообщение отредактировал NapalmRain - Чт, 29 Май 2014, 16:17
 
Сообщениеkorveen, Vector3.Lerp
Насчёт дыхания не знаю. Но у меня в сцене меню реализовано плавное перемещение камеры именно с помощью Lerp
Случайные точки можно получить через к примеру
Код
int tempX = Random.Range(5);

За правильность написания не ручаюсь пишу из головы, могу пару буковок перепутать, но суть, думаю, понятна.

Автор - NapalmRain
Дата добавления - 29 Май 2014 в 15:53
korveenДата: Чт, 29 Май 2014, 16:11 | Сообщение # 3
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
NapalmRain, о, видел здесь твой скрипт.. Ну я делаю на подобии дыхания)) чтобы камера случайно перемещалась, демаю сработает

 
СообщениеNapalmRain, о, видел здесь твой скрипт.. Ну я делаю на подобии дыхания)) чтобы камера случайно перемещалась, демаю сработает

Автор - korveen
Дата добавления - 29 Май 2014 в 16:11
NapalmRainДата: Чт, 29 Май 2014, 16:27 | Сообщение # 4
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Цитата korveen ()
о, видел здесь твой скрипт.

Ну то, что я писал тогда, мягко говоря, не самая лучшая реализация, а результат я не выкладывал.
Но если я не ошибаюсь, выглядеть это должно примерно так:
Код
void Update() {
     camera.transform.position = Vector3.Lerp(camera.transform.position, new Vector3(tempX, tempY, tempZ), 0.5f*Time.Deltatime);
}

tempX, tempY и tempZ в свою очередь получать раз в 1-2 секунды методом рандома.
 
Сообщение
Цитата korveen ()
о, видел здесь твой скрипт.

Ну то, что я писал тогда, мягко говоря, не самая лучшая реализация, а результат я не выкладывал.
Но если я не ошибаюсь, выглядеть это должно примерно так:
Код
void Update() {
     camera.transform.position = Vector3.Lerp(camera.transform.position, new Vector3(tempX, tempY, tempZ), 0.5f*Time.Deltatime);
}

tempX, tempY и tempZ в свою очередь получать раз в 1-2 секунды методом рандома.

Автор - NapalmRain
Дата добавления - 29 Май 2014 в 16:27
korveenДата: Чт, 29 Май 2014, 16:39 | Сообщение # 5
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
ну да, что-то типо того.
Только я написал ошибку в теме)) я не про перемещение камеры хотел спросить. а про перемещение объекта. ну я думаю нужно просто заменить камеру на объект)

Добавлено (29 Май 2014, 16:39)
---------------------------------------------
замена камеры на объект не помогает(

И возможно нужно использовать Quaternion, т.к. Vector3 мгновенно переносит


 
Сообщениену да, что-то типо того.
Только я написал ошибку в теме)) я не про перемещение камеры хотел спросить. а про перемещение объекта. ну я думаю нужно просто заменить камеру на объект)

Добавлено (29 Май 2014, 16:39)
---------------------------------------------
замена камеры на объект не помогает(

И возможно нужно использовать Quaternion, т.к. Vector3 мгновенно переносит


Автор - korveen
Дата добавления - 29 Май 2014 в 16:39
NapalmRainДата: Чт, 29 Май 2014, 16:41 | Сообщение # 6
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Цитата korveen ()
И возможно нужно использовать Quaternion, т.к. Vector3 мгновенно переносит

Отвечу через пару часов, когда буду рядом с Unity. Точно сейчас не помню.
 
Сообщение
Цитата korveen ()
И возможно нужно использовать Quaternion, т.к. Vector3 мгновенно переносит

Отвечу через пару часов, когда буду рядом с Unity. Точно сейчас не помню.

Автор - NapalmRain
Дата добавления - 29 Май 2014 в 16:41
korveenДата: Чт, 29 Май 2014, 16:50 | Сообщение # 7
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
также появилась проблема, что объект\камера будет постоянно отдалятся от первой точки(от 0 точки), вот теперь задумал.. мб сделать симуляцию дыхания через несколько анимаций и рандомно их проигрывать?(симуляция дыхания в снайперской винтовке)

Посоветуйте как бы реализовать удобнее.. или этот способ добить или с анимациями делать.


 
Сообщениетакже появилась проблема, что объект\камера будет постоянно отдалятся от первой точки(от 0 точки), вот теперь задумал.. мб сделать симуляцию дыхания через несколько анимаций и рандомно их проигрывать?(симуляция дыхания в снайперской винтовке)

Посоветуйте как бы реализовать удобнее.. или этот способ добить или с анимациями делать.

Автор - korveen
Дата добавления - 29 Май 2014 в 16:50
NapalmRainДата: Чт, 29 Май 2014, 16:55 | Сообщение # 8
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Мне кажется, что это дело вкуса... Но через анимацию было бы более производительнее...
 
СообщениеМне кажется, что это дело вкуса... Но через анимацию было бы более производительнее...

Автор - NapalmRain
Дата добавления - 29 Май 2014 в 16:55
ЛевшаДата: Чт, 29 Май 2014, 18:38 | Сообщение # 9
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
1. Рандомить случайную точку на окружности.
2. Лерпить к ней позицию или направление камеры.
3. Рандомить время смены точки.

Смотрим методы:
Random.insideUnitCircle
Random.Range
Vector3.Lerp


X.cor.R (Prologue)
 
Сообщение1. Рандомить случайную точку на окружности.
2. Лерпить к ней позицию или направление камеры.
3. Рандомить время смены точки.

Смотрим методы:
Random.insideUnitCircle
Random.Range
Vector3.Lerp

Автор - Левша
Дата добавления - 29 Май 2014 в 18:38
korveenДата: Чт, 29 Май 2014, 20:14 | Сообщение # 10
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
Левша, спасибо, сейчас почитаю. Возможно будут вопросы.. (да будут они, я уверен)

Добавлено (29 Май 2014, 20:14)
---------------------------------------------
Из примера в документации Unity3d


понял что:
public Vector2 newPosition = Random.insideUnitCircle * 5;
вызывает этот самый круг с радиусом 5 ед. и название newPosition,
А потом теряюсь.. как мне сделать рандомную точку (X,Y) вот newPosition все портит, из-за неё теряюсь потом.

рандом каждые N секунд я сделаю..

curTime += Time.deltaTime;
if(curTime < N)
{
Vector2.... ну и та 1 строчка.. как-то так
}

Помогите объяснить пожалуйста..


 
СообщениеЛевша, спасибо, сейчас почитаю. Возможно будут вопросы.. (да будут они, я уверен)

Добавлено (29 Май 2014, 20:14)
---------------------------------------------
Из примера в документации Unity3d


понял что:
public Vector2 newPosition = Random.insideUnitCircle * 5;
вызывает этот самый круг с радиусом 5 ед. и название newPosition,
А потом теряюсь.. как мне сделать рандомную точку (X,Y) вот newPosition все портит, из-за неё теряюсь потом.

рандом каждые N секунд я сделаю..

curTime += Time.deltaTime;
if(curTime < N)
{
Vector2.... ну и та 1 строчка.. как-то так
}

Помогите объяснить пожалуйста..

Автор - korveen
Дата добавления - 29 Май 2014 в 20:14
NapalmRainДата: Чт, 29 Май 2014, 20:43 | Сообщение # 11
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
всё-таки я был прав
вот кусок кода, сравнивает текущую позицию с той, куда надо лететь и если не равно, то летим.

Код
if ((this.transform.position.x != xPos)||(this.transform.position.y != yPos)||(this.transform.position.z != zPos)){
    this.transform.position = Vector3.Lerp(this.transform.position,new Vector3(xPos,yPos,zPos), Time.deltaTime);
     
   }
   if ((this.transform.rotation.x != xRot)||(this.transform.rotation.y != yRot)||(this.transform.rotation.z != zRot)){
    this.transform.rotation = Quaternion.Lerp(this.transform.rotation, Quaternion.Euler(xRot, yRot, zRot), Time.deltaTime);
   }
 
Сообщениевсё-таки я был прав
вот кусок кода, сравнивает текущую позицию с той, куда надо лететь и если не равно, то летим.

Код
if ((this.transform.position.x != xPos)||(this.transform.position.y != yPos)||(this.transform.position.z != zPos)){
    this.transform.position = Vector3.Lerp(this.transform.position,new Vector3(xPos,yPos,zPos), Time.deltaTime);
     
   }
   if ((this.transform.rotation.x != xRot)||(this.transform.rotation.y != yRot)||(this.transform.rotation.z != zRot)){
    this.transform.rotation = Quaternion.Lerp(this.transform.rotation, Quaternion.Euler(xRot, yRot, zRot), Time.deltaTime);
   }

Автор - NapalmRain
Дата добавления - 29 Май 2014 в 20:43
korveenДата: Чт, 29 Май 2014, 22:46 | Сообщение # 12
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
блиин.. уже чуть больше часа думаю, но не выходит код написать( ошибки всякие.. не понимаю o_o*
NapalmRain, у меня без координаты Z, значит походу либо z=0, либо Vector2 использовать, так?


 
Сообщениеблиин.. уже чуть больше часа думаю, но не выходит код написать( ошибки всякие.. не понимаю o_o*
NapalmRain, у меня без координаты Z, значит походу либо z=0, либо Vector2 использовать, так?

Автор - korveen
Дата добавления - 29 Май 2014 в 22:46
NapalmRainДата: Пт, 30 Май 2014, 07:31 | Сообщение # 13
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
korveen, если перемещение в трёхмерном пространстве, тогда координату z просто нужно оставить такой, какая она есть, но использовать всё равно вектор3.
Код
this.transform.position = Vector3.Lerp(this.transform.position,new Vector3(xPos,yPos,this.transform.position.z), Time.deltaTime);

Добавлено (30 Май 2014, 07:31)
---------------------------------------------

Цитата korveen ()
рандом каждые N секунд я сделаю..

curTime += Time.deltaTime;
if(curTime < N)
{
Vector2.... ну и та 1 строчка.. как-то так
}

Помогите объяснить пожалуйста..

В Update ты каждый кадр сравниваешь текущую позицию с той, которую нужно получить.
А создаёшь новую позицию не каждый кадр, а с неким интервалом.
Допустим, есть переменная float Timer и переменная int needTime
тогда
в update
Код
Timer += Time.Deltatime;
if (Timer>needTime) { // проверяем прошло ли столько времени, сколько нужно для нового присваивания значений.
     Timer = 0;
     needTime = Random.range(1,2); // получаем одну или две секунды
     /* и здесь получаем новые координаты любым удобным способом*/
}
// а далее
if (transform.position != newPosition) { // где newPosition - это Vectro3 с новыми координатами
     // Lepr в новую позицию
}

Этот код не стоит принимать за чистую монету, так как я его писал прямо тут без отладчиков и компиляторов, могут быть ошибки.
 
Сообщениеkorveen, если перемещение в трёхмерном пространстве, тогда координату z просто нужно оставить такой, какая она есть, но использовать всё равно вектор3.
Код
this.transform.position = Vector3.Lerp(this.transform.position,new Vector3(xPos,yPos,this.transform.position.z), Time.deltaTime);

Добавлено (30 Май 2014, 07:31)
---------------------------------------------

Цитата korveen ()
рандом каждые N секунд я сделаю..

curTime += Time.deltaTime;
if(curTime < N)
{
Vector2.... ну и та 1 строчка.. как-то так
}

Помогите объяснить пожалуйста..

В Update ты каждый кадр сравниваешь текущую позицию с той, которую нужно получить.
А создаёшь новую позицию не каждый кадр, а с неким интервалом.
Допустим, есть переменная float Timer и переменная int needTime
тогда
в update
Код
Timer += Time.Deltatime;
if (Timer>needTime) { // проверяем прошло ли столько времени, сколько нужно для нового присваивания значений.
     Timer = 0;
     needTime = Random.range(1,2); // получаем одну или две секунды
     /* и здесь получаем новые координаты любым удобным способом*/
}
// а далее
if (transform.position != newPosition) { // где newPosition - это Vectro3 с новыми координатами
     // Lepr в новую позицию
}

Этот код не стоит принимать за чистую монету, так как я его писал прямо тут без отладчиков и компиляторов, могут быть ошибки.

Автор - NapalmRain
Дата добавления - 30 Май 2014 в 07:31
ЛевшаДата: Пт, 30 Май 2014, 07:38 | Сообщение # 14
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Эх, эхех, smile
Примерно так:

Код

var moveSpeed : float = 1f;
var changeTime : float = 1f;
var randomLimit : float = 0.25f;
private var tempPos : Vector2;
private var newPos : Vector3;
private var randomTime : float;
private var changeOrder : boolean = true;

function Update () {
      if (changeOrder) {  changeOrder = false;  ChangePosition();  }
          transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * moveSpeed);
}
function ChangePosition () {
          tempPos = Random.insideUnitCircle * 5;   
          newPos = new Vector3(tempPos.x, tempPos.y, transform.position.z);
          randomTime = Random.Range(-randomLimit, randomLimit);
          yield WaitForSeconds(changeTime + randomTime);
          changeOrder = true;
}


X.cor.R (Prologue)
 
СообщениеЭх, эхех, smile
Примерно так:

Код

var moveSpeed : float = 1f;
var changeTime : float = 1f;
var randomLimit : float = 0.25f;
private var tempPos : Vector2;
private var newPos : Vector3;
private var randomTime : float;
private var changeOrder : boolean = true;

function Update () {
      if (changeOrder) {  changeOrder = false;  ChangePosition();  }
          transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * moveSpeed);
}
function ChangePosition () {
          tempPos = Random.insideUnitCircle * 5;   
          newPos = new Vector3(tempPos.x, tempPos.y, transform.position.z);
          randomTime = Random.Range(-randomLimit, randomLimit);
          yield WaitForSeconds(changeTime + randomTime);
          changeOrder = true;
}

Автор - Левша
Дата добавления - 30 Май 2014 в 07:38
korveenДата: Пт, 30 Май 2014, 08:20 | Сообщение # 15
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
перевел сам на C# НО, скрипт работает совсем не так, если на Java запустить..

Где ошибся с переводом?

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




Сообщение отредактировал korveen - Пт, 30 Май 2014, 08:44
 
Сообщениеперевел сам на C# НО, скрипт работает совсем не так, если на Java запустить..

Где ошибся с переводом?

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

Автор - korveen
Дата добавления - 30 Май 2014 в 08:20
ЛевшаДата: Пт, 30 Май 2014, 11:32 | Сообщение # 16
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата korveen ()
Где ошибся с переводом на C# ?

Хрен его знает... там могут быть проблемы с присвоением конструкции transform.position.z.
И yield как то через зад работает...

Цитата korveen ()
скрипт использует глобальную систему координат, у мня предмет-то связан с камерой..

так а в чем проблема, переведи в локальные координаты.
smile


X.cor.R (Prologue)
 
Сообщение
Цитата korveen ()
Где ошибся с переводом на C# ?

Хрен его знает... там могут быть проблемы с присвоением конструкции transform.position.z.
И yield как то через зад работает...

Цитата korveen ()
скрипт использует глобальную систему координат, у мня предмет-то связан с камерой..

так а в чем проблема, переведи в локальные координаты.
smile

Автор - Левша
Дата добавления - 30 Май 2014 в 11:32
seamanДата: Пт, 30 Май 2014, 13:33 | Сообщение # 17
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Корутины в шарпе вызываются не так
 
СообщениеКорутины в шарпе вызываются не так

Автор - seaman
Дата добавления - 30 Май 2014 в 13:33
korveenДата: Пт, 30 Май 2014, 16:35 | Сообщение # 18
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
На локальные координаты изменил.. но вот как перевести в C#? можете помочь? где ошибка?

 
СообщениеНа локальные координаты изменил.. но вот как перевести в C#? можете помочь? где ошибка?

Автор - korveen
Дата добавления - 30 Май 2014 в 16:35
NapalmRainДата: Пт, 30 Май 2014, 17:06 | Сообщение # 19
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
korveen, не буду врать насчёт перевода, не люблю я это дело, но чем не устраивает мой вариант? Даю 110% гарантии в его работоспособности.
Разве что самому немного подумать придётся, но это же проблема?
 
Сообщениеkorveen, не буду врать насчёт перевода, не люблю я это дело, но чем не устраивает мой вариант? Даю 110% гарантии в его работоспособности.
Разве что самому немного подумать придётся, но это же проблема?

Автор - NapalmRain
Дата добавления - 30 Май 2014 в 17:06
korveenДата: Пт, 30 Май 2014, 17:50 | Сообщение # 20
Победитель конкурса GCC
 
Сообщений: 183
Награды: 2
Репутация: 45
Статус: Offline
NapalmRain, в твоем коде я понял половину пока что)) я взял его на заметку.. но пока пусть лучше будет на JavaScript.. возможно удастся перевести, код мне в СИ более понятный.. только я делаю ошибки в переводе только и всего.

 
СообщениеNapalmRain, в твоем коде я понял половину пока что)) я взял его на заметку.. но пока пусть лучше будет на JavaScript.. возможно удастся перевести, код мне в СИ более понятный.. только я делаю ошибки в переводе только и всего.

Автор - korveen
Дата добавления - 30 Май 2014 в 17:50
Форум Игроделов » UNITY3D » HELP & FAQ » Перемещение камеры (C#)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024