我想实现我的项目中选择对象“raypicker”。 我不完全理解如何实现这一点,但我的理解概念应该如何工作。 我一直在努力学习如何做到这一点,但大多数教程我发现在我头上去的方式。 我当前的代码是基于最近的教程,我发现,一个在这里。
几个小时的修订后,我相信我和我的raypicker遇到的问题实际上是摆在首位的射线的创建。 如果我替换/硬编码我远/近平面与协调,将undisputably位于三角形的区域内,捡拾工具正确识别它。
我的问题是这样的:我的创作光线似乎并没有充分考虑我目前的“相机”或角度考虑,这样的相机旋转不会影响在我的鼠标。 我认为解决这个问题我需要像使用gluUnProject()什么的,但每当我用这个X,Y,Z坐标返回将是令人难以置信的小,
我现在的创作光线是一个烂摊子。 我试图用其他人最初提出的方法,但它似乎像什么方法我尝试了从未影响我的选择器/交集功能工作。
下面是我的创造射线的代码:
void oglWidget::mousePressEvent(QMouseEvent *event)
{
QVector3D nearP = QVector3D(event->x()+camX, -event->y()-camY, -1.0);
QVector3D farP = QVector3D(event->x()+camX, -event->y()-camY, 1.0);
int i = -1;
for (int x = 0; x < tileCount; x++)
{
bool rayInter = intersect(nearP, farP, tiles[x]->vertices);
if (rayInter == true)
i = x;
}
if (i != -1)
{
tiles[i]->showSelection();
}
else
{
for (int x = 0; x < tileCount; x++)
tiles[x]->hideSelection();
}
//tiles[0]->showSelection();
}
重复时,我用加载了视口,模型和投影矩阵,并且unproject鼠标坐标,但1920×1080窗口内,我得到的是在-2到2的xy&Z为每个鼠标事件的范围内的值,这就是为什么我想这个方法,但是这种方法不带摄像头的旋转和缩放工作。
我不想做的像素颜色采摘,因为谁知道我以后可能需要这种技术,我把在迄今的工作量后,我宁愿不放弃
看一眼
http://www.realtimerendering.com/intersections.html
在确定各种几何形状之间的交叉点的帮助地块
http://geomalgorithms.com/code.html也有一些C ++函数其中的一个服务你的目的
你似乎有问题,构建你的光芒,这是我会怎么做。 这还没有直接测试。 你可以像这样做,确保所有向量都在同一空间。 如果使用多个模型矩阵(或堆叠物)需要与它们中的每分别重复计算。
- 使用
pos = gluUnproject(winx, winy, near, ...)
来获得鼠标的坐标在模型空间中的近平面的位置; near
被所述值提供给glFrustum()
或gluPerspective()
- 光线的原点是在模型空间中的摄像机的位置是:
rayorig = inv(modelmat) * camera_in_worldspace
- 该射线的方向是从所述位置的归一化矢量从1到射线来源:
raydir = normalize(pos - rayorig)
在网站上链接它采用了两分的光线,他们似乎不归光线方向矢量,所以这是可选的。
好了,这是我的面包屑小径的起点处。
我在某种程度上具有与所述QT数据类型为矩阵的问题,并且逻辑有关矩阵变换。
在这个问题上这个特殊的问题是由于没有实际执行任何转换任何责任。
步骤来解决这个问题是:
- 转换鼠标坐标到NDC空间(-1到1的范围内:X /屏幕宽度* 2 - 1,Y - 高/身高* 2 - 1)
- 敛4x4矩阵用于我的视图矩阵(可渲染时所使用的一个或重新计算)
- 在一个新的载体中,有它等于乘以逆投影矩阵逆视图矩阵。
为了构建射线,我必须做到以下几点:
- 就拿那是相乘的矩阵先前计算的值。 这将通过一个矢量4(4点阵列),在那里将保持先前计算的x和y坐标,以及-1,则1相乘。
- 然后这个向量将通过整个向量的最后一个点值被划分
- 创建另一个向量4这是就像上次一样,但不是-1,把“1”。
- 再次除以它的最后一个席位的价值。
现在对于光线的坐标都在远远近近的飞机被创建的,所以它可以在现场沿线什么相交。
我开了一系列的(因为与我的一系列问题极大的不确定性)的问题,所以在他们我的问题重叠的部分了。
- 在这里 ,我才知道,我需要把屏幕高度考虑切换为笛卡尔坐标系y轴的原点,因为窗户有y轴的左上角开始。 此外,矩阵的检索是多余的,但也是错误的,因为他们从未宣布过“正常”。
- 在这里 ,我得知unProject是行不通的,因为我想拉使用OpenGL函数模型和视图矩阵,但我从来没有真正将它们摆在首位,因为我的手建造的矩阵。 我解决了这个问题在2倍:我手动做的数学,和我做了相同的数据类型的所有矩阵(它们是混合数据类型更早,导致问题为好)。
- 最后,在这里 ,我才知道,我的操作顺序是稍微偏离(需由矢量,而不是相反乘矩阵),我的近平面需要是-1,不为0,而的最后一个值(值“W”),其需要将与矩阵相乘矢量为1。
积分去谁帮我解决这些问题的人:
- facepunch的srobins ,在这个线程
- 从这里derhass , 在这个问题上 ,而这种讨论