120 lines
4.1 KiB
C++
120 lines
4.1 KiB
C++
#include "vulkan_app.hpp"
|
|
|
|
namespace vapp{
|
|
|
|
void Camera::setOthographicProjection(float left, float right, float bottom, float top){
|
|
|
|
}
|
|
|
|
void Camera::setPerspectiveProjection(float fovy, float aspect, float zNear, float zFar){
|
|
|
|
}
|
|
|
|
void Camera::setViewDirection(glm::vec3 position, glm::vec3 direction, glm::vec3 up) {
|
|
const glm::vec3 w{glm::normalize(direction)};
|
|
const glm::vec3 u{glm::normalize(glm::cross(w, up))};
|
|
const glm::vec3 v{glm::cross(w, u)};
|
|
|
|
viewMatrix = glm::mat4{1.f};
|
|
viewMatrix[0][0] = u.x;
|
|
viewMatrix[1][0] = u.y;
|
|
viewMatrix[2][0] = u.z;
|
|
viewMatrix[0][1] = v.x;
|
|
viewMatrix[1][1] = v.y;
|
|
viewMatrix[2][1] = v.z;
|
|
viewMatrix[0][2] = w.x;
|
|
viewMatrix[1][2] = w.y;
|
|
viewMatrix[2][2] = w.z;
|
|
viewMatrix[3][0] = -glm::dot(u, position);
|
|
viewMatrix[3][1] = -glm::dot(v, position);
|
|
viewMatrix[3][2] = -glm::dot(w, position);
|
|
}
|
|
|
|
void Camera::setViewTarget(glm::vec3 position, glm::vec3 target, glm::vec3 up) {
|
|
setViewDirection(position, target - position, up);
|
|
}
|
|
|
|
void Camera::setViewYXZ(glm::vec3 position, glm::vec3 rotation) {
|
|
const float c3 = glm::cos(rotation.z);
|
|
const float s3 = glm::sin(rotation.z);
|
|
const float c2 = glm::cos(rotation.x);
|
|
const float s2 = glm::sin(rotation.x);
|
|
const float c1 = glm::cos(rotation.y);
|
|
const float s1 = glm::sin(rotation.y);
|
|
const glm::vec3 u{(c1 * c3 + s1 * s2 * s3), (c2 * s3), (c1 * s2 * s3 - c3 * s1)};
|
|
const glm::vec3 v{(c3 * s1 * s2 - c1 * s3), (c2 * c3), (c1 * c3 * s2 + s1 * s3)};
|
|
const glm::vec3 w{(c2 * s1), (-s2), (c1 * c2)};
|
|
viewMatrix = glm::mat4{1.f};
|
|
viewMatrix[0][0] = u.x;
|
|
viewMatrix[1][0] = u.y;
|
|
viewMatrix[2][0] = u.z;
|
|
viewMatrix[0][1] = v.x;
|
|
viewMatrix[1][1] = v.y;
|
|
viewMatrix[2][1] = v.z;
|
|
viewMatrix[0][2] = w.x;
|
|
viewMatrix[1][2] = w.y;
|
|
viewMatrix[2][2] = w.z;
|
|
viewMatrix[3][0] = -glm::dot(u, position);
|
|
viewMatrix[3][1] = -glm::dot(v, position);
|
|
viewMatrix[3][2] = -glm::dot(w, position);
|
|
}
|
|
|
|
void Vulkan::handleKeyboardInput(){
|
|
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
|
|
cameraPos.x += 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
|
|
cameraPos.x -= 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
|
|
cameraPos.y -= 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
|
|
cameraPos.y += 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
|
|
cameraPos.x += 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
|
|
cameraPos.x -= 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS){
|
|
cameraPos.z += 0.001f;
|
|
}
|
|
if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS){
|
|
cameraPos.z -= 0.001f;
|
|
}
|
|
}
|
|
|
|
void Vulkan::handleMouseInput(GLFWwindow* window, double xpos, double ypos){
|
|
double xoffset = xpos - (_width / 2.0);
|
|
double yoffset = ypos - (_height / 2.0);
|
|
|
|
glfwSetCursorPos(window, _width / 2.0, _height / 2.0);
|
|
|
|
float sensitivity = 0.001f;
|
|
xoffset *= sensitivity;
|
|
yoffset *= sensitivity;
|
|
|
|
// Winkel aktualisieren
|
|
yaw += xoffset;
|
|
pitch += yoffset;
|
|
|
|
// Optional: pitch begrenzen
|
|
if(pitch > 89.0f)
|
|
pitch = 89.0f;
|
|
if(pitch < -89.0f)
|
|
pitch = -89.0f;
|
|
|
|
// Berechnung des neuen Richtungsvektors
|
|
glm::vec3 direction;
|
|
direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
direction.y = sin(glm::radians(pitch));
|
|
direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
direction = glm::normalize(direction);
|
|
|
|
// Der neue "Look-at"-Punkt ergibt sich aus der Kameraposition plus diesem Richtungsvektor
|
|
cameraFront = cameraPos + direction;
|
|
|
|
}
|
|
} |