在 Opengl 中通过鼠标移动形状

2023-12-30

void Rectangle(void) { 

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(m_x-0.25,m_y-0.25);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(m_x-0.25,m_y-0.75);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(m_x-0.75,m_y-0.75);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(m_x-0.75,m_y-0.25);
glEnd();
glutSwapBuffers();

我想将矩形移动到按下鼠标的位置。 m_x 和 m_y 是全局变量。该函数在主 glutDisplayFunc(Rectangle) 中调用了鼠标函数,如下所示:

void mouse(int button,int state,int x,int y)  
  switch(button)
{
case GLUT_LEFT_BUTTON:
    if(state==GLUT_DOWN)
    {
        m_x=x;
        m_y=y;
        Rectangle();
        glutSwapBuffers();
    }
    break;

default:
    break;

}

当应用程序运行时,它在我按下鼠标后绘制一个矩形,矩形丢失了。我的错是什么?


不要像那样在鼠标处理程序中渲染内容,只需更新对象位置并使用以下命令对重绘进行排队glutPostRedisplay():

#include <GL/glut.h>

float objX = 100;
float objY = 100;
float objSize = 50;
bool dragging = false;
void mouse( int button, int state, int x, int y )
{
    if( GLUT_DOWN == state )
    {
        bool colliding = 
            objX - objSize <= x && x <= objX + objSize
            &&
            objY - objSize <= y && y <= objY + objSize;
        if( colliding )
        {
            dragging = true;
            objX = x;
            objY = y;
            glutPostRedisplay();
        }
    }
    else
    {
        dragging = false;
    }
}

void motion( int x, int y )
{
    if( dragging )
    {
        objX = x;
        objY = y;
        glutPostRedisplay();
    }
}

void drawRect( float x, float y, float size )
{
    glPushMatrix();
    glTranslatef( x, y, 0.0f );
    glScalef( size, size, 1.0f );
    glBegin( GL_QUADS );
    glColor3ub( 255, 255, 255 );
    glVertex2f( -1, -1 );
    glVertex2f(  1, -1 );
    glVertex2f(  1,  1 );
    glVertex2f( -1,  1 );
    glEnd();
    glPopMatrix();
}

void display()
{
    glClearColor( 0, 0, 0, 1 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    const double w = glutGet( GLUT_WINDOW_WIDTH );
    const double h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho( 0, w, h, 0, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    drawRect( objX, objY, objSize );

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 600, 600 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutMouseFunc( mouse );
    glutMotionFunc( motion );
    glutMainLoop();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Opengl 中通过鼠标移动形状 的相关文章

  • WPF:动画不流畅

    我正在制作一个动画TextBlock 60秒后增加FontSize从 8 点到 200 点 一切工作正常 除了我的动画随着文本的增长而上下移动 为什么会发生这种情况 是否可以避免这种情况 我有一个非常简单的 XAML 文件
  • 如何用 5000 个 PNG 文件创建电影?

    嗯 简单的情况 我已经创建了大约 5000 个帧作为 PNG 文件 我想将它们显示为 NET 应用程序中的动画 每个图像的大小均为 1920x1080 PNG 文件使用 Alpha 通道实现 部分 透明度 这会让事情变得有点复杂 因为我更愿
  • SVG - 可以在一侧添加笔画破折号渐变或透明形式

    我创建了一个 SVG 动画 在其中允许中风虚线阵列移动 我是否可以在中风破折号数组的尾部添加渐变并保持一侧透明 如示例中所示 svg main width 700px margin 30px auto position relative s
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • wglCreateContextAttribsARB 函数崩溃

    我尝试写下代码 我有InitializeOGL 的代码 bool Ogl InitializeOGL bool vSync cout lt lt Init OpenGL lt
  • 帧缓冲区和在 opengl 中使用着色器

    我对帧缓冲区有点困惑 我想要做的是使用附加了多个纹理的帧缓冲区 填充每个纹理 然后使用着色器组合 混合 所有纹理以创建新的输出 听起来很容易 是的 我也是这么想的 但我不明白 如何将当前绑定的纹理传递给着色器 您需要的是将纹理放入特定的槽中
  • jQuery 动画:鼠标移开后停止动画

    我正在尝试做一个div悬停时滑出和滑入 即鼠标分别进入和离开 然而 当我多次徘徊进出时 div基本上不断地来回滑动 直到我悬停的次数为止 请参考这个jsFiddle 示例 http jsfiddle net sikusikucom TQz5
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • 将图像作为球分配给 SKShapeNode - Spritekit 游戏

    我正在尝试在 Swift 2 Sprite kit 游戏中向我的球添加图像 我有一个make ball 函数 但在游戏场景中没有错误 当调用该方法时 我不断收到此错误 无法分配 SKShapeNode 来输入 Ball 我不知道如何修复 并
  • iPhone 4 上不稳定的 CSS3 动画

    我有一个非常简单的 或者至少我认为是 动画 我所做的只是 webkit background size 的动画 bubble position relative width 397px height 326px background url
  • Flipboard 动画

    有谁知道如何构建像 Flipboard 应用程序一样的翻转动画 谢谢 如果你指的是翻页过渡 请查看我编写的 OpenGL 过渡类 https github com epatel EPGLTransitionView https github
  • animation.start() 或animation.startNow() 不会立即开始动画

    我有一个奇怪的问题 有时应该淡出我的控件 ImageButton 的动画不会立即启动 我使用淡出动画来隐藏它 然后在 myListener 的末尾 onAnimationEnd 中 我将新资源作为按钮上的图像 我的应用程序代码中的某处 An
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • glColor4f() - alpha 值的效果

    我正在使用 glColor4f 令人惊讶的是 更改 alpha 即第四个参数 不会导致透明度发生任何变化 代码段是 const GLfloat squareVertices 0 5 0 5 0 0 0 5 0 5 0 0 0 5 0 5 0
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • Godot:检测 Area2D 内部的“鼠标按下”和 Area2D 外部的“鼠标向上”

    我想检测 Area2D 内部的鼠标单击 并按住 然后检测 Area2D 内部或外部的鼠标释放 这是我到目前为止所拥有的 extends Area2D PickArea func input event viewport event shap
  • 客户端-服务器多人 (MMO) 游戏中的移动“算法”?

    我一直在编写一个 2D flash 多人游戏和一个套接字服务器 我最初的客户端和服务器之间的移动算法计划如下 The client informs the server about the player s movement mode mo
  • 使用 TkInter 绑定设置不可交互(点击)覆盖

    我已经浏览了其他几篇关于类似问题的帖子 所有这些似乎都指向this https stackoverflow com questions 29458775 tkinter see through window not affected by
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • 将文本粘贴到 Macintosh 上的 emacs 中

    我使用的是 Macintosh 并且使用 终端 作为我的 shell 当我从任何窗口复制文本 通过鼠标拖动 然后鼠标右键菜单 gt 复制 然后将文本 鼠标右键 gt 粘贴 粘贴到运行 emacs 的终端中时 它不会充当粘贴 相反 它就像输入

随机推荐