OpenGL 在 2 个键上旋转相机
OpenGL rotate camera on 2 keys
基本上我想要做的是当我按住 "c" 并使用箭头键时围绕中心的对象旋转相机。
我的第一个问题与相机没有太大关系,但是有一个按键回调同时识别2个按键。
如果我对 L/R 键有单独的 if 语句而没有 "c",我的功能确实可以工作,但是当我只希望相机在我旋转时,我无法让它工作' m 按住 "c"。我试过在 if 语句中使用 switch(key) 和 if 语句。我尝试过的两种实现都在下面的代码中:
float R = 0.0;
float U = 0.0;
static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if(key == GLFW_KEY_C && action == GLFW_PRESS) {
switch(key) {
case GLFW_KEY_RIGHT:
R+=0.05;
camera(R, U);
break;
case GLFW_KEY_LEFT:
R-=0.05;
camera(R, U);
break;
case GLFW_KEY_UP:
break;
case GLFW_KEY_DOWN:
break;
default:
break;
}
}
//OR --
if(key == GLFW_KEY_C && action == GLFW_PRESS) {
if(key == GLFW_KEY_RIGHT && action == GLFW_PRESS) {
R+=0.05;
camera(R, U);
}
}
}
我做错了什么?还有什么我可以尝试的吗?
我的第二个问题与相机有关。使用我当前的代码,它可以围绕物体旋转半圈,但是一旦到达某个点,相机就会越来越远离物体,而不是旋转。
这是我的相机功能的代码:
GLfloat ox = 10.0;
GLfloat oy = 10.0;
static void camera(float RL, float UD) {
ox+=cos(glm::radians(RL));
oy+=sin(glm::radians(RL));
gViewMatrix = glm::lookAt(glm::vec3(ox, oy, 10.0f), // eye
glm::vec3(0.0, 0.0, 0.0), // center
glm::vec3(0.0, 1.0, 0.0));
}
您的 'C' 检测代码将不起作用,因为您仅在键等于 C 和箭头时匹配。不可能两者兼而有之。您必须保留另一个全局变量 isCPressed。按下 C 时将其设置为 true,释放 C 时将其设置为 false,然后当按下箭头时检查 if(isCPressed).
至于相机代码,您的算法在查看 0,0,0 时围绕点 0,0,10 运行。这似乎不是你想要的,你应该有像 oxdist, oydist, 0 这样的东西,眼睛位置在 [= 的距离处绕 0,0,0 旋转17=]
基本上我想要做的是当我按住 "c" 并使用箭头键时围绕中心的对象旋转相机。
我的第一个问题与相机没有太大关系,但是有一个按键回调同时识别2个按键。
如果我对 L/R 键有单独的 if 语句而没有 "c",我的功能确实可以工作,但是当我只希望相机在我旋转时,我无法让它工作' m 按住 "c"。我试过在 if 语句中使用 switch(key) 和 if 语句。我尝试过的两种实现都在下面的代码中:
float R = 0.0;
float U = 0.0;
static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if(key == GLFW_KEY_C && action == GLFW_PRESS) {
switch(key) {
case GLFW_KEY_RIGHT:
R+=0.05;
camera(R, U);
break;
case GLFW_KEY_LEFT:
R-=0.05;
camera(R, U);
break;
case GLFW_KEY_UP:
break;
case GLFW_KEY_DOWN:
break;
default:
break;
}
}
//OR --
if(key == GLFW_KEY_C && action == GLFW_PRESS) {
if(key == GLFW_KEY_RIGHT && action == GLFW_PRESS) {
R+=0.05;
camera(R, U);
}
}
}
我做错了什么?还有什么我可以尝试的吗?
我的第二个问题与相机有关。使用我当前的代码,它可以围绕物体旋转半圈,但是一旦到达某个点,相机就会越来越远离物体,而不是旋转。 这是我的相机功能的代码:
GLfloat ox = 10.0;
GLfloat oy = 10.0;
static void camera(float RL, float UD) {
ox+=cos(glm::radians(RL));
oy+=sin(glm::radians(RL));
gViewMatrix = glm::lookAt(glm::vec3(ox, oy, 10.0f), // eye
glm::vec3(0.0, 0.0, 0.0), // center
glm::vec3(0.0, 1.0, 0.0));
}
您的 'C' 检测代码将不起作用,因为您仅在键等于 C 和箭头时匹配。不可能两者兼而有之。您必须保留另一个全局变量 isCPressed。按下 C 时将其设置为 true,释放 C 时将其设置为 false,然后当按下箭头时检查 if(isCPressed).
至于相机代码,您的算法在查看 0,0,0 时围绕点 0,0,10 运行。这似乎不是你想要的,你应该有像 oxdist, oydist, 0 这样的东西,眼睛位置在 [= 的距离处绕 0,0,0 旋转17=]