Camera3D Works!

Multiplication for the world to view matrix was just backwards.
This commit is contained in:
elipzer 2018-09-10 00:42:09 -04:00
parent 75357b330c
commit a6b8382b54
3 changed files with 11 additions and 63 deletions

View File

@ -17,7 +17,7 @@ public:
) : Poseable(position, forward, up, right), m_projection_matrix(1.0f)
{}
mat4x4 get_view_projection_matrix() const { return m_orientation_matrix * m_projection_matrix; }
mat4x4 get_world_to_view_matrix() const { return m_projection_matrix * m_orientation_matrix; }
const mat4x4& get_projection_matrix() const { return m_projection_matrix; }

View File

@ -11,22 +11,17 @@
#include "MeshFactory.h"
#include "Util.h"
#define NEAR_PLANE 0.1f
#define FAR_PLANE 1000.0f
#define FIRST_VERT MyBatchTestShaderProgram::Vertex(-1.0f, 1.0f, -3.0f)
My3DScene::My3DScene(Application& application)
: Scene(application),
m_shape(MeshFactory<MyBatchTestShaderProgram::Vertex, MyBatchTestShaderProgram::Index>::gen(
DrawMode::DRAW_TRIANGLES,
FIRST_VERT,
MyBatchTestShaderProgram::Vertex(1.0f, 1.0f, -3.0f),
MyBatchTestShaderProgram::Vertex(-2.0f, -1.0f, -3.0f),
MyBatchTestShaderProgram::Vertex(2.0f, -1.0f, -3.0f)
MyBatchTestShaderProgram::Vertex(-1.0f, 1.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(1.0f, 1.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(-2.0f, -1.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(2.0f, -1.0f, 0.0f)
), DrawMode::DRAW_TRIANGLES),
m_batch(&m_shape, 2),
m_camera((float)egm::TAU_1_4, (float)m_screen_size.x / m_screen_size.y, NEAR_PLANE, FAR_PLANE, vec3(0.0f, 0.0f, -0.5f))
m_camera((float)egm::TAU_1_4, (float)m_screen_size.x / m_screen_size.y, 1.0f, 10.0f, vec3(0.0f, 0.0f, -5.0f))
{}
My3DScene::~My3DScene()
@ -101,30 +96,6 @@ void My3DScene::update(float delta_time, clock_t clock)
m_camera.translate(camera_translation * delta_time);
const MyBatchTestShaderProgram::Vertex first_vert = FIRST_VERT;
vec4 vertex_shader_position_0;
vec4 vertex_shader_position_1;
vec3 base_vertex = vec3(first_vert.x, first_vert.y, first_vert.z);
const MyBatchTestShaderProgram::Offset& offset_0 = m_batch.get_offset(0);
const MyBatchTestShaderProgram::Offset& offset_1 = m_batch.get_offset(1);
vec3 offset_vec_0 = vec3(offset_0.x, offset_0.y, offset_0.z);
vec3 offset_vec_1 = vec3(offset_1.x, offset_1.y, offset_1.z);
vec4 shader_vec_0 = vec4(base_vertex + offset_vec_0, 1);
vec4 shader_vec_1 = vec4(base_vertex + offset_vec_1, 1);
vertex_shader_position_0 = m_camera.get_view_projection_matrix() * shader_vec_0;
vertex_shader_position_1 = m_camera.get_view_projection_matrix() * shader_vec_1;
Util::set_console_position(0, 0);
std::cout << "Orientation Matrix:" << std::endl;
Util::print_matrix(m_camera.get_orientation_matrix());
std::cout << "Projection Matrix:" << std::endl;
Util::print_matrix(m_camera.get_projection_matrix());
std::cout << "View Projection:" << std::endl; // This was off on row 3 column 3
Util::print_matrix(m_camera.get_view_projection_matrix());
std::cout << "0 | Norm(0) | 1 | Norm(1):" << std::endl;
Util::print_matrix(mat4x4(vertex_shader_position_0, vertex_shader_position_0 / vertex_shader_position_0.w, vertex_shader_position_1, vertex_shader_position_1 / vertex_shader_position_1.w));
// TODO: Make a prerender function or move this to render
m_batch.prerender();
}
@ -133,7 +104,7 @@ void My3DScene::render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_shader_program.use();
glUniformMatrix4fv(3, 1, GL_FALSE, &m_camera.get_view_projection_matrix()[0][0]);
glUniformMatrix4fv(3, 1, GL_FALSE, &m_camera.get_world_to_view_matrix()[0][0]);
m_batch.render();
}

View File

@ -10,13 +10,11 @@
#include "DrawMode.h"
#include "MeshFactory.h"
#define FIRST_VERT MyBatchTestShaderProgram::Vertex(-50.0f, 50.0f, 0.0f)
MyObjectOrientedScene::MyObjectOrientedScene(Application& application)
: Scene(application),
m_shape(MeshFactory<MyBatchTestShaderProgram::Vertex, MyBatchTestShaderProgram::Index>::gen(
DrawMode::DRAW_TRIANGLES,
FIRST_VERT,
MyBatchTestShaderProgram::Vertex(-50.0f, 50.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(50.0f, 150.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(-100.0f, -50.0f, 0.0f),
MyBatchTestShaderProgram::Vertex(100.0f, -50.0f, 0.0f)
@ -95,31 +93,10 @@ void MyObjectOrientedScene::update(float delta_time, clock_t clock)
if (m_input_manager.is_key_down(GLFW_KEY_A)) camera_translation.x -= 1;
if (m_input_manager.is_key_down(GLFW_KEY_D)) camera_translation.x += 1;
m_camera.translate(camera_translation * delta_time);
const MyBatchTestShaderProgram::Vertex first_vert = FIRST_VERT;
vec4 vertex_shader_position_0;
vec4 vertex_shader_position_1;
vec3 base_vertex = vec3(first_vert.x, first_vert.y, first_vert.z);
const MyBatchTestShaderProgram::Offset& offset_0 = m_batch.get_offset(0);
const MyBatchTestShaderProgram::Offset& offset_1 = m_batch.get_offset(1);
vec3 offset_vec_0 = vec3(offset_0.x, offset_0.y, offset_0.z);
vec3 offset_vec_1 = vec3(offset_1.x, offset_1.y, offset_1.z);
vec4 shader_vec_0 = vec4(base_vertex + offset_vec_0, 1);
vec4 shader_vec_1 = vec4(base_vertex + offset_vec_1, 1);
vertex_shader_position_0 = m_camera.get_view_projection_matrix() * shader_vec_0;
vertex_shader_position_1 = m_camera.get_view_projection_matrix() * shader_vec_1;
m_camera.translate(camera_translation * delta_time * 100.0f);
Util::set_console_position(0, 0);
std::cout << "Orientation Matrix:" << std::endl;
Util::print_matrix(m_camera.get_orientation_matrix());
std::cout << "Projection Matrix:" << std::endl;
Util::print_matrix(m_camera.get_projection_matrix());
std::cout << "View Projection:" << std::endl;
Util::print_matrix(m_camera.get_view_projection_matrix());
std::cout << "0 | Norm(0) | 1 | Norm(1):" << std::endl;
Util::print_matrix(mat4x4(vertex_shader_position_0, vertex_shader_position_0 / vertex_shader_position_0.w, vertex_shader_position_1, vertex_shader_position_1 / vertex_shader_position_1.w));
Util::print_matrix(m_camera.get_world_to_view_matrix());
// TODO: Make a prerender function or move this to render
m_batch.prerender();
@ -129,6 +106,6 @@ void MyObjectOrientedScene::render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_shader_program.use();
glUniformMatrix4fv(3, 1, GL_FALSE, &m_camera.get_view_projection_matrix()[0][0]);
glUniformMatrix4fv(3, 1, GL_FALSE, &m_camera.get_world_to_view_matrix()[0][0]);
m_batch.render();
}