 |
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
07.08.2012, 23:19
|
#571
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
делал когда-то сглаживание движения мыши так: есть массив размером 60 элементов, в апдейт удаляю первый элемент, сдвигаю все элементы и в конец записываю дельту мыши. а потом из этого массива нахожу среднюю дельту мыши.
как бы все хорошо, но при разных фпс по разному работает. как можно сделать, чтобы при разных фпс оно одинаково работало?
а еще лучше сглаживать движение и вращение самой камеры. только как найти средний угол из нескольких я не пойму. во всяком случае я замечаю как в играх камера от третьего лица не жество привязана к персонажу.
|
(Offline)
|
|
08.08.2012, 00:25
|
#572
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
имхо мышь никто не сглаживает, самый простой способ - вращать и перемещать вспомогательный объект вместо камеры, а камеру стремить к ориентации и положению этого объекта. Потом просто две строчки:
transform.position = Vector3.Lerp(transform.position, targetTransform.position, positionSpeed * Time.deltatime); transform.rotation= Quaternion.Slerp(transform.rotation, targetTransform.rotation, rotationSpeed * Time.deltatime);
|
(Offline)
|
|
08.08.2012, 13:11
|
#573
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: Вопросы от новичка
Как проверить входит ли объект в камеру или нет? И если возможно еще добавить условие от краев камеры до объекта расстояние должно быть больше 3.
|
(Offline)
|
|
09.08.2012, 22:32
|
#575
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
камере от первого лица легко получилось сделать такое сглаживание. дополнительный обьект там совсем не нужен.
а вот камера от третьего лица начинает дрожать т.к. при интерполяции она сбивается с цели.
можно интерполировать не финкльную трансформацию камеры, а ее углы вокруг цели(angles в MouseOrbit), а вот при интерполяции позии цели почему-то снова дрожания появляются, а хотелось бы и сглаженное движение сделать.
|
(Offline)
|
|
10.08.2012, 14:37
|
#576
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
А пример показать как ты делаешь?
|
(Offline)
|
|
10.08.2012, 15:17
|
#577
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка

