首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL imgui滑块范围

OpenGL imgui滑块范围
EN

Stack Overflow用户
提问于 2019-10-13 18:31:09
回答 1查看 5.7K关注 0票数 2

我使用OpenGL创建了一个960x540窗口。这里呈现一个纹理,并使用伊姆吉实现一个滑块,让我在运行时转换x、y和z位置。

代码语言:javascript
复制
int window_width = 960;
int window_height = 540;

window = glfwCreateWindow(window_width, window_height, "Object Oriented OpenGL", NULL, NULL);

首先,我设置了滑块默认值。

代码语言:javascript
复制
glm::vec3 model_matrix_translation(200, 200, 0);

在后面的循环中,只要打开窗口,就会逐帧呈现对象的位置,我将ImGui::SliderFloat3 v_minv_max参数设置为窗口的维度。看起来所有3个滑块x、y和z都使用这些值,但是有方法为每个滑动块设置一个范围吗?如你所见,y轴的滑块可以超过540。

代码语言:javascript
复制
while (!glfwWindowShouldClose(window))
{
    // renderer and other code before this point
    {
        ImGui::SliderFloat3("Model Matrix Translation", &model_matrix_translation.x, 0.0f, 960.0f); 
    }
    ImGui::Render();
    ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());

    glfwSwapBuffers(window); 
    glfwPollEvents();
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-14 08:44:00

实现 of SliderFloat3将委托给SliderScalarN,即实施

代码语言:javascript
复制
bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power)
{
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    bool value_changed = false;
    BeginGroup();
    PushID(label);
    PushMultiItemsWidths(components, CalcItemWidth());
    size_t type_size = GDataTypeInfo[data_type].Size;
    for (int i = 0; i < components; i++)
    {
        PushID(i);
        if (i > 0)
            SameLine(0, g.Style.ItemInnerSpacing.x);
        value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, power);
        PopID();
        PopItemWidth();
        v = (void*)((char*)v + type_size);
    }
    PopID();

    const char* label_end = FindRenderedTextEnd(label);
    if (label != label_end)
    {
        SameLine(0, g.Style.ItemInnerSpacing.x);
        TextEx(label, label_end);
    }

    EndGroup();
    return value_changed;
}

就您的目的而言,您将需要使用此函数的修改版本,该版本将v_minv_maxv一起移动,因此在修改后的函数中,将For循环的最后一行更改为:

代码语言:javascript
复制
v = (void*)((char*)v + type_size);
v_min = (void*)((char*)v_min + type_size);
v_max = (void*)((char*)v_max + type_size);

或者将整个函数专门化为接受float*,然后只需执行v++, v_min++, v_max++;

最后,您可以按以下方式调用修改后的函数:

代码语言:javascript
复制
float mins[] = {0.0f, 0.0f, 0.0f};
float maxs[] = {960.0f, 540.0f, 0.0f};
MyModifiedSliderFloat3("Model Matrix Translation", &model_matrix_translation.x, mins, maxs);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58366588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档