// // Created by Epagris on 2020. 03. 16.. // #include "Cam.h" #include "utils.h" eg3d::Cam::Cam() { } void eg3d::Cam::loadDefaults() { mProjParams.loadDefaults(); mViewParams.loadDefaults(); } const XMFLOAT4X4 &eg3d::Cam::getViewMatrix() const { return mMView; } const XMFLOAT4X4 &eg3d::Cam::getProjMatrix() const { return mMProj; } void eg3d::Cam::constructViewMatrix() { XMMATRIX r = XMMatrixRotationX(mViewParams.pitch) * XMMatrixRotationY(mViewParams.yaw); // forgatások (yaw, pitch) XMMATRIX t = XMMatrixTranslation(mViewParams.position.x, mViewParams.position.y, mViewParams.position.z); // eltolás XMStoreFloat4x4(&mMView, MT(t*r)); // view mátrix letárolása XMVECTOR dir = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); // (0,0,-1) irányba néz alapból a kamera XMStoreFloat3(&mVViewDirection, XMVector3Transform(dir, r)); // forgatott vektor kiszámítása és letárolása } void eg3d::Cam::constructProjMatrix() { XMMATRIX p = XMMatrixPerspectiveFovLH(mProjParams.FOV, mProjParams.AspectRatio, mProjParams.NearPlane, mProjParams.FarPlane); XMStoreFloat4x4(&mMProj, MT(p)); } void eg3d::Cam::setProjParams(const eg3d::ProjParams &pp) { mProjParams = pp; constructProjMatrix(); // projekciós mátrix újragenerálása } eg3d::ProjParams eg3d::Cam::getProjParams() const { return mProjParams; } void eg3d::Cam::setViewParams(const eg3d::ViewParams &vp) { mViewParams = vp; constructViewMatrix(); } eg3d::ViewParams eg3d::Cam::getViewParams() const { return mViewParams; } void eg3d::Cam::advance(float ds) { XMVECTOR s = XMLoadFloat3(&mViewParams.position); XMVECTOR dir = XMLoadFloat3(&mVViewDirection); s = XMVectorAdd(s, XMVectorScale(dir, ds)); XMStoreFloat3(&mViewParams.position, s); constructViewMatrix(); } void eg3d::Cam::yaw(float dphi) { mViewParams.yaw += dphi; constructViewMatrix(); } void eg3d::Cam::pitch(float drho) { mViewParams.pitch += drho; constructViewMatrix(); } // ----------------------------- eg3d::ProjParams::ProjParams() { loadDefaults(); } void eg3d::ProjParams::loadDefaults() { FOV = XM_PIDIV2; // 90 fokos látószög AspectRatio = 1.0f; // 1:1-es képarány NearPlane = 1.0f; // közeli sík FarPlane = 10.0f; } eg3d::ViewParams::ViewParams() {} void eg3d::ViewParams::loadDefaults() { position.x = position.y = position.z = 0.0f; // (0,0,0), origó yaw = 0.0f; // nincs forgatás pitch = 0.0f; // nincs billentés }