鼠标坐标的3d点三角形交点?

Posted

技术标签:

【中文标题】鼠标坐标的3d点三角形交点?【英文标题】:Point-triangle intersection in 3d from mouse coordinates? 【发布时间】:2009-05-23 20:00:12 【问题描述】:

我知道如何测试点和三角形的交点。

...但是我不明白,如何使用鼠标坐标将点的起始位置精确地移动到屏幕平面上,因此点角度应该根据鼠标光标在屏幕上的位置而改变,也无论我在我的 OpenGL 应用程序中使用哪个透视角度,这都应该可以正常工作,因此不同透视角度的点角度会有所不同...... gluPerspective() 是我正在谈论的函数。

【问题讨论】:

“移动点的起始位置”是什么意思?一个点就是一个点。明白我的意思吗? ;) 你能澄清你的问题吗?您是在问如何精确移动一个点? 【参考方案1】:

好吧,试一试,猜猜你的意思。猜测是您想用鼠标选择对象。签出:

glUnProject.

这会将屏幕坐标转换回 3d 世界坐标。

如果您遇到问题,Google 会提供更多信息。

干杯!

【讨论】:

【参考方案2】:

是的,我想移动屏幕平面上的点,例如,我可以使用 3d 坐标在鼠标当前所在的那个点上渲染一个立方体,然后我从那个位置射一条线到那个地方我的鼠标指向的地方,所以它会击中我的 3d 世界中的三角形,以及我如何用鼠标选择该对象。

抱歉不清楚:/

--

编辑:是的,我得到了它与那个 nehe 教程一起工作!谢谢,没想到这么简单!

这是我现在使用的代码,效果很好:

void GetOGLPos(int x, int y, GLdouble &posX, GLdouble &posY, GLdouble &posZ)
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY, winZ;

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
    glGetDoublev(GL_PROJECTION_MATRIX, projection);
    glGetIntegerv(GL_VIEWPORT, viewport);

    winX = (float)x;
    winY = (float)viewport[3]-(float)y;
    glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

    gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

【讨论】:

【参考方案3】:

您需要生成一条穿过鼠标位置垂直于屏幕的射线(线)。

我建议您先了解一些有关 3d 几何和 2d 投影的基本信息,然后再进一步了解。

查看Wikipedia

book search on Google 想出了很多头衔。

Foley & Van Dam 虽然是权威的书 - 这里是 Amazon.co.uk 或这里是 Amazon.com

【讨论】:

以上是关于鼠标坐标的3d点三角形交点?的主要内容,如果未能解决你的问题,请参考以下文章

在 THREE.js 中获取鼠标相对于 3D 空间的坐标

具有重心坐标的三角形纹理映射

已知三点如何求圆心坐标和半径

判断点是不是在多边形内部的方法

已知三点坐标,怎么求内切圆的圆心

计算几何学习7