繁体   English   中英

用鼠标单击OpenGL拖动3d对象

3d Object Dragging with mouse click OpenGL

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图左键单击并拖动任何3d对象,如果我放开它,它应该保持在新位置,我将如何实现呢? 3d对象是从我在头文件中拥有的绘图功能加载的。

有人说我应该使用glutMouseFunc或glutMotionFunc。

void MouseClickCallbackFunction(int button, int state, int x, int y)
{

    if (state == GLUT_DOWN) {

    if (button == GLUT_LEFT)
    {
        std::cout << "Left " << x << " " << y <<std::endl;
        leftClick.x = x;
        leftClick.y = y;
    }
    else if (button == GLUT_RIGHT_BUTTON) {

        std::cout << "Right " << x << " " << y << std::endl;
        rightClick.x = x;
        rightClick.y = y;

    }
}
    theGame->mouseClicked(button, state, x, y);
    glutPostRedisplay();

}

/* function MouseMotionCallbackFunction()
 * Description:
 *   - this is called when the mouse is clicked and moves
 */
void MouseMotionCallbackFunction(int x, int y)
{
    theGame->mouseMoved(x, y);
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    /* initialize the window and OpenGL properly */
    glutInit(&argc, argv);
    glutInitContextVersion(4, 2);
    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutCreateWindow("OpenGL Framework");

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        std::cout << "GLEW could not be initialized. \n";
        system("pause");
        return 0;
    }

    //glewInit();

    std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;

    /* set up our function callbacks */
    glutDisplayFunc(DisplayCallbackFunction);
    glutKeyboardFunc(KeyboardCallbackFunction);
    glutKeyboardUpFunc(KeyboardUpCallbackFunction);
    glutMouseFunc(MouseClickCallbackFunction);
    glutMotionFunc(MouseMotionCallbackFunction);
    glutTimerFunc(1, TimerCallbackFunction, 0);

    /* init the game */
    theGame = new Game();
    theGame->initializeGame();

    /* start the game */
    glutMainLoop();
    return 0;
         }

这是带有对象的绘制功能

void Game::draw()
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    PassThrough.Bind();
    PassThrough.SendUniformMat4("uModel", MonkeyTransform.data, false);
    PassThrough.SendUniformMat4("uView", CameraTransform.GetInverse().data, false);
    PassThrough.SendUniformMat4("uProj", CameraProjection.data, false);

    PassThrough.SendUniform("uTex", 0);
    PassThrough.SendUniform("LightPosition", CameraTransform.GetInverse() * vec4(4.0f,0.0f,0.0f,1.0f));
    PassThrough.SendUniform("LightAmbient", vec3(0.15f, 0.15f, 0.15f));
    PassThrough.SendUniform("LightDiffuse", vec3(0.7f,0.1f,0.2f));
    PassThrough.SendUniform("LightSpecular", vec3(0.8f,0.1f,0.1f));
    PassThrough.SendUniform("LightSpecularExponent", 50.0f);
    PassThrough.SendUniform("Attenuation_Constant", 1.0f);
    PassThrough.SendUniform("Attenuation_Linear", 0.1f);
    PassThrough.SendUniform("Attenuation_Quadratic", 0.01f);

    glBindVertexArray(Monkey.VAO);
    glDrawArrays(GL_TRIANGLES, 0, Monkey.GetNumVerticies());
    glBindVertexArray(0); 

    PassThrough.unBind();
    glutSwapBuffers();
}
1 个回复

这个概念称为鼠标拾取。 实现此目的的一种方法是射线投射。 本质上,您要做的就是将鼠标坐标映射到场景中的某个区域。 在您的情况下,您要检查位置是否在猴子内。 然后,就像处理鼠标的上,下和移动事件一样简单。

鼠标向下:检查是否正在拾取对象。 如果是这样,那就太好了-也许要突出显示它或其他东西。 将引用存储到拾取的对象; 在选择开始时存储鼠标的位置(位置)

鼠标移动:鼠标按下了吗? 是拾取的对象参考吗? 根据鼠标移动事件中pos和坐标之间的增量更新对象位置

鼠标向上:清除拾取的obj ref,位置

此链接可能是您感兴趣的http://antongerdelan.net/opengl/raycasting.html

1 对象跟随鼠标拖动Unity 3D

我有一个不断前进的对象,我想通过鼠标拖动屏幕的任何部分(滑动)使其在X轴上移动,因此我尝试了此代码,但是当第一次单击屏幕时,该对象移动到了鼠标X位置(不拖动)! 您对如何使其仅在拖动时移动有任何建议吗? 剧本: ...

2 处理单击3D对象opengl

我已经开始了第二个项目,目标是当前网络的图形表示,并且已经完成了后端。 现在我正在用opengl构建UI并遇到我需要处理单击3d对象的问题 如何处理球形点击并在单击后执行一些操作? ...

3 Java的OpenGL的:鼠标选择在三维空间

我正在尝试使用Java和OpenGL制作某种3D编辑器。 现在,我正在实现3D编辑器的基本功能,例如围绕特定位置旋转相机并进行缩放。 接下来,我要进行3D拾取以使用鼠标在3D空间中选择对象,线和顶点。 我认为这会很容易,因为当相机对焦时,我已经可以选择对象了。 这是具有“相机”焦点的 ...

5 WPF将2d鼠标单击转换为3d空间

我的Viewport3D中有多个几何网格物体,它们的边界为(w:1800,h:500,d:25)。 当用户单击网格的中间时,我想要的Point3D为(900,500,25)... 我该如何实现? 谢谢! 标记 ...

2009-11-13 05:18:05 1 2440   wpf/ 3d
6 用鼠标移动3D对象并将其恰好位于鼠标下方

我正在将GLScene与Lazarus一起使用,以渲染将在3D世界中充当2D位图的3D平面(而非飞机)。 我想实现鼠标事件,使我可以移动对象,这很容易做到。 但是,我很难弄清楚如何将对象保持在鼠标下方与单击对象时完全相同的位置。 场景: 可以说我有一个平面,以3D到2D像 ...

7 C ++ / OpenGL-3D对象前面的2D纹理

我是OpenGL的新手。 我将3D对象和2D图像绘制为HUD。 此时,它看起来像这样 。 我现在要做的是将HUD的2D纹理放置在3D对象的可见部分上(在本例中是头骨的前面)。 据我所知,我需要做的是: 检查哪些顶点可见(再次,据我所知,在StackOverflow搜索之后,我认 ...

8 除鼠标单击外,还可检测3D对象上的触摸

如何在触摸事件中使用Qt3DRender :: QObjectPicker ? 我通过这种方法将Qt3DRender::QObjectPicker组件添加到我的Qt3D实体: Qt3DRender::QObjectPicker *MyClass::createObjectPickerFo ...

2019-01-07 12:27:09 1 155   qt3d
10 使用GLSL通过鼠标单击确定3D位置

我想知道从2D位置获得3D位置的问题。 在我的应用程序中,我进行了所有设置(mvp矩阵,鼠标的屏幕位置)。 通过以下变换,我们可以从3D转换为2D。 gl_Position =投影*视图*模型*顶点; 然后将这些剪辑坐标除以w到NDC,然后转换为屏幕坐标。 我想做相反的操作 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM