C++ 如何围绕对象旋转相机?
我想围绕场景和位于中心的对象旋转相机。我试过这样做:C++ 如何围绕对象旋转相机?,c++,opengl,opengl-3,glm-math,coordinate-transformation,C++,Opengl,Opengl 3,Glm Math,Coordinate Transformation,我想围绕场景和位于中心的对象旋转相机。我试过这样做: glm::mat4 view; float radius = 10.0f; float camX = sin(SDL_GetTicks()/1000.0f) * radius; float camZ = cos(SDL_GetTicks()/1000.0f) * radius; view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), glm::vec3(0.0f, 0.0f, 0.0f), gl
glm::mat4 view;
float radius = 10.0f;
float camX = sin(SDL_GetTicks()/1000.0f) * radius;
float camZ = cos(SDL_GetTicks()/1000.0f) * radius;
view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(glGetUniformLocation(shader, "viewingMatrix"), 1, false, &view[0][0]);
但我的对象在屏幕上加载得更远,对象围绕场景旋转,而不是相机
这是我的顶点着色器:
void main()
{
FragPos = vec3(modelMatrix * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(modelMatrix))) * aPos;
TexCoord = aTexture;
vec4 transformedPosition = projectionMatrix * viewingMatrix * vec4(FragPos, 1.0f);
gl_Position = transformedPosition;
}
如何使摄影机在场景中旋转,而对象不旋转
我将遵循本教程,并尝试了解第一个动画中发生的情况
视图的目标(glm::lookAt的第二个参数)应该是对象的中心。对象的位置(以及对象的中心)由顶点sahder中的模型矩阵(modelMatrix
)更改
必须将对象的世界位置添加到glm::lookAt
的第一个和第二个参数中。对象的位置是模型矩阵的平移
此外,由于半径过大,因此对象距离摄影机较远
要解决您的问题,代码必须看起来像这样:
glm::mat4 view;
float radius = 2.0f;
float camX = sin(SDL_GetTicks()/1000.0f) * radius;
float camZ = cos(SDL_GetTicks()/1000.0f) * radius;
view = glm::lookAt(
glm::vec3(camX, 0.0f, camZ) + parentEntity.position,
parentEntity.position,
glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(
glGetUniformLocation(shader, "viewingMatrix"), 1, false, glm::value_ptr(view));
很抱歉,您可以忽略第一个代码块。实际上我用的是第二个。我马上编辑它modelMatrix
用于世界上的对象。视图的目标(glm::lookAt的第二个参数)应该是对象的中心。对象的位置(以及对象的中心)由模型矩阵(modelMatrix
)更改。必须将对象的世界位置添加到glm::lookAt
的第一个和第二个参数中。确定。关于modelMatrix
,我到底需要更改什么?将其添加到我的问题中。是的,radius
太大,所以我将其减小到2.0f
。你可以把你的答案贴在下面,我会接受的。谢谢你的帮助。
glm::mat4 view;
float radius = 2.0f;
float camX = sin(SDL_GetTicks()/1000.0f) * radius;
float camZ = cos(SDL_GetTicks()/1000.0f) * radius;
view = glm::lookAt(
glm::vec3(camX, 0.0f, camZ) + parentEntity.position,
parentEntity.position,
glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(
glGetUniformLocation(shader, "viewingMatrix"), 1, false, glm::value_ptr(view));