OpenGL +围绕Point旋转Spring和Mass

时间:2016-01-30 22:48:54

标签: c++ opengl

我正在尝试用一个弹簧围绕一个质量在末端旋转的弹簧进行物理操作。我想做的是我的angularVelocity改变了我的物体被重绘的角度,但它没有进行干净的旋转,我的意思是我的弹簧质量围绕该点旋转但是它当前也围绕轴旋转顺着春天。我相当确定我计算围绕该点的旋转的公式是错误的。

这是我的更新功能,每次调用都会调用。它是计算弹簧质量重绘角度的位置。然后,对象生成器重建弹簧质量模型,重新计算顶点,使它们围绕anchorPosition旋转(目前只是原点)

5000    0   0.3048  71.3    0.00266337  121.301
6300    0   0.3048  71.3    0.00266337  119.541
8000    0   0.3048  71.3    0.00266337  117.151
10000   0   0.3048  71.3    0.00266337  115.391
12500   0   0.3048  71.3    0.00266337  112.241
16000   0   0.3048  71.3    0.00266337  108.721

下面是我的ObjectGenerator,它执行顶点数据的重新计算。它有点笨拙但它有效...除了旋转计算。底部的函数实际上是重新计算每个新顶点的位置。我猜这是在这些函数中存在错误。我从here获得了公式。重申一点,我希望我的springMass系统只需围绕anchorPosition点旋转,但是现在它沿着弹簧绕点和轴旋转。 (即从anchorPosition到质量的底部)。

void angularSpring::updateGeometry(atlas::utils::Time const& t) {
    angleDegrees = GLfloat((int(angleDegrees + angularVelocity)) % 360);
    mSpringMass = ObjectGenerator::makeAngularSpringMass(anchorPosition, springWidth2, stretched, massWidth, massHeight, angleDegrees);
    glBufferSubData(GL_ARRAY_BUFFER, 0, mSpringMass.vertexBufferSize(), mSpringMass.vertices);
    mSpringMass.cleanup();
}

1 个答案:

答案 0 :(得分:0)

我明白了。我的旋转方程中有一些错误的迹象。正确的函数如下所示:

GLfloat ObjectGenerator::getRotatedX(GLfloat angle, Vertex old, glm::vec3 anchorPosition) {
    GLfloat newX = (glm::cos(angle) * (old.position.x - anchorPosition.x)) + (glm::sin(angle) * (old.position.y - anchorPosition.y)) + anchorPosition.x;
    return newX;
}
GLfloat ObjectGenerator::getRotatedY(GLfloat angle, Vertex old, glm::vec3 anchorPosition) {
    GLfloat newY = -(glm::sin(angle) * (old.position.x - anchorPosition.x)) + (glm::cos(angle) * (old.position.y - anchorPosition.y)) + anchorPosition.y;
    return newY;
}