Umrechnung von x,y-2d Koordinaten auf x,z-3d Koordinaten Formel



  • Hi Leute,
    versuche gerade anhand von sfml-2d-Koordinaten einen Punkt in Opengl zu zeichnen und es will nicht so recht klappen, weil die Formel nicht richtig ist.

    Die Frage ist nun: Gibt es eine Formel mithilfe derer man den roten Punkt an der richtigen Stelle(=dort, wo geklickt wurde) in der 3d-Welt zeichnen kann (also auch außerhalb des weißen Feldes; wenn man auf den Himmel clickt, dann soll der Punkt natürlich irgendwo am Horizont sein)?

    Da es keinen funktionierenden Beispielcode für gluUnproject gibt, wollte ich erstmal versuchen zu verstehen, welche Formel man hier braucht für die x,z-Koordinaten im 3d-Raum (3d-y soll keine Rolle spielen, also in dem Fall -1.0f sein). Gibt es dafür eine Formel, wo ich meine Zahlen einsetzen kann?

    #include <SFML/Graphics.hpp>
    #include <iostream>
    #define _USE_MATH_DEFINES
    #include <math.h>
    #include <SFML/OpenGL.hpp>
    #include <gl\glu.h>
    #pragma comment(lib, "glu32")
    
    const float height = 1000;
    const float width = 1000;
    float pointx, pointz;
    
    int main()
    {
    	sf::RenderWindow window(sf::VideoMode(height, width, 32), "SFML OpenGL", sf::Style::Close);
    	glClearDepth(1);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    	gluPerspective(60,height/width,0.1f,180);
    	glTranslatef(0,0,-3);
    
        while (window.isOpen())
        {
            sf::Event event;
    		while (window.pollEvent(event))
    		{
    			switch (event.type)
    			{
    			case sf::Event::Closed:
    				window.close();
    				break;
    			case sf::Event::MouseButtonPressed:
    				if (event.mouseButton.button == sf::Mouse::Left) 
    				{
    					sf::Vector2i pixel_pos = sf::Mouse::getPosition(window);
    					sf::Vector2f coord_pos = window.mapPixelToCoords(pixel_pos);
    
    					pointx = (coord_pos.x/500)-1.0f;
    					pointz = (coord_pos.y/500)/(250/coord_pos.y)-6.0f;
    				}
    			}
    		}
    		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    		glColor3f(1,1,1); 
    		glBegin(GL_QUADS);
    		glVertex3f(-1,-1,-1);
    		glVertex3f(-1,-1,1);
    		glVertex3f(1,-1,1);
    		glVertex3f(1,-1,-1);
    		glEnd();
    		glColor3f(1,0,0); 
    		glPointSize(10);
    		glBegin(GL_POINTS);
    		glVertex3f(pointx, -1.0f, pointz);
    		glEnd( );
    		window.display();
        }
        return 0;
    }
    


  • Problem gelöst: http://nehe.gamedev.net/article/using_gluunproject/16013/

    Musste das etwas auf C++ anpassen und den Depth_Test aktivieren.


Anmelden zum Antworten