Вращение вокруг оси (c#) - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь вращать свою камеру вокруг себя, что, по моему мнению, дало бы мне действительно крутой эффект в моей игре. Проблема в том, что я не знаю как.

Я использую Matrix для вращения. Хотя я работаю в 2D, я использую Vector3 s, потому что это дает больший контроль над матрицами.

По сути, вращающийся шарнир камеры - это верхний левый угол вместо центра. Вот мой код и то, что я пробовал (я использую XNA / MonoGame):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Showdown
{
    public class Camera
    {
        public Matrix transform;
        public Vector2 folllow;
        public Viewport view;
        public Vector2 position;
        public float rotation;
        public float zoom;
        public float maxRotation = 0.1f;
        public float rotateSpeed = 0.05f;
        public float rotateDirection = -1f;

        bool follow = false;

        public Camera(Viewport _view)
        {
            view = _view;
        }

        public void Update(Vector2 _follow)
        {
            GetRotation();

            if (follow) // true if there's something to follow
            {
                position = _follow;
            }
            else
            {
                position = Vector2.Zero;
            }
            transform = Matrix.CreateScale(new Vector3(zoom, zoom, 0f));
            transform = Matrix.CreateTranslation(new Vector3(position.X, position.Y, 0f));
            transform.Translation = Vector3.Transform(Vector3.Zero, Matrix.CreateRotationZ(rotation));
        }

        void GetRotation()
        {
            rotation += rotateSpeed * rotateDirection * (float)Globals.gameTime.ElapsedGameTime.TotalSeconds;

            if (rotateDirection < 0f && rotation <= -maxRotation)
            {
                rotateDirection = 1f;
            }
            if (rotateDirection > 0f && rotation >= maxRotation)
            {
                rotateDirection = -1f;
            }
        }
    }
}
...