Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在程序运行时移动世界原点_C++_Opengl_Glm Math - Fatal编程技术网

C++ 在程序运行时移动世界原点

C++ 在程序运行时移动世界原点,c++,opengl,glm-math,C++,Opengl,Glm Math,我正在制作一个3D游戏,设置在太空中,小行星在旋转,各个区域都可以移动。在我开始注意到一些奇怪的东西之前,我在这方面没有太多问题。我实施了一个非常基本的碰撞系统来撞击小行星,看起来像这样: if (std::abs(glm::distance(glm::vec3(vec[i][12], vec[i][13], vec[i][14]), camera3D.getPosition())) <= 40.0f) { std::cout << std::endl <<

我正在制作一个3D游戏,设置在太空中,小行星在旋转,各个区域都可以移动。在我开始注意到一些奇怪的东西之前,我在这方面没有太多问题。我实施了一个非常基本的碰撞系统来撞击小行星,看起来像这样:

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));
}
因此,位置由透视矩阵(我从相机中获取)*模型矩阵*vec4(顶点位置,1.0)确定,其中顶点位置从布局中传递到位置0,位置0是每个网格顶点所在的缓冲区。如果我试图在着色器之外计算这个位置,我通常会在内存泄漏中运行,所以


问题2:是否有方法从顶点着色器获取此位置?

?同一参考系中的每个坐标使用相同的原点。所以如果你移动原点,参考系中的所有物体都会均匀移动,这意味着零相对运动。移动原点仅在您相对谈论两个或多个参考帧时才有意义。如果你想移动哪个点对应于相对于你所有物体的原点,你必须移动你所有的物体。mh,我明白了,所以我必须保持正常的世界原点(我用它来决定小行星在世界上的位置)然后,当我计算相机和小行星之间的相对距离时,使用相机的位置作为中心,因此,我不应该使用小行星的坐标,而应该使用小行星的坐标——glm::distance函数中相机的坐标?@genpfault这似乎是一个可能的解决方案,但我太缺乏经验,无法从代码的角度理解如何实现它
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();
}
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;
}