Hazel游戏引擎(047)Camera控制类

文中若有代码、术语等错误,欢迎指正

前言

  • 此节目的

    在SandboxApp里面有camera移动旋转的方法,希望能将Camera抽象成一个

    好处:更好的封装,这样在SandboxApp中就不需要写那么多方法。

测试宽高比对图形显示的效果

Hazel::OrthographicCameraController::OrthographicCameraController(float aspectRatio, bool rotation)
    :m_AspectRatio(aspectRatio), m_Camera(-m_AspectRatio * m_ZoomLevel, m_AspectRatio* m_ZoomLevel,-m_ZoomLevel, m_ZoomLevel), m_Rotation(rotation)
    {
    
    
        /*
        	宽:m_Camera的第一个、第二个参数(不包含符号)。-m_AspectRatio * m_ZoomLevel、m_AspectRatio* m_ZoomLevel
        	高:m_Camera的第三个、第四个参数(不包含符号)。-m_ZoomLevel、m_ZoomLevel
        */
    }
  • 宽=1,高=1。m_Camera(-1,1,-1,1)

    请添加图片描述

  • 宽=1,高=2。m_Camera(-1,1,-2,2)

    请添加图片描述

    看右上角的黄色方块,宽还是4个,高明显增多,所以,高变大代表上下视角变大,物体高缩小

  • 宽=2,高=1。m_Camera(-2,2,-1,1)

    请添加图片描述

    看右上角的黄色方块,高还是4个,宽明显增多,所以,宽变大代表左右视角变大,物体缩小

关键代码

  • 宽高比

    在1280*720下的界面,宽1280>高720,宽明显比高 像素占位

    需传入1280/720=1.7左右,将宽放大,从而左右视角变大,物体缩小(如上测试结果),达到正常比例。

    // , m_Camera(-1.6f, 1.6f, -0.9f, 0.9f)
    ExampleLayer() : Layer("Example"), m_CameraController(1280.0f / 720.0f, true)
    
  • m_ZoomLevel视野影响物体大小

     m_Camera(-m_AspectRatio * m_ZoomLevel, m_AspectRatio* m_ZoomLevel,-m_ZoomLevel, m_ZoomLevel)
    
    • 视野放大,物体缩小
    • 视野缩小,物体放大

    由上的测试结果:第一第二参数放大那么物体宽缩小、第三第四参数放大那么物体高缩小

    所以:m_ZoomLevel视野放大,物体宽和高都缩小,反之视野缩小,物体放大。

  • m_ZoomLevel视野影响摄像机移动速度

    // 视野放大,摄像机移动速度变快,视野缩小,摄像机移动速度变慢
    m_CameraTranslationSpeed = m_ZoomLevel;
    
    • 视野放大,物体缩小,摄像机移动速度变
    • 视野缩小,物体放大,摄像机移动速度变

