Anonymous
OpenGL 3D Cube выглядит плоским, а проблемы с движением камеры с прогнозированной проекцией
Сообщение
Anonymous » 15 мар 2025, 07:32
Im в настоящее время строит 3D -рендеринг в OpenGL. Я уже строил некоторые в прошлом с разными API (SFML), но хотел, наконец, наконец сделать «хороший» в OpenGL. Since this renderer should be part of my own little physics / game Engine I followed the game engine - tutorial Series by The Cherno:
He is building a 2D Engine so I wanted to copy the Gerneral rendererapi Abstraction Stuff и, чем построить из него 3D -рендерер. Поэтому я сменил с матрицы ортогорафической проекции на перспективу (glm :: перспектива (Fov, ....)) и активированный Gl_depth_test и Opengls Backface отбор.
Код: Выделить всё
float vertices[8 * 3] =
{
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f
};
uint32_t indices[36] =
{
0, 1, 2, 2, 3, 0,
1, 5, 6, 6, 2, 1,
7, 6, 5, 5, 4, 7,
4, 0, 3, 3, 7, 4,
4, 5, 1, 1, 0, 4,
3, 2, 6, 6, 7, 3
};
< /code>
Согласно следующей команде рендеринга: < /p>
glDrawElements(GL_TRIANGLES, vertexArray->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, nullptr);
< /code>
и этот шейдер: < /p>
//vertex
#version 330 core
layout(location = 0) in vec3 a_Position;
uniform mat4 u_ViewProjection;
uniform mat4 u_Model;
void main()
{
gl_Position = u_ViewProjection * u_Model * vec4(a_Position, 1.0);
}
//fragment
#version 330 core
layout(location = 0) out vec4 color;
uniform vec4 u_Color;
void main()
{
color = u_Color;
}
< /code>
Странно происходит. Сначала все выглядит правильно
Но когда я двигаюсь так:
void ExampleLayer::DoCameraMove(wxl::KeyPressedEvent& evnt)
{
const float MOVE_SPEED = 30.f;
const float FORWARD_MOVE_SPEED = 1000.f;
const float ROTATION_SPEED = 10.f;
glm::vec3 position = m_Camera.GetPosition();
glm::vec3 lookDir = -m_Camera.GetLookDir();
glm::vec3 upDir = -m_Camera.GetUpDir();
glm::vec3 rightDir = glm::normalize(glm::cross(lookDir, -upDir));
//--Movement-----------------------------------------------------------------
if (evnt.GetKeyCode() == WXL_KEY_W) {
position += lookDir * FORWARD_MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_S) {
position -= lookDir * FORWARD_MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_A) {
position -= rightDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_D) {
position += rightDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_SPACE) {
position -= upDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_LEFT_SHIFT) {
position += upDir * MOVE_SPEED * m_TS;
}
m_Camera.SetPosition(position);
//--Rotation------------------------------------------------------------------------
float rotationX = m_Camera.GetRotationX();
float rotationY = m_Camera.GetRotationY();
if (evnt.GetKeyCode() == WXL_KEY_UP) {
rotationX -= ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_DOWN) {
rotationX += ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_LEFT) {
rotationY += ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_RIGHT) {
rotationY -= ROTATION_SPEED * m_TS;
}
m_Camera.SetRotation(rotationX, rotationY,
m_Camera.GetRotationZ());
}
, кажется, не является истинным кубом, а скорее плоской платой:
Подробнее здесь:
https://stackoverflow.com/questions/795 ... e-projecti
1742013120
Anonymous
Im в настоящее время строит 3D -рендеринг в OpenGL. Я уже строил некоторые в прошлом с разными API (SFML), но хотел, наконец, наконец сделать «хороший» в OpenGL. Since this renderer should be part of my own little physics / game Engine I followed the game engine - tutorial Series by The Cherno: [youtube]JxIZbV_XjAs[/youtube] He is building a 2D Engine so I wanted to copy the Gerneral rendererapi Abstraction Stuff и, чем построить из него 3D -рендерер. Поэтому я сменил с матрицы ортогорафической проекции на перспективу (glm :: перспектива (Fov, ....)) и активированный Gl_depth_test и Opengls Backface отбор.[code]float vertices[8 * 3] = { -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f }; uint32_t indices[36] = { 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, 7, 6, 5, 5, 4, 7, 4, 0, 3, 3, 7, 4, 4, 5, 1, 1, 0, 4, 3, 2, 6, 6, 7, 3 }; < /code> Согласно следующей команде рендеринга: < /p> glDrawElements(GL_TRIANGLES, vertexArray->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, nullptr); < /code> и этот шейдер: < /p> //vertex #version 330 core layout(location = 0) in vec3 a_Position; uniform mat4 u_ViewProjection; uniform mat4 u_Model; void main() { gl_Position = u_ViewProjection * u_Model * vec4(a_Position, 1.0); } //fragment #version 330 core layout(location = 0) out vec4 color; uniform vec4 u_Color; void main() { color = u_Color; } < /code> Странно происходит. Сначала все выглядит правильно Но когда я двигаюсь так: void ExampleLayer::DoCameraMove(wxl::KeyPressedEvent& evnt) { const float MOVE_SPEED = 30.f; const float FORWARD_MOVE_SPEED = 1000.f; const float ROTATION_SPEED = 10.f; glm::vec3 position = m_Camera.GetPosition(); glm::vec3 lookDir = -m_Camera.GetLookDir(); glm::vec3 upDir = -m_Camera.GetUpDir(); glm::vec3 rightDir = glm::normalize(glm::cross(lookDir, -upDir)); //--Movement----------------------------------------------------------------- if (evnt.GetKeyCode() == WXL_KEY_W) { position += lookDir * FORWARD_MOVE_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_S) { position -= lookDir * FORWARD_MOVE_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_A) { position -= rightDir * MOVE_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_D) { position += rightDir * MOVE_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_SPACE) { position -= upDir * MOVE_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_LEFT_SHIFT) { position += upDir * MOVE_SPEED * m_TS; } m_Camera.SetPosition(position); //--Rotation------------------------------------------------------------------------ float rotationX = m_Camera.GetRotationX(); float rotationY = m_Camera.GetRotationY(); if (evnt.GetKeyCode() == WXL_KEY_UP) { rotationX -= ROTATION_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_DOWN) { rotationX += ROTATION_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_LEFT) { rotationY += ROTATION_SPEED * m_TS; } if (evnt.GetKeyCode() == WXL_KEY_RIGHT) { rotationY -= ROTATION_SPEED * m_TS; } m_Camera.SetRotation(rotationX, rotationY, m_Camera.GetRotationZ()); } [/code] , кажется, не является истинным кубом, а скорее плоской платой: Подробнее здесь: [url]https://stackoverflow.com/questions/79510629/opengl-3d-cube-appears-flat-and-camera-movement-issues-with-perspective-projecti[/url]