如何围绕任意轴旋转点?

问题描述 投票:1回答:1

我想绕任意轴旋转OpenGL中的一个点。我想利用它来旋转球体。

这是我到目前为止所得到的:

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 });
}

如果给定轴恰好在全局轴之一上,则此方法很好。但是,如果不是,并且给定的轴基本上围绕其他东西旋转。它绕着某种轴旋转,但是一旦更改给定轴,例如绕z轴旋转,它就会绕完全不同于以前的轴旋转。看起来,给定轴可以在每个位置上都存在对象实际绕着旋转的其他轴。

感谢您的任何帮助!

c++ opengl glm-math
1个回答
0
投票

我建议使用旋转矩阵。用glm::rotate()通过glm::rotate()设置rotation matrix。将点转换为axis and angle并通过旋转矩阵对其进行转换:

glm::vec4
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
© www.soinside.com 2019 - 2024. All rights reserved.