added trackball camera
This commit is contained in:
parent
91271ea8e4
commit
f2f60a8c20
74
src/trackballcamera.cpp
Normal file
74
src/trackballcamera.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
#include "trackballcamera.h"
|
||||
#include <glm/ext.hpp>
|
||||
|
||||
#define SCROLL_SPEED 0.998f
|
||||
#define ROTATION_SPEED 0.01f
|
||||
#define MOVE_SPEED 0.002f
|
||||
|
||||
TrackBallCamera::TrackBallCamera(float myFov, float myNear, float myFar) :
|
||||
m_fov(myFov), m_near(myNear), m_far(myFar)
|
||||
{
|
||||
reset();
|
||||
resize(800, 600);
|
||||
}
|
||||
|
||||
void TrackBallCamera::resize(int width, int height)
|
||||
{
|
||||
if(width > 0 && height > 0)
|
||||
m_projection = glm::perspectiveFov<float>(m_fov, float(width), float(height), m_near, m_far);
|
||||
}
|
||||
|
||||
void TrackBallCamera::rotateCamera(float dx, float dy)
|
||||
{
|
||||
m_rotation.x += dx*ROTATION_SPEED;
|
||||
m_rotation.y += dy*ROTATION_SPEED;
|
||||
if(m_rotation.y > 1.57f)
|
||||
m_rotation.y = 1.57f;
|
||||
if(m_rotation.y < -1.57f)
|
||||
m_rotation.y = -1.57f;
|
||||
computeView();
|
||||
}
|
||||
|
||||
void TrackBallCamera::reset()
|
||||
{
|
||||
m_center = glm::vec3(0, 4, 0);
|
||||
m_target = m_center;
|
||||
m_rotation = glm::vec2(0, 1);
|
||||
m_dist = 20;
|
||||
computeView();
|
||||
}
|
||||
|
||||
void TrackBallCamera::computeView()
|
||||
{
|
||||
|
||||
m_view = glm::translate(glm::mat4(), glm::vec3(0, 0, -m_dist));
|
||||
m_view = glm::rotate(m_view, m_rotation.y, glm::vec3(1, 0, 0));
|
||||
m_view = glm::rotate(m_view, m_rotation.x, glm::vec3(0, 1, 0));
|
||||
m_view = glm::translate(m_view, -m_center);
|
||||
}
|
||||
|
||||
void TrackBallCamera::mouseScroll(int nbScrolls)
|
||||
{
|
||||
while(nbScrolls != 0)
|
||||
{
|
||||
if(nbScrolls > 0)
|
||||
{
|
||||
m_dist *= SCROLL_SPEED;
|
||||
--nbScrolls;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dist /= SCROLL_SPEED;
|
||||
++nbScrolls;
|
||||
}
|
||||
}
|
||||
|
||||
computeView();
|
||||
}
|
||||
|
||||
glm::vec3 TrackBallCamera::getDefaultPxInfo()
|
||||
{
|
||||
glm::vec4 viewPos(m_center, 1);
|
||||
viewPos = (m_projection * m_view) * viewPos;
|
||||
return glm::vec3(m_dist/m_far, 1/viewPos.w, 0);
|
||||
}
|
43
src/trackballcamera.h
Normal file
43
src/trackballcamera.h
Normal file
@ -0,0 +1,43 @@
|
||||
#ifndef TRACKBALLCAMERA_H
|
||||
#define TRACKBALLCAMERA_H
|
||||
|
||||
#include <camera.h>
|
||||
#include <glm/vec2.hpp>
|
||||
#include <glm/vec3.hpp>
|
||||
|
||||
class TrackBallCamera : public Camera
|
||||
{
|
||||
glm::mat4 m_view;
|
||||
glm::mat4 m_projection;
|
||||
|
||||
float m_fov;
|
||||
float m_near;
|
||||
float m_far;
|
||||
|
||||
// camera position
|
||||
glm::vec3 m_center;
|
||||
glm::vec2 m_rotation;
|
||||
float m_dist;
|
||||
|
||||
// camera movement
|
||||
glm::vec3 m_origin;
|
||||
glm::vec3 m_target;
|
||||
|
||||
public:
|
||||
TrackBallCamera(float myFov = 70.f, float myNear = 0.1f, float myFar = 1000.f);
|
||||
|
||||
glm::mat4 getProjectionMatrix() {return m_projection;}
|
||||
glm::mat4 getViewMatrix() {return m_view;}
|
||||
|
||||
void resize(int width, int height);
|
||||
|
||||
void rotateCamera(float dx, float dy);
|
||||
void moveCamera(float dx, float dy);
|
||||
void mouseScroll(int nbScrolls);
|
||||
void reset();
|
||||
void computeView();
|
||||
void setCenter(glm::vec3 pos) { m_center = pos; computeView(); }
|
||||
glm::vec3 getDefaultPxInfo();
|
||||
};
|
||||
|
||||
#endif // TRACKBALLCAMERA_H
|
Loading…
x
Reference in New Issue
Block a user