首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL4中旋转相机的问题

在OpenGL4中旋转相机的问题
EN

Stack Overflow用户
提问于 2019-04-11 22:26:45
回答 1查看 90关注 0票数 2

我是一个通过glm库使用现代OpenGL的初学者,我试图创建带有相机移动的键盘移动(WSAD表示向前、向后、向右)和Q& E(顺时针和逆时针)。

当我尝试在Y轴上做一个完整的旋转时,它似乎做了半个旋转,然后跳回到起点(假设是一个180度的圆弧)。虽然旋转有问题,但前进方向也有问题,它会改变,而不是直线向前移动,当我们改变旋转时,向前移动被向左或向右偏移。

代码语言:javascript
复制
    glm::vec3 eyepos = glm::vec3(-0.6f, -0.4f, 31.1f);
    glm::vec3 frontvector = glm::vec3(0.0f, 0.0f, -1.0f);//looking         pointing vector
    glm::vec3 lookvector = glm::vec3(0.0f, 0.0f, -1.0f);
    glm::vec3 flatupvec = glm::vec3(0.0f, 1.0f, 0.0f);
    glm::vec3 upvec = glm::vec3(0.0f, 1.0f, 0.0f);

    glm::mat4 viewmatrix;
    glm::mat4 projectionmatrix;//camera lens, projection matrix, need an                 aspect ratio function here /3D FOV

    GLfloat movespeed = 0.1f;
    GLfloat turnspeed = 1.0f;

    //********************MOVEMENT_TRANSFORMS***********************************
        if (kb.w == true) { eyepos += frontvector *  movespeed;         }   //move up
        if (kb.s == true) { eyepos -= frontvector *  movespeed; }   //move down
        if (kb.q == true) { glm::quat q =         glm::angleAxis(glm::radians(turnspeed),
            glm::vec3(0, 1, 0)); frontvector = (frontvector * q);         }//turn left (yaw)
        if (kb.e == true) { glm::quat q =         glm::angleAxis(glm::radians(-turnspeed), 
            glm::vec3(0, 1, 0)); frontvector = (frontvector * q);         }//turn right (yaw)
        if (kb.a == true) { eyepos -=         glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; }         //strafe left
        if (kb.d == true) { eyepos +=         glm::normalize(glm::cross(frontvector, flatupvec)) * movespeed; }         //strafe right
        if (kb.r == true) { eyepos += flatupvec * movespeed; }  //move         up
        if (kb.f == true) { eyepos -= flatupvec * movespeed; }  //move         down
                //********************ROTATIONS_EYEPOINT************************************
        if (kb.t == true) { glm::quat q = glm::angleAxis(turnspeed,         glm::vec3(1, 0, 0)); lookvector = q * lookvector; } //pitch up
        if (kb.g == true) { glm::quat q = glm::angleAxis(-turnspeed,         glm::vec3(1, 0, 0)); lookvector = q * lookvector; }//pitch down
        if (kb.z == true) { glm::quat q = glm::angleAxis(-turnspeed,         glm::vec3(0, 0, 1)); upvec = q * upvec; }  //roll left
        if (kb.x == true) { glm::quat q = glm::angleAxis(turnspeed,         glm::vec3(0, 0, 1)); upvec = q * upvec; }   //roll right
        if (kb.c == true) { glm::quat q = glm::angleAxis(turnspeed,         glm::vec3(0, 1, 0)); lookvector = q * lookvector; } //yaw left
        if (kb.v == true) { glm::quat q = glm::angleAxis(-turnspeed,         glm::vec3(0, 1, 0)); lookvector = q * lookvector; }//yaw right

        viewmatrix = glm::lookAt( eyepos, eyepos + frontvector + lookvector, upvec);
        projectionmatrix = glm::perspective(45.0f, 1.8f, 0.0001f, 500.0f);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 02:26:06

问题出在你的外貌矢量上。你的函数的工作原理是说你在(10,0,10),你正在看((10,0,10)+(0,0,-1)+(0,0,-1)),它等于(10,0,8)或一直向前。所以假设你看起来向右((10,0,10)+(0.9,0,-0.1)+(0,0,-1)),等于(10.9,0,8.9),那么一切都大致还不错。但是假设你把它几乎变成max ( (10,0,10) +(0.1,0,0.9)+(0,0,-1)),它等于(10.1,0,9.9),比较(10.1,0,9.9)和(10,0,8)到(10,0,10)仍然是相同的向量(这可以解释180度圆弧),(10,0,10)眼点和(10,0,10)看起来是模棱两可的,因此你的问题是"viewmatrix = glm:: lookat (眼点,眼点+正面向量+查找向量,upvec);“调用并同时包含frontvector和lookvector,并且程序本身就是这样,您可能希望删除该调用的frontvector部分,但这是一段不错的代码;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55634892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档