Я работаю над движением камеры RTS и пытаюсь зафиксировать основание ее движения по размеру карты и углам камеры.
это мой код:
public void Init(Vector2 mapSize)
{
_camera = GetComponent<Camera>();
_movePosition = transform.position =
new Vector3(CameraStartPosition.x, CameraHeight, CameraStartPosition.z);
var frustumHeight = 2.0f * CameraHeight * Mathf.Tan(_camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
var frustumWidth = frustumHeight * _camera.aspect;
var floorZSize = mapSize.y * _mapScaleFactor;
var angle = Mathf.Sin(transform.localRotation.eulerAngles.x * Mathf.Deg2Rad);
var distance = frustumHeight * 0.5f / Mathf.Tan(_camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
var hypotenuse = distance / angle;
var adjacent = Mathf.Sqrt(Mathf.Pow(hypotenuse,2) - Mathf.Pow(distance,2));
var zMax = floorZSize - adjacent ;
var zMin = floorZSize + adjacent ;
Debug.Log(
$"frustumWidth: {frustumWidth} frustumHeight: {frustumHeight} " +
$"filed of view: {_camera.fieldOfView} distance: {distance} " +
$"mapHeight {floorZSize} angle{angle} hypotenuse: {hypotenuse} adjacent: {adjacent} zMax: {zMax} zMin: {zMin}");
BoundsMin = new Vector3(
_mapScaleFactor*(-mapSize.x) + CameraHeight*Mathf.Sin(transform.localRotation.eulerAngles.z*Mathf.Deg2Rad),
CameraHeight,
-zMin);
BoundsMax = new Vector3(
_mapScaleFactor*mapSize.x + CameraHeight*Mathf.Sin(transform.localRotation.eulerAngles.z*Mathf.Deg2Rad),
CameraHeight,
zMax );
}
private void Update()
{
if (_camera == null) return;
if (Input.GetKey(_moveUp.Key))
{
_movePosition.z += MovementSpeed * Time.deltaTime;
}
if (Input.GetKey(_moveRight.Key))
{
_movePosition.x += MovementSpeed * Time.deltaTime;
}
if (Input.GetKey(_moveDown.Key))
{
_movePosition.z -= MovementSpeed * Time.deltaTime;
}
if (Input.GetKey(_movLeft.Key))
{
_movePosition.x -= MovementSpeed * Time.deltaTime;
}
var cameraMoveDirection = (_movePosition - transform.position).normalized;
var distance = Vector3.Distance(_movePosition,transform.position);
_movePosition = new Vector3(
Mathf.Clamp(_movePosition.x, BoundsMin.x, BoundsMax.x),
Mathf.Clamp(_movePosition.y, BoundsMin.y, BoundsMax.y),
Mathf.Clamp(_movePosition.z, BoundsMin.z, BoundsMax.z));
if (distance > 0)
{
var newCameraPosition = transform.position + (cameraMoveDirection * distance * MovementSpeed * Time.deltaTime);
newCameraPosition = new Vector3(
Mathf.Clamp(newCameraPosition.x, BoundsMin.x, BoundsMax.x),
Mathf.Clamp(newCameraPosition.y, BoundsMin.y, BoundsMax.y),
Mathf.Clamp(newCameraPosition.z, BoundsMin.z, BoundsMax.z));
var distanceAfterMoving = Vector3.Distance(newCameraPosition, _movePosition);
if (distanceAfterMoving > distance)
{
newCameraPosition = _movePosition;
}
transform.position = newCameraPosition;
}
}
, поэтому я знаю, как получить все значения, такие как угол, расстояние, гипотенуза и смежность камерытреугольник, но я знаю, что я все еще что-то упускаю из-за тригонометрии камеры.
Мой текущий поворот камеры по оси X составляет 40.
Просто чтобы прояснить, я хочу, чтобы это движение камерыбудет фиксироваться, когда положение камеры будет, например, MapXMin - cameraLeftCorner.
Может кто-нибудь помочь мне выяснить, что я делаю неправильно?