【问题标题】:Create a camera that rotates around the object OpenGL C++创建一个围绕对象 OpenGL C++ 旋转的相机
【发布时间】:2015-02-07 16:18:24
【问题描述】:

我正在做本教程末尾的练习: Link

但是我坚持“创建一个围绕对象旋转的相机”

( position = ObjectCenter + ( radius * cos(time), height, radius * sin(time) ) );

我使用上面提供的代码来创建以下旋转

GLfloat radius = 10.0f;
position = glm::vec3(0.0f,0.0f,0.0f) + glm::vec3(radius * cos(glfwGetTime()), 0.0f, radius * sin(glfwGetTime()));

使用这个,场景围绕 (0,0,0) 旋转 10,我认为这是立方体的中心,但事实并非如此,所以立方体每隔一段时间就会闪过窗口作为场景旋转。

那么我究竟如何找到对象中心?当我绘制立方体时,我无法从代码中理解我告诉它居中的位置。

作为参考,初始位置 vec 是

glm::vec3 position = glm::vec3( 0, 0, 5 );

【问题讨论】:

  • 您正在进行全局旋转而不是局部旋转。您需要通过将相机乘以玩家位置的倒数,将相机移动到相对于玩家的本地空间中。然后应用您的轮换。
  • 或将对象旋转到位
  • 编辑:玩家的位置 ==> 玩家的本地矩阵
  • 感谢 cmets。关于将对象旋转到位,我一直在尝试平移旋转并将模型矩阵平移回 do 循环,但是它不旋转,我应该对旋转函数中的角度使用某种 sin 函数吗?
  • 好的,我让立方体旋转,结果发现将 deltaTime 除以 1000 使旋转角度变得如此微小,什么也没发生!还意识到除非场景中有其他项目,否则您将无法判断是旋转对象还是围绕对象旋转相机。

标签: c++ opengl rotation


【解决方案1】:

您可以做的最简单的方法是在 controls.cpp 中添加以下内容并在 controls.hpp

中声明它
glm::vec3 *getPosition(){
    return &position;
}
void setPosition(glm::vec3 var){
    position = var;
}

那么你只需要在主循环的开头声明以下变量:

float rotCamera = 0.0f;
glm::vec3 origPos = *getPosition();

并在主循环中的 glfwPollEvents(); 之后添加以下行:

// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();

//To rotate the camera through the object
if (glfwGetKey( window, GLFW_KEY_C ) == GLFW_PRESS){
    rotCamera += 0.01;
    glm::vec3 rot(cos(rotCamera) * 10.0 - origPos.x,  0, sin(rotCamera) * 10.0 - origPos.z);
    setPosition(origPos + rot);
}

最后,如果你想让相机一直看着立方体,你必须从 controls.cpp 改变 lookAt 以一直看着 (0,0,0):

ViewMatrix       = glm::lookAt(position,           // Camera is here
                                glm::vec3( 0, 0, 0 ), //To look always to the cube
                                up                  // Head is up (set to 0,-1,0 to look upside-down)
                           );

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2017-06-07
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多