Kamera Positon begrenzen



  • Hallo
    ich habe möchte meine Camera in OpenGl begrenzen also das ich nicht ganz frei bewegen kann das ab ich mit den hoch und runterschauen schon gemacht.
    Der Code

    #include "controlls.h"
    
    //Globel variables
    
    glm::vec3 position		= glm::vec3( 0, 0, 5 ); //position
    float horizontalAngle	= 3.14f; // horizontal angle : toward -Z
    float verticalAngle		= 0.0f; // vertical angle : 0, look at the horizon
    float initialFoV		= 45.0f; // Initial Field of View
    float speed				= 3.0f;	// 3 units / second
    float mouseSpeed		= 0.05f; //mouseSpeed
    
    glm::mat4 ViewMatrix; //ViewMmartix
    glm::mat4 ProjectionMatrix; //ProjectionMatrix
    
    glm::mat4	getProjectionMatrix(){
    	return ProjectionMatrix;
    }
    glm::mat4	getViewMatrix(){
    	return ViewMatrix;
    }
    
    void computeMatricesFromInputs(){
    	static double lastTime	= glfwGetTime(); //Wird nur ein mal am start aufgerufen
    	double currentTime		= glfwGetTime();
    	float deltaTime			= float(currentTime - lastTime);
    
    	//screen size
    	GLFWvidmode desktopMode;
    	glfwGetDesktopMode( &desktopMode);
    	int height	= desktopMode.Height;
    	int width	= desktopMode.Width;
    
    	int xpos, ypos; //x and y pos of the mouse
    
    	glfwGetMousePos(&xpos, &ypos); //get the mouse pos
    	glfwSetMousePos(height/2, width/2); //set the mouse to the middle of the screen
    
    	horizontalAngle += mouseSpeed * deltaTime * float(height/2 - xpos);
    	verticalAngle	+= mouseSpeed * deltaTime * float(width/2 -ypos);
    
    	if(verticalAngle > 0.5){
    		verticalAngle = 0.5;
    	}else if(verticalAngle < -0.25){
    		verticalAngle = -0.25;
    	}
    
    	glm::vec3 direction(
    		cos(verticalAngle) * sin(horizontalAngle),
    		sin(verticalAngle),
    		cos(verticalAngle) * cos(horizontalAngle)
    	);
    
    	// Right vector
    	glm::vec3 right = glm::vec3(
        sin(horizontalAngle - 3.14f/2.0f),
        0,
        cos(horizontalAngle - 3.14f/2.0f)
    	);
    
    	// Up vector : vertical to both direction and right
    	glm::vec3 up = glm::cross( right, direction );
    
    	//Position
    	if (glfwGetKey( 'W' ) == GLFW_PRESS){
    		position += direction * deltaTime * speed;
    	}
    	// Move backward
    	if (glfwGetKey( 'S' ) == GLFW_PRESS){
    		position -= direction * deltaTime * speed;
    	}
    	// Strafe right
    	if (glfwGetKey( 'D' ) == GLFW_PRESS){
    		position += right * deltaTime * speed;
    	}
    	// Strafe left
    	if (glfwGetKey( 'A' ) == GLFW_PRESS){
    		position -= right * deltaTime * speed;
    	}
    
    	float FoV = initialFoV - (2+speed) * glfwGetMouseWheel();
    
    	if(FoV >= 65.0f){
    		FoV = 65.0f;
    	}else if(FoV <= 35.0f){
    		FoV = 35.0f;
    	}
    
    	// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
    	ProjectionMatrix = glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);
    	// Camera matrix
    	ViewMatrix       = glm::lookAt(
    		position,           // Camera is here
    		position+direction, // and looks here : at the same position, plus "direction"
    		up                  // Head is up (set to 0,-1,0 to look upside-down)
    	);
    
    	lastTime = currentTime;
    }
    

    Aber wie mache ich das jetzt mit der hohe also das ich nicht weiter nach unten kann also auf den Boden stehe. Das müsste ich ja über der Variable "position" erreichen aber wie lese ich die x,y,z werte aus?
    Eigentlich kann das doch nicht schwer sein oder?
    Vllt bin ich einfach grade ein bisschen Brain afk oder so. Komm aber grade echt nicht drauf also wäre cool wenn jemand helfen kann.



  • Doch das kann recht kompliziert werden.
    Wenn du willst dass man auf dem Boden steht brauchst du eine Kollisionsabfrage.
    Und das kommt dann drauf an wie dein Boden aufgebaut ist.



  • Ja das ist ja nicht mein Problem also ich möchte erst mal mein Boden grade haben also auf 0 aber wie frage ich ab wo grade die Kamera ist?



  • Ähm das ist doch in "position" gespeichert ?
    Einfach "position.y" sollte reichen.



  • Ok. Ich war wohl Brain Afk 😃


Anmelden zum Antworten