使用物理库OPENGL和BULLET 3D

问题描述

我正在尝试使用子弹物理学绘制射线以击中场景中的游戏对象,因此我可以选择它,我正在使用相机矩阵绘制射线,然后在空间中拾取对象,然后进行浏览游戏对象列表,并寻找相同的位置。

在按下鼠标时,我有以下代码,它似乎已关闭并且仅在某些时候拾取项目:

    glm::vec4 lRayStart_NDC(
    ((float)lastX / (float)RECT_WIDTH - 0.5f) * 2.0f,((float)lastY / (float)RECT_HEIGHT - 0.5f) * 2.0f,-1.0,1.0f
);

glm::vec4 lRayEnd_NDC(
    ((float)lastX / (float)RECT_WIDTH - 0.5f) * 2.0f,0.0,1.0f
);


projection = glm::perspective(glm::radians(SceneManagement::getInstance()->MainCamera->GetVOW()),(float)RECT_WIDTH / (float)RECT_HEIGHT,0.1f,100.0f);
glm::mat4 InverseProjectionMatrix = glm::inverse(projection);

view = SceneManagement::getInstance()->MainCamera->GetViewMatrix();
glm::mat4 InverseViewMatrix = glm::inverse(view);

glm::vec4 lRayStart_camera = InverseProjectionMatrix * lRayStart_NDC;    
lRayStart_camera /= lRayStart_camera.w;
glm::vec4 lRayStart_world = InverseViewMatrix * lRayStart_camera; 
lRayStart_world /= lRayStart_world.w;
glm::vec4 lRayEnd_camera = InverseProjectionMatrix * lRayEnd_NDC;      
lRayEnd_camera /= lRayEnd_camera.w;
glm::vec4 lRayEnd_world = InverseViewMatrix * lRayEnd_camera;   
lRayEnd_world /= lRayEnd_world.w;

glm::vec3 lRayDir_world(lRayEnd_world - lRayStart_world);
lRayDir_world = glm::normalize(lRayDir_world);

glm::vec3 out_end = SceneManagement::getInstance()->MainCamera->GetCamPosition() + SceneManagement::getInstance()->MainCamera->GetCamFront() * 1000.0f;

btCollisionWorld::ClosestRayResultCallback RayCallback(
    btVector3(SceneManagement::getInstance()->MainCamera->GetCamPosition().x,SceneManagement::getInstance()->MainCamera->GetCamPosition().y,SceneManagement::getInstance()->MainCamera->GetCamPosition().z),btVector3(out_end.x,out_end.y,out_end.z)
);

PhysicsManager::getInstance()->dynamicsWorld->rayTest(
    btVector3(SceneManagement::getInstance()->MainCamera->GetCamPosition().x,out_end.z),RayCallback
);

if (RayCallback.hasHit()) 
{
    btTransform position = RayCallback.m_collisionObject->getInterpolationWorldTransform();
    printf("Collision \n");
    for (int i = 0; i < SceneManagement::getInstance()->gObjects.size(); i++)
    {
        if (SceneManagement::getInstance()->gObjects.at(i)->transform.Position.x == position.getOrigin().getX() &&
            SceneManagement::getInstance()->gObjects.at(i)->transform.Position.y == position.getOrigin().getY() &&
            SceneManagement::getInstance()->gObjects.at(i)->transform.Position.z == position.getOrigin().getZ())
        {
            int select = i;
            SceneManagement::getInstance()->SelectedGameObject = SceneManagement::getInstance()->gObjects.at(select);
            SceneManagement::getInstance()->SelectedGameObject->DisplayInspectorUI();
            return;
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)