代码修改

  • OrthographicCameraController

    #pragma once
    #include "Hazel/Renderer/OrthographicCamera.h"
    #include "Hazel/Core/Timestep.h"
    #include "Hazel/Events/ApplicationEvent.h"
    #include "Hazel/Events/MouseEvent.h"
    
    namespace Hazel {
          
          
    	class OrthographicCameraController
    	{
          
          
    	public:
    		OrthographicCameraController(float aspectRatio, bool rotation = false);
    
    		void OnUpdate(Timestep ts);
    		void OnEvent(Event& e);
    
    		OrthographicCamera& GetCamera() {
          
           return m_Camera; }
    		const OrthographicCamera& GetCamera() const {
          
           return m_Camera; }
    	private:
    		bool OnMouseScrolled(MouseScrolledEvent& e);
    		bool OnWindowResized(WindowResizeEvent& e);
    	private:
    		float m_AspectRatio;
    		float m_ZoomLevel = 1.0f;
    		OrthographicCamera m_Camera;  
    
    		bool m_Rotation;
    
    		glm::vec3 m_CameraPosition = {
          
           0.0f, 0.0f, 0.0f };
    		float m_CameraRotation = 0.0f;
    		float m_CameraTranslationSpeed = 5.0f, m_CameraRotationSpeed = 180.0f;
    	};
    }
    
    #include "hzpch.h"
    #include "OrthographicCameraController.h"
    #include "Input.h"
    #include "KeyCodes.h"
    namespace Hazel {
          
          
    	Hazel::OrthographicCameraController::OrthographicCameraController(float aspectRatio, bool rotation)
    		:m_AspectRatio(aspectRatio), m_Camera(-m_AspectRatio * m_ZoomLevel, m_AspectRatio* m_ZoomLevel,-m_ZoomLevel, m_ZoomLevel), m_Rotation(rotation)
    	{
          
          
    	}
    	void Hazel::OrthographicCameraController::OnUpdate(Timestep ts)
    	{
          
          
    		if (Input::IsKeyPressed(HZ_KEY_W)) {
          
          
    			m_CameraPosition.y += m_CameraTranslationSpeed * ts;
    		}
    		else if (Input::IsKeyPressed(HZ_KEY_S)) {
          
          
    			m_CameraPosition.y -= m_CameraTranslationSpeed * ts;
    		}
    		if (Input::IsKeyPressed(HZ_KEY_A)) {
          
          
    			m_CameraPosition.x -= m_CameraTranslationSpeed * ts;
    		}
    		else if (Input::IsKeyPressed(HZ_KEY_D)) {
          
          
    			m_CameraPosition.x += m_CameraTranslationSpeed * ts;
    		}
    		if (m_Rotation) {
          
          
    			if (Input::IsKeyPressed(HZ_KEY_Q)) {
          
          
    				m_CameraRotation += m_CameraRotationSpeed * ts; // 注意是+
    			}
    			else if (Input::IsKeyPressed(HZ_KEY_E)) {
          
          
    				m_CameraRotation -= m_CameraRotationSpeed * ts;
    			}
    			m_Camera.SetRotation(m_CameraRotation);
    		}
    		// 修改后要重新设置
    		m_Camera.SetPosition(m_CameraPosition);
    
    		// 视野放大,摄像机移动速度变快,视野缩小,摄像机移动速度变慢
    		m_CameraTranslationSpeed = m_ZoomLevel;
    	}	
    
    	void Hazel::OrthographicCameraController::OnEvent(Event& e)
    	{
          
          
    		EventDispatcher dispatcher(e);
    		dispatcher.Dispatch<MouseScrolledEvent>(HZ_BIND_EVENT_FN(OrthographicCameraController::OnMouseScrolled));
    		dispatcher.Dispatch<WindowResizeEvent>(HZ_BIND_EVENT_FN(OrthographicCameraController::OnWindowResized));
    	}
    
    	bool Hazel::OrthographicCameraController::OnMouseScrolled(MouseScrolledEvent& e)
    	{
          
          
    		m_ZoomLevel -= e.GetYOffset() * 0.25f;
    		m_ZoomLevel = std::max(m_ZoomLevel, 0.25f);
    		m_Camera.SetProjection(-m_AspectRatio * m_ZoomLevel, m_AspectRatio * m_ZoomLevel, -m_ZoomLevel, m_ZoomLevel);
    		return false;
    	}
    
    	bool Hazel::OrthographicCameraController::OnWindowResized(WindowResizeEvent& e)
    	{
          
          
    		m_AspectRatio = (float)e.GetWidth() / (float)e.GetHeight();
    		m_Camera.SetProjection(-m_AspectRatio * m_ZoomLevel, m_AspectRatio * m_ZoomLevel, -m_ZoomLevel, m_ZoomLevel);
    		return false;
    	}
    }
    

猜你喜欢

转载自blog.csdn.net/qq_34060370/article/details/131882699