Разбираю скрипт OrbitCamera из 3d Platform tutorial
Возник такой вопросик - для просчета коллизий камеры с коллайдерами используется Physics.Raycast (насколько я разобрался).
Так вот, когда камера пересекается, например, с плэйном за ней, приближение камеры к таргету "активируется" не сразу, таким образом, камера успевает наполовину зайти за поверхность плэйна. Т.е. при некоторых ракурсах игрок успевает увидеть "обратную сторону" модели.
Видимо, это происходит из-за того, что луч проводится через центр камеры и возникает ситуация, когда камера уже пересекается с объектом, а луч еще нет.
Собственно, вопрос:
Можно ли модифицировать OrbitCamera так, чтобы камера не заходила за поверхность моделей? Один из вариантов - добавить коллайдер для камеры и просчитывать его пересечения с объектами. Возможно есть более изящные варианты?
P.S. В джаваскрипте я совсем новичок, так что заранее прошу прощения если вопрос некорректен. Спасибо.
- Код: Выделить всё
var target : Transform;
var distance = 4.0;
var lineOfSightMask : LayerMask = 0;
var closerSnapLag : float = 0.2;
var distanceVelocity = 0.0;
var currentDistance;
var x = 0.0;
var y = 90.0;
var yMinLimit = -20;
var yMaxLimit = 80;
function Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
currentDistance = distance;
if (rigidbody)
rigidbody.freezeRotation = true;
}
function LateUpdate () {
if (target) {
x += Input.GetAxis("Mouse X");
y -= Input.GetAxis("Mouse Y");
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
var targetPos = target.position;
var direction = rotation * -Vector3.forward;
var targetDistance = SightLine(targetPos, direction);
currentDistance = Mathf.SmoothDamp(currentDistance, targetDistance, distanceVelocity, closerSnapLag * .3);
transform.rotation = rotation;
transform.position = targetPos + direction * currentDistance;
}
}
function SightLine (target : Vector3, direction : Vector3) : float
{
var hit : RaycastHit;
if (Physics.Raycast (target, direction, hit, distance, lineOfSightMask.value))
return hit.distance;
else
return distance;
}
static function ClampAngle (angle : float, min : float, max : float)
{
return Mathf.Clamp (angle, min, max);
}