代码之家  ›  专栏  ›  技术社区  ›  Nublin

对象在相机周围保持距离c++opengl

  •  0
  • Nublin  · 技术社区  · 8 年前

    我想让物体与摄像机保持一定距离。我怎么能做到?我试过这个:

    vec3 obj_pos = -cam->Get_CameraPos() ;
    obj_pos .z -= 10.0f ;
    ...
    o_modelMatrix = glm::translate(o_modelMatrix, obj_pos);
    

    渲染完整代码:

    void MasterRenderer::renderPlane() {            
        PlaneShader->useShaderProgram();
        glm::mat4 o_modelMatrix;
        glm::mat4 o_view = cam->Get_ViewMatrix();
        glm::mat4 o_projection = glm::perspective(static_cast<GLfloat>(glm::radians(cam->Get_fov())),
            static_cast<GLfloat>(WIDTH) / static_cast<GLfloat>(HEIGHT), 0.1f, 1000.0f);
    
        glUniformMatrix4fv(glGetUniformLocation(PlaneShader->ShaderProgramID, "projection"), 1, GL_FALSE, glm::value_ptr(o_projection ));
        glUniformMatrix4fv(glGetUniformLocation(PlaneShader->ShaderProgramID, "view"), 1, GL_FALSE, glm::value_ptr(o_view ));
    
        vec3 eye_pos =  vec3(o_view [3][0], o_view [3][1], o_view [3][2]); //or cam->getCameraPosition();
        glm::vec3 losDirection = glm::normalize(vec3(0.0f, 0.0f, -1.0f) - eye_pos);
    
        vec3 obj_pos = eye_pos + losDirection * 1.0f;
    
        b_modelMatrix = scale(o_modelMatrix, vec3(20.0f));
        b_modelMatrix = glm::translate(b_modelMatrix, obj_pos );
    
       glUniformMatrix4fv(glGetUniformLocation(PlaneShader->ShaderProgramID, 
       "model"), 1, GL_FALSE, glm::value_ptr(o_modelMatrix));
        ...
        /// draw 
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Rabbid76    8 年前

    也许这是一个从臀部投篮,但我想你设置了一个 看看 矩阵,并且您的对象的位置是在世界坐标中定义的。

    照相机 摄像机观察的方向是视线,即从眼睛位置到目标位置的单位矢量。

    计算视线:

    glm::vec3 cameraPosition ...; // the eye position
    glm::vec3 cameraTarget ...;   // the traget (center) posiiton 
    glm::vec3 losDirection = glm::normalize( cameraTarget - cameraPosition );
    

    知道 观察方向(视线),则可以跳过此计算。

    如果物体总是放置在摄像机前面一定距离,则物体的位置是摄像机的位置加上视线方向上的距离:

    float distance = ...;
    float objectPosition = cameraPosition + losDirection * distance;
    glm::mat4 modelPosMat = glm::translate( glm::mat4(1.0f) , objectPosition );
    
    glm::mat4 objectModelMat = ...; // initial model matrix of the object
    o_modelMatrix = modelPosMat * objectModelMat;
    

    注意 objectModelMat glm::mat4(1.0f) .

        2
  •  0
  •   Spektre    8 年前

    因此,您希望使用摄影机移动对象(而不是使用摄影机跟随之类的对象移动摄影机)。如果这只是为了一些人 图形用户界面

    1. 定义

      3D 4x4 homogenuous transform matrices (阅读链接,了解如何分离/构建所需内容)。让我们定义一些我们需要的矩阵:

      • C -逆摄像机矩阵(无投影)
      • M -直接对象矩阵
      • R -直接对象旋转

      X,Y,Z O 是原点。直接矩阵是指矩阵直接表示坐标系,逆是指它是此类矩阵的逆。

    2. 所以我们想要构建 所以它被放置在一定距离 d C 并且有旋转 R .我假设您使用透视投影 C -Z 轴所以你需要做的是计算 M .这很容易,你只要这样做:

      iC = inverse(C); // get the direct matrix of camera
      M  = R; // set rotation of object
      M.O = iC.O - d*iC.Z; // set position of object
      

      这个 M.O = (M[12],M[13],M[14]) iC.Z = (iC.Z[8],iC.Z[9],iC.Z[10])

      OpenGL 矩阵约定和乘法顺序。如果您使用 取而代之的是惯例 M,R 是相反的和 是直接矩阵,因此需要相应地更改方程。对不起,我没有使用 GLM公司 因此,我没有信心为您生成任何代码。

      如果您也想在对象旋转上应用相机旋转,则需要更改

      M = R M = R*iC M = iC*R

      这取决于你想要达到什么效果。

        3
  •  0
  •   Nublin    8 年前

    obj_pos = glm::normalize(glm::cross(vec3(0.0f, 0.0f, -1.0f), vec3(0.0f, 1.0f, 0.0f)));
    o_modelMatrix[3][0] = camera_pos.x;
    o_modelMatrix[3][1] = camera_pos.y;
    o_modelMatrix[3][2] = camera_pos.z + distance;
    o_modelMatrix = glm::translate(o_modelMatrix, obj_pos);