【发布时间】: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(); 中的平移矩阵似乎是对的,但其中一个点与变换矩阵的乘积没有任何效果。
【问题讨论】: