Math库¶
用来处理各种数学逻辑 + 解压缩Transform
#pragma once
#include <glm/glm.hpp>
namespace CryDust::Math {
bool DecomposeTransform(const glm::mat4& transform, glm::vec3& outTranslation, glm::vec3& outRotation, glm::vec3& outScale);
}
ImGUILayer¶
可以拿到主相机
//拿到主相机
Entity Scene::GetPrimaryCameraEntity()
{
auto view = m_Registry.view<CameraComponent>();
for (auto entity : view)
{
const auto& camera = view.get<CameraComponent>(entity);
if (camera.Primary)
return Entity{ entity, this };
}
return {};
}
Transform组件¶
允许四元数,修改旋转
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/quaternion.hpp>
glm::mat4 rotation = glm::toMat4(glm::quat(Rotation));
EditorLayer¶
Gizmo¶
相机,Tranform等修改
// Gizmos
Entity selectedEntity = m_SceneHierarchyPanel.GetSelectedEntity();
if (selectedEntity && m_GizmoType != -1)
{
ImGuizmo::SetOrthographic(false);
ImGuizmo::SetDrawlist();
float windowWidth = (float)ImGui::GetWindowWidth();
float windowHeight = (float)ImGui::GetWindowHeight();
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, windowWidth, windowHeight);
// 相机
auto cameraEntity = m_ActiveScene->GetPrimaryCameraEntity();
const auto& camera = cameraEntity.GetComponent<CameraComponent>().Camera;
const glm::mat4& cameraProjection = camera.GetProjection();
glm::mat4 cameraView = glm::inverse(cameraEntity.GetComponent<TransformComponent>().GetTransform());
// 实体Transform
auto& tc = selectedEntity.GetComponent<TransformComponent>();
glm::mat4 transform = tc.GetTransform();
// Snapping:Ctrl做固定移动
bool snap = Input::IsKeyPressed(Key::LeftControl);
float snapValue = 0.5f; // Snap to 0.5m for translation/scale
// Snap to 45 degrees for rotation:旋转则是45度
if (m_GizmoType == ImGuizmo::OPERATION::ROTATE)
snapValue = 45.0f;
float snapValues[3] = { snapValue, snapValue, snapValue };
ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(cameraProjection),
(ImGuizmo::OPERATION)m_GizmoType, ImGuizmo::LOCAL, glm::value_ptr(transform),
nullptr, snap ? snapValues : nullptr);
if (ImGuizmo::IsUsing())
{
glm::vec3 translation, rotation, scale;
Math::DecomposeTransform(transform, translation, rotation, scale);//解算出移动、旋转、缩放
glm::vec3 deltaRotation = rotation - tc.Rotation;//旋转间距
tc.Translation = translation;
tc.Rotation += deltaRotation;
tc.Scale = scale;
}
}
快捷键¶
// Gizmos
case Key::Q:
m_GizmoType = -1;
break;
case Key::W:
m_GizmoType = ImGuizmo::OPERATION::TRANSLATE;
break;
case Key::E:
m_GizmoType = ImGuizmo::OPERATION::ROTATE;
break;
case Key::R:
m_GizmoType = ImGuizmo::OPERATION::SCALE;
break;