Я делаю небольшой 2D -контроллер в OpenGL. Игрок движется с Wasd, и я хочу, чтобы игрок повернулся к курсору мыши. />#include
#include
#include
#include "ShaderClass.h"
#include "vertexArray.h"
#include "vertexBuffer.h"
#include "indexBuffer.h"
#include
#include
#include
#include "shape.h"
#include "Player.h"
#include
#include
int main() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWmonitor* primaryMonitor = glfwGetPrimaryMonitor();
const GLFWvidmode* videoMode = glfwGetVideoMode(primaryMonitor);
GLFWwindow* window = glfwCreateWindow(videoMode->width, videoMode->height,
"OpenGL Window", NULL, NULL);
if (!window) {
std::cout
#include "Player.h"
#include
#include
Player::Player()
: x(0.0f), y(0.0f), speed(0.1f),
shaderProgram("res/shader/vertex.shader", "res/shader/fragment.shader") {}
void Player::init() {
float vertices[] = {
-0.05f, -0.05f, 1.0f, 0.0f, 0.0f,
0.05f, -0.05f, 0.0f, 1.0f, 0.0f,
0.0f, 0.05f, 0.0f, 0.0f, 1.0f
};
unsigned int indices[] = { 0, 1, 2 };
player.push_back(new Shape(vertices, sizeof(vertices), indices, sizeof(indices), shaderProgram));
}
void Player::move(float dx, float dy) {
x += dx * speed;
y += dy * speed;
}
float Player::calculateAngleToMouse(GLFWwindow* window,
const glm::mat4& projection,
const glm::mat4& view) {
double mouseX, mouseY;
glfwGetCursorPos(window, &mouseX, &mouseY);
int windowWidth, windowHeight;
glfwGetFramebufferSize(window, &windowWidth, &windowHeight);
// Convert mouse coordinates to NDC
float xNDC = (float(mouseX) / windowWidth) * 2.0f - 1.0f;
float yNDC = 1.0f - (float(mouseY) / windowHeight) * 2.0f;
// Unproject to world space
glm::vec4 mouseClip(xNDC, yNDC, 0.0f, 1.0f);
glm::mat4 invVP = glm::inverse(projection * view);
glm::vec4 mouseWorld = invVP * mouseClip;
mouseWorld /= mouseWorld.w;
float dx = mouseWorld.x - x;
float dy = mouseWorld.y - y;
return std::atan2(dy, dx);
}
void Player::render(const glm::mat4& projection,
GLFWwindow* window,
const glm::mat4& view,
const glm::vec3& playerpos) {
glm::mat4 model = glm::mat4(1.0f);
float angle = calculateAngleToMouse(window, projection, view);
model = glm::rotate(model, angle + glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
model = glm::translate(model, glm::vec3(x, y, 0.0f));
glm::mat4 mvp = projection * view * model;
shaderProgram.Activate();
shaderProgram.SetMatrix4("u_MVP", mvp);
for (Shape* shape : player) {
shape->Draw(shaderProgram);
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... rom-origin
Вращение игрока ломается при движении далеко от происхождения ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1755962297
Anonymous
Я делаю небольшой 2D -контроллер в OpenGL. Игрок движется с Wasd, и я хочу, чтобы игрок повернулся к курсору мыши. />#include
#include
#include
#include "ShaderClass.h"
#include "vertexArray.h"
#include "vertexBuffer.h"
#include "indexBuffer.h"
#include
#include
#include
#include "shape.h"
#include "Player.h"
#include
#include
int main() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWmonitor* primaryMonitor = glfwGetPrimaryMonitor();
const GLFWvidmode* videoMode = glfwGetVideoMode(primaryMonitor);
GLFWwindow* window = glfwCreateWindow(videoMode->width, videoMode->height,
"OpenGL Window", NULL, NULL);
if (!window) {
std::cout
#include "Player.h"
#include
#include
Player::Player()
: x(0.0f), y(0.0f), speed(0.1f),
shaderProgram("res/shader/vertex.shader", "res/shader/fragment.shader") {}
void Player::init() {
float vertices[] = {
-0.05f, -0.05f, 1.0f, 0.0f, 0.0f,
0.05f, -0.05f, 0.0f, 1.0f, 0.0f,
0.0f, 0.05f, 0.0f, 0.0f, 1.0f
};
unsigned int indices[] = { 0, 1, 2 };
player.push_back(new Shape(vertices, sizeof(vertices), indices, sizeof(indices), shaderProgram));
}
void Player::move(float dx, float dy) {
x += dx * speed;
y += dy * speed;
}
float Player::calculateAngleToMouse(GLFWwindow* window,
const glm::mat4& projection,
const glm::mat4& view) {
double mouseX, mouseY;
glfwGetCursorPos(window, &mouseX, &mouseY);
int windowWidth, windowHeight;
glfwGetFramebufferSize(window, &windowWidth, &windowHeight);
// Convert mouse coordinates to NDC
float xNDC = (float(mouseX) / windowWidth) * 2.0f - 1.0f;
float yNDC = 1.0f - (float(mouseY) / windowHeight) * 2.0f;
// Unproject to world space
glm::vec4 mouseClip(xNDC, yNDC, 0.0f, 1.0f);
glm::mat4 invVP = glm::inverse(projection * view);
glm::vec4 mouseWorld = invVP * mouseClip;
mouseWorld /= mouseWorld.w;
float dx = mouseWorld.x - x;
float dy = mouseWorld.y - y;
return std::atan2(dy, dx);
}
void Player::render(const glm::mat4& projection,
GLFWwindow* window,
const glm::mat4& view,
const glm::vec3& playerpos) {
glm::mat4 model = glm::mat4(1.0f);
float angle = calculateAngleToMouse(window, projection, view);
model = glm::rotate(model, angle + glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
model = glm::translate(model, glm::vec3(x, y, 0.0f));
glm::mat4 mvp = projection * view * model;
shaderProgram.Activate();
shaderProgram.SetMatrix4("u_MVP", mvp);
for (Shape* shape : player) {
shape->Draw(shaderProgram);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79744366/player-rotation-breaks-when-moving-far-from-origin[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия