【问题标题】:OpenGL - Translate an Object on a arbitrary axisOpenGL - 在任意轴上平移对象
【发布时间】:2020-06-08 17:06:27
【问题描述】:

我有一个球体和通过它的原点的轴。我想在其轴上上下平移球体。在它的起始位置没有问题,因为轴开始平行于全局 y 轴。但是一旦我旋转球体,因此球体轴也围绕 z 轴旋转,它变得复杂。

我的第一个想法是对轴进行归一化,并简单地将其用作平移矩阵中的平移向量。然后将平移矩阵与归一化轴相乘,球体应在轴上推一个单位。

这是我已经得到的代码:

class Object
{
public:
    inline Object()
        : vao(0),
        positionBuffer(0),
        colorBuffer(0),
        indexBuffer(0),
        elements(0),
        vertices(0)
    {}

    inline ~Object() { // GL context must exist on destruction
        glDeleteVertexArrays(1, &vao);
        glDeleteBuffers(1, &indexBuffer);
        glDeleteBuffers(1, &colorBuffer);
        glDeleteBuffers(1, &positionBuffer);
    }

    GLuint vao;        // vertex-array-object ID

    GLuint positionBuffer; // ID of vertex-buffer: position
    GLuint colorBuffer;    // ID of vertex-buffer: color

    GLuint indexBuffer;    // ID of index-buffer

    GLuint elements; // Number of Elements

    vector<glm::vec3> vertices;
    glm::vec3 mp;

    glm::mat4x4 model; // model matrix
};
glm::vec3 axis = glm::normalize(glm::vec3{ 
    sphereax.vertices[0].x - sphereax.vertices[1].x,
    sphereax.vertices[0].y - sphereax.vertices[1].y, 
    sphereax.vertices[0].z - sphereax.vertices[1].z}
);
translateObject(earth, axis);
void translateObject(Object &obj, glm::vec3 &translation)
{
    glm::mat4x4 trans_mat = glm::translate(glm::mat4(1.0f), translation);
    for (int i = 0; i < obj.vertices.size(); i++)
    {
        obj.vertices[i] = glm::vec3(glm::vec4(obj.vertices[i], 1.0f) * trans_mat);
    }
    obj.mp = glm::vec3(glm::vec4(obj.mp, 1.0f) * trans_mat);
}

translateObject(); 中的平移矩阵似乎是对的,但其中一个点与变换矩阵的乘积没有任何效果。

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

    我建议执行以下操作:

    1. 围绕其旋转轴旋转球体
    2. 将球体沿 x 轴与中心的距离平移
    3. 围绕世界中心旋转球体
    glm::vec3 rotation_axis      = ...; // sphere axis
    float     axis_rot_angle     = ...; // current axis rotation angle in radians
    float     distance_to_center = ...; // distance from the center of the world
    float     world_rot_angle    = ...; // current world rotation angle in radians
    
    glm::mat4 sphere_rot   = glm::rotation(glm::mat4(1.0f), axis_rot_angle, rotation_axis);
    glm::mat4 sphere_trans = glm::translate(glm::mat4(1.0f), glm::vec3(distance_to_center, 0.0f, 0.0f));
    glm::mat4 world_rot    = glm::rotation(glm::mat4(1.0f), world_rot_angle, glm::vec3(0.0f, 0.0f, 1.0f));
    
    glm::mat4 model_mat = world_rot * sphere_trans * sphere_rot;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2019-11-17
      • 2015-08-04
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多