簡體   English   中英

OpenGL - 在任意軸上平移 Object

[英]OpenGL - Translate an Object on a arbitrary axis

我有一個球體,還有通過它的原點的軸。 我想在其軸上上下平移球體。 在它開始時 position 沒問題,因為軸開始平行於全局 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(); 似乎是對的,但是其中一個點與變換矩陣的乘法沒有效果。

我建議執行以下操作:

  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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM