无法获得对象的世界位置

时间:2015-11-03 06:55:22

标签: opengl glsl glut

我有一个名为getWorldPosition的函数,它应该返回一个vec3,表示任何VisualObject(我定义的超类)的当前位置。

glm::vec3 VisualObject::getWorldPosition()
{
    glm::mat4 totalTransformation = getParentModelMatrix() * modelMatrix;
    return totalTransformation[3].xyz;
} // end getWorldPosition

我正在尝试使用getWorldPosition函数来计算世界上两个对象之间的距离。

    for (int i = enemiesOnBoard.size() - 1; i >= 0; i--){
        EnemySphere* s = (EnemySphere*)enemiesOnBoard.at(i);
        glm::vec3 sPosition = s->getWorldPosition();
        cout << sPosition[0] << endl;
        for (int j = cannonBallsOnBoard.size() - 1; j >= 0; j--){
            CannonBall* cb = (CannonBall*)cannonBallsOnBoard.at(i);
            glm::vec3 cbPosition = cb->getWorldPosition();
            GLfloat radiiSum = s->sRadius + cb->sRadius;
            GLfloat distance = calcDistance(sPosition, cbPosition);
            //cout << distance << endl;
            if (distance < radiiSum){
                //cout << "COLLISION BABY!" << endl;
            }
        }
    }

问题是每个getWorldPosition都返回一个vec3,其中x,y,z坐标为0。

其中一个球体就是这样定义的,

    EnemySphere* s = new EnemySphere();
        enemiesOnBoard.push_back(s);
        s->setShader(glutObjectShaderProgram);
        s->addController(new EnemySphereController(rand() % 8 - 3.5, 1.0));
        s->initialize();
        addChild(s);

相关的控制器是:

EnemySphereController::EnemySphereController(GLfloat x, GLfloat r, GLfloat t)
    : Controller(), startX(x), rate(r), translation(t)
{ }

void EnemySphereController::update(float elapsedTimeSec){
    if (translation < 3.9f){
        translation += elapsedTimeSec * rate;
    }
    else {
        target->getParent()->removeChild(target->getObjectSerialNumber());
    }

    glm::mat4 t4;
    t4 = glm::translate(glm::mat4(1.0f), glm::vec3(startX, -2.50f, translation)); //add 0.5 because the sphere is calculated from the center
    target->fixedTransformation = t4;
}

我知道这是一个复杂的问题,但你们有什么想法我可以从哪里开始吗?

1 个答案:

答案 0 :(得分:0)

据我所知,世界排名位于glm::vec3(mat[3], mat[7], mat[11]),所以你应该将你的职能改为:

glm::vec3 VisualObject::getWorldPosition()
{
    glm::mat4 totalTransformation = getParentModelMatrix() * modelMatrix;
    return glm::vec3(totalTransformation[3], totalTransformation[7], totalTransformation[11]);
} // end getWorldPosition

您用作翻译的部分用于投影。