Odprojektowywanie sceny dla uzyskania wspolrzednych świata


#1

Dzień dobry,
Potrzebuję pomocy z translacja współrzędnych okna na wspołrzędne w świecie w OpenGL.

Obecnie próbuję uzyskać współrzędne na scenie 2d za pomocą współrzędnych myszki na oknie, a następnie chciałbym zrobić to dla sceny z narzuconą perspektywą. Byłbym bardzo wdzięczny gdyby ktoś był w stanie wyjaśnić jak to się odbywa.

Oto mój kod.

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <iostream>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

static void cursorPositionCallback(GLFWwindow *window, double xpos, double ypos);
void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods);

GLint _coordsize = 25;

int main(void) {

	GLFWwindow *window;

	// Inicjalizacja GLFW.
	if (!glfwInit()) { return -1; }

	// Utworzenie okna i kontekstu OpenGL.
	window = glfwCreateWindow(640, 480, "OpenGL Project Tutorial", NULL, NULL);

	if (!window) {
		glfwTerminate();
		return -1;
	}

	// Utworzenie kontekstu okna jako aktualne
	glfwMakeContextCurrent(window);

	glfwSetCursorPosCallback(window, cursorPositionCallback);
	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
	glfwSetMouseButtonCallback(window, mouseButtonCallback);

	glViewport(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT); // Określenie części okna w której OpenGL będzie malował. Konwersja przez normalizację do pikseli.
	glMatrixMode(GL_PROJECTION); // Macierz projekcji, definiuje właściwości kamery która wyświetla obiekty w ramce współrzędnych świata.
	glLoadIdentity(); // Zamienia obecna macierz z macierza tozsamosci poniewaz transformaty "glOrtho czy glRotate" w zasadzie stawiają nas w punkcie (0,0,0)
	//glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, 0, 1); // Ustawienie układu współrzędnych
	glOrtho(0, _coordsize, 0, _coordsize, 0, 1);
	glMatrixMode(GL_MODELVIEW); // Macierz modelowania (w trybie domyślnym), określa w jaki sposób przekształcane są obiekty w świecie (translacja, rotacja, skalowanie). 
	glLoadIdentity();


	GLdouble x, y;


	// petla dopoki uzytkownik nie zamknie okna
	while (!glfwWindowShouldClose(window)) {
		glClear(GL_COLOR_BUFFER_BIT);

		// Renderowanie sceny OpenGL
		glfwGetCursorPos(window, &x, &y);

			// Rysowanie siatki
			glColor3f(0.0f, 1.0f, 0.0f);

			// Pionowo
			for (GLfloat i = 0.0f; i < _coordsize; i += 1.0f) {
				glBegin(GL_LINE_STRIP);
				glVertex2f(i, 0.0f); glVertex2f(i, _coordsize);
				glEnd();
			}

			// Poziomo
			for (GLfloat i = 0.0f; i < _coordsize; i += 1.0f) {
				glBegin(GL_LINE_STRIP);
				glVertex2f(0.0f, i); glVertex2f(_coordsize, i);
				glEnd();
			}

			glColor3f(1.0f, 1.0f, 1.0f);
			glBegin(GL_TRIANGLES);
			glVertex2f(4.0f, 4.0f);
			glVertex2f(3.0f, 2.0f);
			glVertex2f(5.0f, 2.0f);
			glEnd();
			

		// Zmiana buforow przedniego z tylnim.
		glfwSwapBuffers(window);

		// Ankietowanie zdarzen
		glfwPollEvents();
	}
}

static void cursorPositionCallback(GLFWwindow *window, double xpos, double ypos)
{
	std::cout << xpos << " : " << ypos << std::endl;
}

void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods)
{
	if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
	{
		glColor3f(1.0f, 1.0f, 1.0f);
		std::cout << "Lewy przycisk nacisniety" << std::endl;
	}
}