using UnityEngine;
using System.Collections;
public class CameraOrbit : MonoBehaviour {
public Transform target;
public Vector3 targetOffset = new Vector3(0, 1.5f, 0);
private Vector3 oldTargetPosition;
public float minAngleX = -20, maxAngleX = 60;
private Vector3 angles;
private const float minDistance = 1.0f;
private float distance;
public float maxDistance = 7.0f;
public Vector3 cameraOffset = new Vector3(1, 0, 0);
void OnEnable() {
if( !target ) return;
angles = transform.eulerAngles;
distance = maxDistance;
}
void LateUpdate () {
if( !target ) return;
angles += GetInputRotation();
angles.x = ClampAngle(angles.x, minAngleX, maxAngleX);
Vector3 targetPosition = target.TransformPoint(targetOffset);
// попытка сгладить движение камеры
//targetPosition = Vector3.Lerp(oldTargetPosition, targetPosition, 15*Time.deltaTime);
//oldTargetPosition = targetPosition;
// сглаживаем вращение камеры
Quaternion rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(angles), 20*Time.deltaTime);
ComputeTransform(targetPosition, rotation, maxDistance, cameraOffset);
distance = CollisionTest(targetPosition, distance);
}
private void ComputeTransform(Vector3 targetPosition, Quaternion rotation, float distance, Vector3 cameraOffset) {
transform.rotation = rotation;
transform.position = targetPosition;
transform.Translate(0, 0, -distance);
transform.Translate(cameraOffset * distance);
}
private float CollisionTest(Vector3 targetPosition, float oldDistance) {
Vector3 dir = transform.position - targetPosition;
float distance = Raycast(targetPosition, dir, dir.magnitude);
if(distance < 1) distance = 1;
distance = Mathf.Lerp(oldDistance, distance, 10*Time.deltaTime);
transform.position = targetPosition + dir.normalized * distance;
return distance;
}
private static float Raycast(Vector3 start, Vector3 dir, float distance) {
RaycastHit hit = new RaycastHit();
if( Physics.Raycast(start, dir, out hit, distance) ) {
return hit.distance;
}
return distance;
}
private static float ClampAngle(float angle, float min, float max) {
if (angle < -360) angle += 360;
if (angle > 360) angle -= 360;
return Mathf.Clamp (angle, min, max);
}
private Vector3 GetInputRotation() {
#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
return MobileInput.GetRotation();
#else
if( !Input.GetMouseButton(1) ) return Vector2.zero;
float dx = Input.GetAxis( "Mouse X" )*4;
float dy = Input.GetAxis( "Mouse Y" )*4;
return new Vector2(-dy, dx);
#endif
}
void OnDrawGizmosSelected() {
if(!enabled) return;
Gizmos.color = Color.red;
Gizmos.DrawSphere( target.TransformPoint( targetOffset ), 0.05f );
}
}
|
(Offline)
|
|
10.08.2012, 15:23
|
#578
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
А что если
// попытка сгладить движение камеры targetPosition = Vector3.Lerp(oldTargetPosition, targetPosition, 15*Time.deltaTime); if((targetPosition-oldTargetPosition ).magnitude <0.001f) { targetPosition = oldTargetPosition ; } else { oldTargetPosition = targetPosition; }
|
(Offline)
|
|
10.08.2012, 21:55
|
#579
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
так же. в любом случае эоо,не решение, а затычка) а тебе не приходилось писать игры от третьего лица?
еще такой вопрос чешится) если я в апдейт активирую какой-то обьект, то можно после его отрисовки отключить без лишних переменных? т.е. перед апдейтом или после рендеринга каждый кадр отключать его?
пока у меня есть дополнительная переменная отвечающая за его состояние. и в LateUpdate я делаю
if !active then go.active = false;
active = false.
часто что-то надо включить на один кадр, а в следующем выключить. кумарит на такую мелочь тратить больше двух строк когда) может есть лучше способ решить это.
|
(Offline)
|
|
10.08.2012, 23:34
|
#580
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Что-то мне не заметно как она дрыгается... попробуй так:
// попытка сгладить движение камеры targetPosition = Vector3.MoveTowards(oldTargetPosition, targetPosition, 15*Time.deltaTime); oldTargetPosition = targetPosition;
А еще есть вот такая штука: Vector3.SmoothDamp
на счет остановки - есть возможность запустить корутину, которая дождется конца кадра и сделает дело - http://docs.unity3d.com/Documentatio...ndOfFrame.html.
|
(Offline)
|
|
10.08.2012, 23:59
|
#581
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
если бы понять почему при lerp дрожание происходит. теоретически камера просто должна немного отставать. но нет(.
за корутину и забыл, хотя я ее и не хотел использовать)
|
(Offline)
|
|
12.08.2012, 16:09
|
#582
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
проблема была в том что цель двигалась в фиксед апдейт, а камера сглажывашась в кпдейт)
теперь надо как то сглаживать движение камеры после фиксед апдейт. наверна свой цикл с корутиной в цикле надо делать. может есть лучше варианты?
update: лучше просто в фиксед апдейт это делать. конечно гарантии нет, что выполнятся будет именно после фиксед апдейта цели, но это и не надо)
Последний раз редактировалось WISHMASTER35, 12.08.2012 в 19:51.
|
(Offline)
|
|
15.08.2012, 18:17
|
#583
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
есть твердое тело в лифте, лифт анимируется анимацией. можно сделать чтобы это тело не прыгало, когда лифт опускается?
|
(Offline)
|
|
15.08.2012, 20:38
|
#584
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
попробовать в LateUpdate смещать объект на величину смещения лифта с прошлого кадра?
|
(Offline)
|
|
15.08.2012, 22:14
|
#585
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
вручную смещать то просто)
да и не очень хорошо смещать rigid body вручную.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:01.
|