forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

WISHMASTER35 07.08.2012 23:19

Ответ: Вопросы от новичка
 
делал когда-то сглаживание движения мыши так: есть массив размером 60 элементов, в апдейт удаляю первый элемент, сдвигаю все элементы и в конец записываю дельту мыши. а потом из этого массива нахожу среднюю дельту мыши.
как бы все хорошо, но при разных фпс по разному работает. как можно сделать, чтобы при разных фпс оно одинаково работало?
а еще лучше сглаживать движение и вращение самой камеры. только как найти средний угол из нескольких я не пойму. во всяком случае я замечаю как в играх камера от третьего лица не жество привязана к персонажу.

pax 08.08.2012 00:25

Ответ: Вопросы от новичка
 
имхо мышь никто не сглаживает, самый простой способ - вращать и перемещать вспомогательный объект вместо камеры, а камеру стремить к ориентации и положению этого объекта. Потом просто две строчки:

PHP код:

transform.position Vector3.Lerp(transform.positiontargetTransform.positionpositionSpeed Time.deltatime);
transform.rotationQuaternion.Slerp(transform.rotationtargetTransform.rotationrotationSpeed Time.deltatime); 


pie 08.08.2012 13:11

Ответ: Вопросы от новичка
 
Как проверить входит ли объект в камеру или нет? И если возможно еще добавить условие от краев камеры до объекта расстояние должно быть больше 3.

pax 08.08.2012 13:54

Ответ: Вопросы от новичка
 
вхождение объекта в камеру можно проверить посчитав ее плейны камеры
http://docs.unity3d.com/Documentatio...tumPlanes.html
и протестировав габариты объекта с помощью них
http://docs.unity3d.com/Documentatio...lanesAABB.html

WISHMASTER35 09.08.2012 22:32

Ответ: Вопросы от новичка
 
камере от первого лица легко получилось сделать такое сглаживание. дополнительный обьект там совсем не нужен.
а вот камера от третьего лица начинает дрожать т.к. при интерполяции она сбивается с цели.
можно интерполировать не финкльную трансформацию камеры, а ее углы вокруг цели(angles в MouseOrbit), а вот при интерполяции позии цели почему-то снова дрожания появляются, а хотелось бы и сглаженное движение сделать.

pax 10.08.2012 14:37

Ответ: Вопросы от новичка
 
А пример показать как ты делаешь?

WISHMASTER35 10.08.2012 15:17

Ответ: Вопросы от новичка
 
Код:

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 );
        }
       
}


pax 10.08.2012 15:23

Ответ: Вопросы от новичка
 
А что если
PHP код:

// попытка сгладить движение камеры
targetPosition Vector3.Lerp(oldTargetPositiontargetPosition15*Time.deltaTime);
 if((
targetPosition-oldTargetPosition ).magnitude <0.001f)
{
  
targetPosition oldTargetPosition ;
}
else
{
   
oldTargetPosition targetPosition;



WISHMASTER35 10.08.2012 21:55

Ответ: Вопросы от новичка
 
так же. в любом случае эоо,не решение, а затычка) а тебе не приходилось писать игры от третьего лица?
еще такой вопрос чешится) если я в апдейт активирую какой-то обьект, то можно после его отрисовки отключить без лишних переменных? т.е. перед апдейтом или после рендеринга каждый кадр отключать его?
пока у меня есть дополнительная переменная отвечающая за его состояние. и в LateUpdate я делаю
if !active then go.active = false;
active = false.
часто что-то надо включить на один кадр, а в следующем выключить. кумарит на такую мелочь тратить больше двух строк когда) может есть лучше способ решить это.

pax 10.08.2012 23:34

Ответ: Вопросы от новичка
 
Что-то мне не заметно как она дрыгается... попробуй так:
PHP код:

// попытка сгладить движение камеры
        
targetPosition Vector3.MoveTowards(oldTargetPositiontargetPosition15*Time.deltaTime);
        
oldTargetPosition targetPosition

А еще есть вот такая штука: Vector3.SmoothDamp

на счет остановки - есть возможность запустить корутину, которая дождется конца кадра и сделает дело - http://docs.unity3d.com/Documentatio...ndOfFrame.html.

WISHMASTER35 10.08.2012 23:59

Ответ: Вопросы от новичка
 
если бы понять почему при lerp дрожание происходит. теоретически камера просто должна немного отставать. но нет(.
за корутину и забыл, хотя я ее и не хотел использовать)

WISHMASTER35 12.08.2012 16:09

Ответ: Вопросы от новичка
 
проблема была в том что цель двигалась в фиксед апдейт, а камера сглажывашась в кпдейт)
теперь надо как то сглаживать движение камеры после фиксед апдейт. наверна свой цикл с корутиной в цикле надо делать. может есть лучше варианты?
update: лучше просто в фиксед апдейт это делать. конечно гарантии нет, что выполнятся будет именно после фиксед апдейта цели, но это и не надо)

WISHMASTER35 15.08.2012 18:17

Ответ: Вопросы от новичка
 
есть твердое тело в лифте, лифт анимируется анимацией. можно сделать чтобы это тело не прыгало, когда лифт опускается?

pax 15.08.2012 20:38

Ответ: Вопросы от новичка
 
попробовать в LateUpdate смещать объект на величину смещения лифта с прошлого кадра?

WISHMASTER35 15.08.2012 22:14

Ответ: Вопросы от новичка
 
вручную смещать то просто)
да и не очень хорошо смещать rigid body вручную.


Часовой пояс GMT +4, время: 22:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot