Как мне плавно поворачивать 3D-камеру Unity вокруг объекта на заданном расстоянии, чтобы смотреть на объект в направлениC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как мне плавно поворачивать 3D-камеру Unity вокруг объекта на заданном расстоянии, чтобы смотреть на объект в направлени

Сообщение Anonymous »

Я знаком с Cinemachine, но не нашел ничего, что могло бы выполнить то, что я пытаюсь сделать. Я работаю над автомобильной игрой, хотя конкретная концепция игры не имеет отношения к проблеме. Прямо сейчас я создаю основу для плавного поворота камеры вокруг игрока в зависимости от горизонтальной скорости автомобиля (игнорируя любую скорость по оси Y). Например, если автомобиль движется вперед, а камера еще не расположена позади него на указанном расстоянии, камера должна плавно поворачиваться по кратчайшему пути, чтобы достичь этого положения.
У меня есть попробовал использовать эту функцию прямо здесь, чтобы получить целевое значение, которое будет использоваться для поворота камеры вокруг автомобиля, но функция не возвращает правильные значения, если скорость превышает минимальный порог, который я установил в инспекторе. Если это значение неверно, я не смогу правильно повернуть камеру.

Код: Выделить всё

 public Vector3 GetFollowOffsetPosition(Vector3 followerPosition, Vector3 followObjectPosition, Vector3 followObjectVelocity, float followDistance)
{
// If the followed object is stationary, just return the current position (no offset).
if (followObjectVelocity.magnitude < minSpeedThreshold)
{
return defaultCamPosition; // No significant velocity, return current follower position.
}

// Get the direction of the followed object's velocity (ignoring y component for horizontal following).
Vector3 velocityDirection = followObjectVelocity.normalized;

// Calculate the offset position: followObject's position minus the offset along the velocity direction.
Vector3 offsetPosition = (new Vector3(Mathf.Sign(velocityDirection.z) * velocityDirection.x , defaultCamPosition.y, Mathf.Sign(velocityDirection.z) * followDistance) );

// Return the calculated offset position.
offsetPosition.y = defaultCamPosition.y;
return offsetPosition;
}

здесь он вызывается в функции фиксированного обновления

Код: Выделить всё

private void FixedUpdate()
{
if (hasRigidBody)
{
followPointVelocity = rb.velocity;  //get the Rigidbody velocity

}
else
{
followPointVelocity = (followObject.transform.position - lastPosition) / Time.fixedDeltaTime; //get velocity without a rigidbody.

}

Vector3 relativeVelocity = followObject.transform.InverseTransformDirection(followPointVelocity);    //get velocity value in local coordinates of the follow object
followPointAcceleration = (followPointVelocity - lastVelocity) / Time.fixedDeltaTime;    //get Acceleration values.
Vector3 relativeAcceleration = followObject.transform.InverseTransformDirection(followPointAcceleration);   // get the acceleration in local coordinates of the follow object

Vector3 targetPosition = followObject.transform.TransformPoint(camPositionOffset);

Vector3 camLocalPosition = followObject.transform.InverseTransformPoint(cam.transform.position);

Vector3 targetLocalPosition = followObject.transform.InverseTransformPoint(targetPosition);

float newLocalX = Mathf.SmoothDamp(camLocalPosition.x, targetLocalPosition.x, ref velocityX, smoothTimeX);
float newLocalY = Mathf.SmoothDamp(camLocalPosition.y, targetLocalPosition.y, ref velocityY, smoothTimeY);
float newLocalZ = Mathf.SmoothDamp(camLocalPosition.z, targetLocalPosition.z, ref velocityZ, smoothTimeZ);

Vector3 newLocalPosition = new Vector3(newLocalX, newLocalY, newLocalZ);

Vector3 smoothedWorldPosition = followObject.transform.TransformPoint(newLocalPosition);

cam.transform.position = smoothedWorldPosition;

camPositionOffset = Vector3.SmoothDamp(camPositionOffset, GetFollowOffsetPosition(camPositionOffset, Vector3.zero, relativeVelocity, camPositionOffset.z),ref velocity, smoothTime);

cam.transform.LookAt(followObject.transform);

lastPosition = followObject.transform.position;
lastVelocity = followPointVelocity;
lastAcceleration = followPointAcceleration;
}
Я не уверен, в чем проблема, если кто-нибудь сможет мне помочь, это будет здорово.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ven-distan
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»