Как отобразить 3D-объекты, используя 2D-координаты экрана в 3D-координатах мира - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь разместить 3D-объект, используя координаты экрана. Это означает, что я хочу написать функцию, например show3DObject, для отображения объекта, например, в позиции x при 250 и позиции y при 520 (мой размер экрана 1920x1080).

glm::vec3 CImage::show3DObject(float x, float y)
{
    float screenW = 1920;
    float screenH = 1080;
    float xPosition = x;
    float yPosition = y;

    xPosition = xPosition * 2 / screenW - 1;
    yPosition = yPosition * (-2 / screenH) + 1;
    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH);
    glm::mat4 projectionMatrix = glm::ortho(0.0f, screenW, screenH, 0.0f, -1.0f, 1.0f);
    glm::mat4 model = glm::mat4(1.0f);
    glm::vec2 pixel_pos = glm::vec2(xPosition, screenH - yPosition);
    glm::vec3 world = glm::unProject(glm::vec3(pixel_pos, 0), model, projectionMatrix, viewport);

    return world;
}

Я использую ассимп для загрузить 3D-объекты с помощью OpenGL 3.3. Windows 10.0 Visual Studio 2017.

Вот мой вершинный шейдер:

    #version 330

    layout(std140) uniform Matrices 
    {
        mat4 projMatrix;
        mat4 viewMatrix;
        mat4 modelMatrix;
    };

    in vec3 position;
    in vec3 normal;
    in vec2 texCoord;
    out vec4 vertexPos;
    out vec2 TexCoord;
    out vec3 Normal;
    void main() 
    {
        Normal = normalize(vec3(viewMatrix * modelMatrix * 
        vec4(normal,0.0)));
        TexCoord = vec2(texCoord);
        gl_Position = projMatrix * viewMatrix * modelMatrix * 
        vec4(position,1.0);
    };

Вот мой фрагментный шейдер:

    #version 330

    layout (std140) uniform Material 
    {
        vec4 diffuse;
        vec4 ambient;
        vec4 specular;
        vec4 emissive;
        float shininess;
        int texCount;
    };
    uniform sampler2D texUnit;
    uniform int renderType;
    in vec3 Normal;
    in vec2 TexCoord;
    out vec4 output;

    void main() 
    {
        vec4 color;
        vec4 amb;
        float intensity;
        vec3 lightDir;
        vec3 n;
        lightDir = normalize(vec3(0.0,0.0,0.0));
        n = normalize(Normal);
        intensity = max(dot(lightDir,n),0.0);
        color = texture(texUnit, TexCoord);
        amb = color * 0.99;
        output = (color * intensity) + amb;
    };
...