C++ 在程序运行时移动世界原点
我正在制作一个3D游戏,设置在太空中,小行星在旋转,各个区域都可以移动。在我开始注意到一些奇怪的东西之前,我在这方面没有太多问题。我实施了一个非常基本的碰撞系统来撞击小行星,看起来像这样: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 <<
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;
}