Jan 8, 2015

Today I've implemented character selecting (same way as in any rts game). Most interesting upgrade was to create raycast from cursor position rather then just directly raycasting from camera. I used the guide located in here: Mouse Picking with Ray Casting

Since I am using glm and glfw, my function looks like this:
glm::vec3 GraphicsMain::GetMouseRay(){
    // Get mouse position
    double xpos, ypos;
    glfwGetCursorPos(window, &xpos, &ypos);

    float x = (2.0f * xpos) / res_x - 1.0f;
    float y = 1.0f - (2.0f * ypos) / res_y;
    glm::vec3 tmp_vec3 = glm::vec3 (x, y, 1.f);

    glm::vec4 tmp_vec4 = glm::vec4 (tmp_vec3.x, tmp_vec3.y, -1.f, 1.f);
    tmp_vec4 = glm::inverse(ProjectionMatrix) * tmp_vec4;
    tmp_vec4 = glm::vec4 (tmp_vec4.x, tmp_vec4.y, -1.0, 0.0);
    tmp_vec4 = (glm::inverse(ViewMatrix) * tmp_vec4);
    tmp_vec4 = glm::normalize(tmp_vec4);

    tmp_vec3 = glm::vec3(tmp_vec4.x, tmp_vec4.y, tmp_vec4.z);

    return tmp_vec3;
}

After failing a ton of time with overlapping query in PhysX, I've decided to just roll simple check to get selection for models. I guess the check could be somehow more simple but this will do for now:

if(x_min <= models_list.at(i)->position.x &&
models_list.at(i)->position.x <= x_max &&
z_min <= models_list.at(i)->position.z &&
models_list.at(i)->position.z <= z_max)

I think next I should try implementing moving the group in formation, or at least in a way where all the models are not trying to move on to each other. But that will be implemented on the next post.

Models trying to move to same position, quite dumb result

No comments:

Post a Comment