Trackball是将屏幕上捕捉到的鼠标位置转换到一个球的表面,根据它确定旋转轴和旋转角度。看下面的代码就能明白;首先定义一些全局变量:
//camera transform variables
int state = 0, oldX=0, oldY=0;
float r_angle=0, dist = -2;
glm::vec3 r_axis_local=glm::vec3(1.0f, 0.0f, 0.0f);
glm::mat4 Tr;
glm::mat4 R=glm::mat4(1.0);
glm::mat4 MV,P,MVP;
将鼠标位置映射到(-1.0,1.0)范围内
glm::vec2 scaleMouse(glm::vec2 coords, glm::vec2 viewport) {
return glm::vec2( static_cast<float>(coords.x*2.f) / static_cast<float>(viewport.x) - 1.f,
1.f - static_cast<float>(coords.y*2.f) / static_cast<float>(viewport.y) );
}
将鼠标位置映射到球面(或双曲面,当鼠标位置超过球的范围时)上
glm::vec3 projectToSphere(glm::vec2 xy) {
static const float sqrt2 = sqr