我正在尝试创建一个迷你应用程序,它可以通过鼠标的移动在一个立方体周围旋转相机。它可以完美地绕Y轴旋转,但是我有一个围绕X轴旋转的问题。当我连续向上移动鼠标时,立方体开始在正X方向上旋转。经过一段时间后,它会反转它的旋转方向并开始在负X方向上旋转,然后经过一段时间再次在正X方向上旋转。只要我向上移动鼠标,我想让它围绕正X旋转。这有什么问题?
立方体位于坐标系的中心。投影是透视:
修改:以下是与问题相关的视频:https://youtu.be/997ZdUM8fcQ
vec4 eye;
vec4 at;
vec4 up;
GLfloat mouseX = -1;
GLfloat mouseY = -1;
// Bound to glutPassiveMotionFunc
void mouse(int x, int y) {
// This rotation works perfect, cube rotates on same direction continuously as far as I move the mouse left or right
GLfloat acceleration_x = mouseX - x;
eye = RotateY(acceleration_x / 10.f) * eye;
mouseX = x;
// This rotation doesn't work properly, after some time, cube's rotation direction inverses
GLfloat acceleration_y = mouseY - y;
eye = RotateX(acceleration_y / 10.f) * eye;
mouseY = y;
// This part teleports pointer to opposite side of window after reaching window bounds
if (x >= 1364) {
glutWarpPointer(1, y);
mouseX = 1;
}
else if (x <= 0) {
glutWarpPointer(1363, y);
mouseX = 1363;
}
if (y >= 751) {
glutWarpPointer(x, 3);
mouseY = 3;
}
else if (y <= 2) {
glutWarpPointer(x, 750);
mouseY = 750;
}
}
void display( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
vec4 up( 0.0, 1.0, 0.0, 0.0 );
mat4 model_view = LookAt( eye, at, up );
glUniformMatrix4fv( ModelView, 1, GL_TRUE, model_view );
glDrawArrays( GL_TRIANGLES, 0, NumVertices );
glutSwapBuffers();
}
// Bound to glutTimerFunc
void timer( int id )
{
glutPostRedisplay();
glutTimerFunc(1000.f/60.f, timer, 0);
}
int main( int argc, char **argv )
{
......
......
eye = vec4(0, 0, 2, 0);
at = vec4(0, 0, 0, 0);
up = vec4(0.0, 1.0, 0.0, 0.0);
.....
.....
}
答案 0 :(得分:1)
这是因为相机被翻转了。像这样用你的手:食指是dir
,拇指是up
(拇指=(0,1,0))。指示您的索引查找器向前,向上指向您的拇指。现在,开始用手转动X:你的食指开始指向下方,而你的拇指前进(在此期间,thumb.y为正)。当您将手旋转90度时,食指指向下方,拇指指向前方(thumb.y为0)。当你继续旋转时,你的拇指开始向前+向下(拇指变为负)。
此时,LookAt函数不会计算您想要的矩阵,因为您希望up
向量指向下方(正如我们所说,thumb.y为负数),但在代码中,{{ 1}} vector是一个常量(0,1,0),因此LookAt将计算一个具有正up
的矩阵:相机被翻转。
解决方案可能是您注册所需的旋转角度,并使用这些角度旋转相机矩阵(而不是up.y
)