我有一个名为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;
}
我知道这是一个复杂的问题,但你们有什么想法我可以从哪里开始吗?
答案 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
您用作翻译的部分用于投影。