2017-02-20 3 views
0

Я создаю окно GLFW, и я хотел бы, чтобы нижний левый угол был источником. По какой-то причине верхний левый угол - это начало.Как установить (0, 0) положение координаты для окна GLFW

Следует также упомянуть, что я использую OSX.

Вот мой класс окна:

#include "window.h" 

namespace graphics { 
    void window_size_callback(GLFWwindow* window, int width, int height); 
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); 
    void mouse_button_callback(GLFWwindow* window, int button, int action, int mode); 
    void cursor_position_callback(GLFWwindow* window, double mouse_x, double mouse_y); 
    Window::Window(const char* title, int width, int height) { 
     m_title = title; 
     m_width = width; 
     m_height = height; 
     if (!init()) 
      glfwTerminate(); 
    } 
    Window::~Window() { 
     glfwTerminate(); 
    } 
    bool Window::init() { 
     if (!glfwInit()) { 
      std::cout << "GLFW failed to initialize!" << std::endl; 
      return false; 
     } 
     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
     m_window = glfwCreateWindow(m_width, m_height, m_title, NULL, NULL); 
     if (!m_window) { 
      glfwTerminate(); 
      std::cout << "GLFW failed to create a window!" << std::endl; 
      return false; 
     } 
     glfwMakeContextCurrent(m_window); 
     glfwSetWindowUserPointer(m_window, this); 
     glfwSetWindowSizeCallback(m_window, window_size_callback); 
     glfwSetKeyCallback(m_window, key_callback); 
     glfwSetMouseButtonCallback(m_window, mouse_button_callback); 
     glfwSetCursorPosCallback(m_window, cursor_position_callback); 
     if (glewInit() != GLEW_OK) { 
      std::cout << "GLEW failed to initialize!" << std::endl; 
      return false; 
     } 
     std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << std::endl; 
     std::cout << "OpenGL Shading Language Version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl; 
     return true; 
    } 
    void Window::update() { 
     glfwPollEvents(); 
     glfwSwapBuffers(m_window); 
    } 
    void Window::clear() const { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    } 
    bool Window::isClosed() const { 
     return glfwWindowShouldClose(m_window); 
    } 
    bool Window::isKeyPressed(unsigned int keycode) const { 
     if (keycode >= MAX_KEYS) 
      return false; 
     return m_keys[keycode]; 
    } 
    bool Window::isMouseButtonPressed(unsigned int button) const { 
     if (button >= MAX_BUTTONS) 
      return false; 
     return m_mouse_buttons[button]; 
    } 
    void Window::getMousePosition(double& x, double& y) const { 
     x = m_mouse_x; 
     y = m_mouse_y; 
    } 
    void window_size_callback(GLFWwindow* window, int width, int height) { 
     Window* win = (Window*)glfwGetWindowUserPointer(window); 
     win->m_width = width; 
     win->m_height = height; 
    } 
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { 
     Window* win = (Window*)glfwGetWindowUserPointer(window); 
     win->m_keys[key] = action != GLFW_RELEASE; 
    } 
    void mouse_button_callback(GLFWwindow* window, int button, int action, int mode) { 
     Window* win = (Window*)glfwGetWindowUserPointer(window); 
     win->m_mouse_buttons[button] = action != GLFW_RELEASE; 
    } 
    void cursor_position_callback(GLFWwindow* window, double mouse_x, double mouse_y) { 
     Window* win = (Window*)glfwGetWindowUserPointer(window); 
     win->m_mouse_x = mouse_x; 
     win->m_mouse_y = mouse_y; 
    } 
} 
+0

Происхождение для чего? Координаты мыши? – genpfault

+0

Это и opengl. @genpfault –

ответ

-1

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/

Но вот лучший способ визуализировать это: использовать правило правой рукой

  • X ваш палец
  • Y Ваш индекс
  • Z - ваш средний палец. Если вы положите

большой палец вправо и указатель к небу, он будет указывать на на спину. Наличие Z в этом направлении странно, так почему же это так? Короткий ответ: потому что 100 лет правого правильного правила игры дают вам много полезных инструментов. Единственным недостатком является неинтуитивный Z.

Это то, что вы не можете изменить, оно встроено в вашу графическую карту. Итак (-1, -1) находится в нижнем левом углу экрана. (1, -1) - нижний правый , а (0,1) - средний верх. Таким образом, этот треугольник должен взять большую часть экрана.

+0

Происхождение только жестко закодировано в NDC. Если вы примените, например, зеркальное отражение по оси y после проекции, тогда все будет вести себя так, как если бы начало было в верхнем левом углу. Просто имейте в виду, что зеркальное отображение изменяет порядок намотки полигона. – BDL

+0

О чем вы говорите? OpenGL использует нужную им систему координат. Они говорят о том, чтобы установить начало окна в * нижний левый *, как это происходит в OpenGL. Вместо этого координаты окна имеют начало в верхнем левом углу *, поэтому угол равен 0,0. – JamEngulfer

Смежные вопросы