Перемещение камеры
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
Код
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Vector2 newPosition = Random.insideUnitCircle * 5; void Example() { transform.position.x = newPosition.x; transform.position.y = newPosition.y; } }
понял что: 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
Код
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Vector2 newPosition = Random.insideUnitCircle * 5; void Example() { transform.position.x = newPosition.x; transform.position.y = newPosition.y; } }
понял что: 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
Эх, эхех, Примерно так: Код
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)
Сообщение Эх, эхех, Примерно так: Код
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 запустить..
Код
using UnityEngine; using System.Collections; public class Breath : MonoBehaviour { public float moveSpeed = 1f; public float changeTime = 1f; public float randomLimit = 0.25f; private Vector2 tempPos; public Vector3 newPos; private float randomTime; private bool changeOrder = true; void Update() { if (changeOrder == true) { changeOrder = false; ChangePosition(); } transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * moveSpeed); } IEnumerator ChangePosition() { tempPos = Random.insideUnitCircle * 5; newPos = new Vector3(tempPos.x, tempPos.y, transform.position.z); randomTime = Random.Range(-randomLimit, randomLimit); yield return new WaitForSeconds(changeTime + randomTime); changeOrder = true; } }
Где ошибся с переводом? И скрипт использует глобальную систему координат, у мня предмет-то связан с камерой..
Сообщение отредактировал korveen - Пт, 30 Май 2014, 08:44
Сообщение перевел сам на C# НО, скрипт работает совсем не так, если на Java запустить..
Код
using UnityEngine; using System.Collections; public class Breath : MonoBehaviour { public float moveSpeed = 1f; public float changeTime = 1f; public float randomLimit = 0.25f; private Vector2 tempPos; public Vector3 newPos; private float randomTime; private bool changeOrder = true; void Update() { if (changeOrder == true) { changeOrder = false; ChangePosition(); } transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * moveSpeed); } IEnumerator ChangePosition() { tempPos = Random.insideUnitCircle * 5; newPos = new Vector3(tempPos.x, tempPos.y, transform.position.z); randomTime = Random.Range(-randomLimit, randomLimit); yield return new WaitForSeconds(changeTime + randomTime); changeOrder = true; } }
Где ошибся с переводом? И скрипт использует глобальную систему координат, у мня предмет-то связан с камерой.. Автор - korveen Дата добавления - 30 Май 2014 в 08:20
Левша Дата: Пт, 30 Май 2014, 11:32 | Сообщение # 16
Черный Волк
Сообщений: 7257
Награды:
30
Репутация:
3313
Статус: Offline
Цитата korveen (
)
Где ошибся с переводом на C# ?
Хрен его знает... там могут быть проблемы с присвоением конструкции transform.position.z . И yield как то через зад работает... Цитата korveen (
)
скрипт использует глобальную систему координат, у мня предмет-то связан с камерой..
так а в чем проблема, переведи в локальные координаты.
X.cor.R (Prologue)
Сообщение Цитата korveen (
)
Где ошибся с переводом на C# ?
Хрен его знает... там могут быть проблемы с присвоением конструкции transform.position.z . И yield как то через зад работает... Цитата korveen (
)
скрипт использует глобальную систему координат, у мня предмет-то связан с камерой..
так а в чем проблема, переведи в локальные координаты. Автор - Левша Дата добавления - 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