OpenGL模拟波斯王子相机

Posted

技术标签:

【中文标题】OpenGL模拟波斯王子相机【英文标题】:OpenGL simulate Prince of persia camera 【发布时间】:2017-07-03 11:20:56 【问题描述】:

我有一个对象“角色”,它可以左右转动并在其面部方向上向前移动,并且相机始终看着对象并可以围绕它旋转。

问题是:我想像在波斯王子中那样,不管相机方向如何,我都想移动相机,而对象移动到它的方向,如果角色面对相机方向并且角色向前移动,这意味着如果相机不是移动角色变得更靠近相机,所以如果相机是可移动的,相机应该向后移动以使它们之间的距离相同,如果角色向右看,那么相机应该向右移动,以此类推任何方向,相机有位置、前、右和上向量以及偏航角和俯仰角,角色有位置和偏航角和俯仰角。 使角色移动的代码是:

void Mesh::Move(Move_Directions direction, GLfloat deltaTime) 
GLfloat velocity = 50 * this->movementSpeed * deltaTime;
if (direction == FORWARD) 
    glm::vec3 t = glm::vec3(sin(glm::radians(yaw)), 0.0, cos(glm::radians(yaw))) * velocity;
    matrix = glm::translate(matrix, t);
    for (GLuint i = 0; i < this->m_Entries.size(); i++) 
        this->m_Entries[i].setModelMatrix(matrix);
    
    //scene->getDefCamera()->Translate(t);

if (direction == BACKWARD) 
    glm::vec3 t = glm::vec3(sin(glm::radians(yaw)), 0.0, cos(glm::radians(yaw))) * velocity;
    matrix = glm::translate(matrix, -t);
    for (GLuint i = 0; i < this->m_Entries.size(); i++) 
        this->m_Entries[i].setModelMatrix(matrix);
    
    //scene->getDefCamera()->Translate(t);

if (direction == RIGHT) 
    matrix = glm::rotate(matrix, (GLfloat) -M_PI*deltaTime, glm::vec3(0.0, 1.0, 0.0));
    for (GLuint i = 0; i < this->m_Entries.size(); i++) 
        this->m_Entries[i].setModelMatrix(matrix);
    

if (direction == LEFT) 
    matrix = glm::rotate(matrix, (GLfloat) M_PI*deltaTime, glm::vec3(0.0, 1.0, 0.0));
    for (GLuint i = 0; i < this->m_Entries.size(); i++) 
        this->m_Entries[i].setModelMatrix(matrix);
    


相机的代码是:

void Camera::updateVectors() 
    GLfloat radius = glm::length(center - position);
    position.x = radius * cos(glm::radians(this->yaw)) * cos(glm::radians(this->pitch));
    position.y = radius * sin(glm::radians(this->pitch));
    position.z = radius * sin(glm::radians(this->yaw)) * cos(glm::radians(this->pitch));
    this->front = glm::normalize(center - position);
    this->right = glm::normalize(glm::cross(this->front, this->worldUp));
    this->up = glm::normalize(glm::cross(this->right, this->front));

【问题讨论】:

“波斯王子”是您为Third-Person View 取的名字吗?无论如何,我没有看到有人问。 我知道第三人称相机但在波斯王子中它的行为与普通射击游戏不同,我添加了一张图片来描述更多我想要的东西 您想为您的相机基地添加一个行为,可能是与对象的距离。也许添加一个阈值,如果 camera.pos - object.pos @DraykoonD 来计算字符的前向量我从它的矩阵glm::vec3 f(matrix[0][2], matrix[1][2], matrix[2][2]) 中得到它,因为我读到它是 3*3 矩阵的第三行,然后将它添加到当前相机位置但是这会使相机沿其正面方向而不是角色方向移动 @DraykoonD 是的,我做到了,前面的向量应该是glm::vec3 f(matrix[2][0], matrix[2][1], matrix[2][2]),你的评论应该是正确的答案,所以你能把它作为答案吗? 【参考方案1】:

您想为您的相机基地添加一个行为,可能是与对象的距离。也许添加一个阈值,如果 camera.pos - object.pos

对于您的图像,您可以计算对象所面对的矢量。

当您输入“z,q,s,d”时,您应该以相同的量移动角色和相机

【讨论】:

以上是关于OpenGL模拟波斯王子相机的主要内容,如果未能解决你的问题,请参考以下文章

骨骼动画是啥原理?

OpenGL如何向上移动相机然后回到网格上

Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图

OpenGL - 让相机移动

OpenGL:相机和对象

OpenGL - C++:Opengl Development Cookbook 中的免费相机