简体   繁体   中英

How to rotate a point around an arbitrary axis?

I want to rotate a point in OpenGL around an arbitrary axis. I want to utilize that to rotate a sphere.

This is what I got so far:

float degreeBetweenTwoVec(glm::vec3 &a, glm::vec3 b)
{
    float prod = b.x * a.x + b.y * a.y + b.z * a.z;
    float mag_axis = sqrt((b.x * b.x) + (b.y * b.y) + (b.z * b.z));
    float mag_vec = sqrt((a.x * a.x) + (a.y * a.y) + (a.z * a.z));
    float degree = prod / (mag_axis * mag_vec);

    return acos(degree) * 180.0 / PI;;
}
void rotAroundZ(glm::vec3 &point, float degree) 
{
    glm::vec3 n_point;

    n_point.x = (point.x * cos(degree * PI / 180.0)) - (point.y * sin(degree * PI / 180.0));
    n_point.y = (point.x * sin(degree * PI / 180.0)) + (point.y * cos(degree * PI / 180.0));
    n_point.z = point.z;

    point.x = n_point.x;
    point.y = n_point.y;
    point.z = n_point.z;
}
void rotAroundY(glm::vec3& point, float degree)
{
    glm::vec3 n_point;

    n_point.x = (point.x * cos(degree * PI / 180.0)) + (point.z * sin(degree * PI / 180.0));
    n_point.y = point.y;
    n_point.z = ((point.x * -1.0f) * sin(degree * PI / 180.0)) + (point.z * cos(degree * PI / 180.0));;

    point.x = n_point.x;
    point.y = n_point.y;
    point.z = n_point.z;
}
void rotAroundA(glm::vec3& point, glm::vec3 &axis, float zdegree)
{
    float xdegree = degreeBetweenTwoVec(axis, glm::vec3{ 1.0f, 0.0f, 0.0f });
    float ydegree = degreeBetweenTwoVec(axis, glm::vec3{ 0.0f, 1.0f, 0.0f });

    rotAroundZ(point,  xdegree);
    rotAroundY(point,  ydegree);
    rotAroundZ(point,  zdegree);
    rotAroundY(point, -ydegree);
    rotAroundZ(point, -xdegree);
}
void rotAObject(Object& obj, glm::vec3 &axis, float degree)
{
    axis = glm::normalize(axis);
    translate(axis, glm::vec3{ axis.x, axis.y, axis.z });
    for (int i = 0; i < obj.vertices.size(); i++)
    {
        rotAroundA(obj.vertices[i], axis, degree);
    }
    rotAroundA(obj.mp, axis, degree);
    translate(axis, glm::vec3{ axis.x * -1.0f, axis.y * -1.0f, axis.z * -1.0f });
}

This works just fine if the given axis happens to be on one of the global axis. However, if it isn't and the given axis is basiclly rotating around something else. There is some kind of axis it is rotating around but as soon as change the given axis, for example rotating it around the z axis it rotates around a completlly different axis than before. It looks like for every position the given axis can take there is some other axis the object is actually rotating around.

Any help is appreciated!

I recommend to use a rotation matrix. Use glm::rotate() , to set a rotation matrix by axis and angle .
Convert the point to glm::vec4 and transform it by the rotation matrix:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
glm::mat4 rot_mat = glm::rotate(glm::mat4(1.0f), glm::radians(degree), axis);
glm::vec3 n_point = glm::vec3(glm::vec4(point, 1.0f) * rot_mat);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM