Я строю приложение для моделирования гравитации с OpenGL, и я хочу использовать IMGUI для графического интерфейса. Все работало отлично, пока я не добавил графический интерфейс, он появляется в кадре, но элементы управления мыши там не работают, они должны иметь возможность взаимодействовать с кнопкой и прокруткой Zoom, но они не делают.
Вот моя функция для обратного вызова мыши: < /p>
void mouse_callback(GLFWwindow* window, double xpos, double ypos) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) {
return; // Check if the mouse is in GUI
}
int leftButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
int rightButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT);
if (leftButtonState == GLFW_PRESS) {
// Rotate the camera
float xOffset = xpos - lastX;
float yOffset = lastY - ypos;
lastX = xpos;
lastY = ypos;
float sensitivity = 0.1f;
xOffset *= sensitivity;
yOffset *= sensitivity;
yaw += xOffset;
pitch += yOffset;
if (pitch > 89.0f) pitch = 89.0f;
if (pitch < -89.0f) pitch = -89.0f;
}
if (rightButtonState == GLFW_PRESS) {
// Move the camera
float xOffset = xpos - lastRightX;
float yOffset = lastRightY - ypos;
lastRightX = xpos;
lastRightY = ypos;
float sensitivity = 0.05f;
cameraX -= xOffset * sensitivity;
cameraY += yOffset * sensitivity;
}
}
< /code>
Функция для Scrollback: < /p>
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;
float zoomSpeed = 5.0f;
zoomLevel -= yoffset * zoomSpeed;
}
< /code>
для обработки кнопок: < /p>
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastX, &lastY);
}
if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastRightX, &lastRightY);
}
}
< /code>
Инициализация OpenGl: < /p>
GLFWwindow* initializeOpenGL() {
if (!glfwInit()) {
return nullptr; // Initialization failed
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(800, 600, "Gravity Simulator", nullptr, nullptr);
if (!window) {
glfwTerminate(); // Window creation failed
return nullptr;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
return window;
}
< /code>
Основная функция с основным циклом: < /p>
int main(void) {
GLFWwindow* window;
// Initialize GLFW
if (!glfwInit())
return -1;
// Create a window
window = glfwCreateWindow(640, 480, "Gravity Simulator", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable V-Sync
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 130");
glfwSetFramebufferSizeCallback(window, reshape);
glfwSetScrollCallback(window, scroll_callback);
glfwSetMouseButtonCallback(window, mouse_button_callback); // For mouse click handling
glfwSetCursorPosCallback(window, mouse_callback); // For rotation
glEnable(GL_DEPTH_TEST); // Enable depth testing for proper 3D rendering
reshape(window, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 640.0 / 480.0, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
// Main loop
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
std::cout
Подробнее здесь: https://stackoverflow.com/questions/795 ... l-in-imgui
Контроль мыши в imgui ⇐ C++
Программы на C++. Форум разработчиков
1743588068
Anonymous
Я строю приложение для моделирования гравитации с OpenGL, и я хочу использовать IMGUI для графического интерфейса. Все работало отлично, пока я не добавил графический интерфейс, он появляется в кадре, но элементы управления мыши там не работают, они должны иметь возможность взаимодействовать с кнопкой и прокруткой Zoom, но они не делают.
Вот моя функция для обратного вызова мыши: < /p>
void mouse_callback(GLFWwindow* window, double xpos, double ypos) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) {
return; // Check if the mouse is in GUI
}
int leftButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
int rightButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT);
if (leftButtonState == GLFW_PRESS) {
// Rotate the camera
float xOffset = xpos - lastX;
float yOffset = lastY - ypos;
lastX = xpos;
lastY = ypos;
float sensitivity = 0.1f;
xOffset *= sensitivity;
yOffset *= sensitivity;
yaw += xOffset;
pitch += yOffset;
if (pitch > 89.0f) pitch = 89.0f;
if (pitch < -89.0f) pitch = -89.0f;
}
if (rightButtonState == GLFW_PRESS) {
// Move the camera
float xOffset = xpos - lastRightX;
float yOffset = lastRightY - ypos;
lastRightX = xpos;
lastRightY = ypos;
float sensitivity = 0.05f;
cameraX -= xOffset * sensitivity;
cameraY += yOffset * sensitivity;
}
}
< /code>
Функция для Scrollback: < /p>
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;
float zoomSpeed = 5.0f;
zoomLevel -= yoffset * zoomSpeed;
}
< /code>
для обработки кнопок: < /p>
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastX, &lastY);
}
if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastRightX, &lastRightY);
}
}
< /code>
Инициализация OpenGl: < /p>
GLFWwindow* initializeOpenGL() {
if (!glfwInit()) {
return nullptr; // Initialization failed
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(800, 600, "Gravity Simulator", nullptr, nullptr);
if (!window) {
glfwTerminate(); // Window creation failed
return nullptr;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
return window;
}
< /code>
Основная функция с основным циклом: < /p>
int main(void) {
GLFWwindow* window;
// Initialize GLFW
if (!glfwInit())
return -1;
// Create a window
window = glfwCreateWindow(640, 480, "Gravity Simulator", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable V-Sync
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 130");
glfwSetFramebufferSizeCallback(window, reshape);
glfwSetScrollCallback(window, scroll_callback);
glfwSetMouseButtonCallback(window, mouse_button_callback); // For mouse click handling
glfwSetCursorPosCallback(window, mouse_callback); // For rotation
glEnable(GL_DEPTH_TEST); // Enable depth testing for proper 3D rendering
reshape(window, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 640.0 / 480.0, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
// Main loop
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79550192/mouse-control-in-imgui[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия