Перемещение мира происхождения во время работы программы - PullRequest
0 голосов
/ 13 февраля 2020

Я делаю трехмерную игру в космосе с вращающимися вокруг астероидами и различными секторами. У меня не было слишком много проблем, пока я не начал замечать что-то странное. Я реализовывал очень элементарную систему столкновений для удара по астероидам, которая выглядит следующим образом:

if (std::abs(glm::distance(glm::vec3(vec[i][12], vec[i][13], vec[i][14]), camera3D.getPosition())) <= 40.0f)
{
    std::cout << std::endl << "X:" << vec[i][12] << "    Y:" << vec[i][13] << "    Z:" << vec[i][14];
    std::cout << std::endl << "CAMERA POSITION:      " << "X:" << camera3D.getPosition().x << "    Y:" << camera3D.getPosition().y << "    Z:" << camera3D.getPosition().z;
    std::cout << std::endl << std::endl << "DISTANCE: " << glm::distance(glm::vec3(vec[i][12], vec[i][13], vec[i][14]), camera3D.getPosition());
    camera3D.changePosition(camera3D.getPosition() - glm::vec3(10.0f, 10.0f, 10.0f));
}

, где ve c - это вектор glm :: value_ptr, выбирающий координаты позиции из матрицы модели каждого астероида:

std::vector<const float*> vec;

for (unsigned int i = 0; i < meshModelMatrices2.size(); i++)
{
    if (alpha < 360.0f && alpha >= 0.0f)
    {
        alpha = 30.0f/100000.0f;

        meshModelMatrices2[i] *= glm::mat4
            (
            1.0f, 0.0f, 0.0f, 0.0f,
            0.0f, cos(alpha), -sin(alpha), 0.0f,
            0.0f, sin(alpha), cos(alpha), 0.0f,
            0.0f, 0.0f, 0.0f, 1.0f
            );

        meshModelMatrices2[i] *= glm::mat4(1.0f);
    }

    vec.push_back(glm::value_ptr(meshModelMatrices2[i]));

    glUniformMatrix4fv(shaderModelMatrixIDm, 1, GL_FALSE, &meshModelMatrices2[i][0][0]);

    meshRenderer2.renderMesh();
}

Код работает нормально, но я заметил, что чем дальше я уезжаю от источника мира, тем больше расстояния становятся короче, например, если я близко к источнику на расстоянии 40,0 фута от астероид означает, что я ударил его, даже если я далеко от него, но если я намного дальше от начала координат, скажем, 10000.0f, то расстояние 40.0f означает, что я должен быть в основном внутри астероида для программа, чтобы зарегистрировать его как хит. Кроме того, когда я go все дальше и дальше от источника, моя камера, кажется, замедляет свое движение. Я читал, что это может быть проблема, вызванная проблемами точности с плавающей точкой.

Мой вопрос: есть ли способ переместить начало мира вместе с моей камерой, чтобы положение камеры не менялось большие и вызывающие проблемы, когда я использую его для вычисления материала?

PS: я думаю, что нашел какой-то обходной путь, в основном в моем вершинном шейдере фактическое gl_position из сеток определяется не только матрицы моделей, вместо этого у меня есть:

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec2 vertexUV;
layout(location = 2) in vec3 vertexNormal;

uniform mat4 Perspective;
uniform mat4 CameraMatrix;
uniform mat4 ModelMatrix;
uniform vec3 LightPosition;

out vec2 UV;
out vec3 VertexWorldPosition;
out vec3 VertexToCamera;
out vec3 LightToCamera;
out vec3 VertexCameraNormal;

void main()
{
    gl_Position = Perspective * ModelMatrix * vec4(vertexPosition, 1.0);
    UV = vec2(vertexUV.x, 1.0 - vertexUV.y);

    vec3 vertexCameraPosition = (CameraMatrix * ModelMatrix * vec4(vertexPosition, 1.0)).xyz;
    VertexToCamera = (0,0,0) - vertexCameraPosition;

    vec3 lightCameraPosition = (CameraMatrix * vec4(LightPosition,1.0)).xyz;
    LightToCamera = VertexToCamera + VertexToCamera;

    VertexCameraNormal = (CameraMatrix * ModelMatrix * vec4(vertexNormal, 0)).xyz;

    VertexWorldPosition = (ModelMatrix * vec4(vertexPosition, 1.0)).xyz;
}

, поэтому позиция определяется матрицей перспективы (которую я получаю с камеры) * матрица модели * vec4 (положение вершины, 1,0), где положение вершины передается из макета в местоположение 0, которое является буфером, в котором содержатся вершины для каждого me sh. Если я пытаюсь вычислить эту позицию вне шейдера, я обычно запускаю ее из-за утечки памяти, поэтому

Вопрос 2. Есть ли способ извлечь эту позицию из вершинного шейдера?

...