gpt4 book ai didi

c++ - 如何从带有透视投影的近裁剪平面绘制射线/线?

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:16 28 4
gpt4 key购买 nike

简单地说 - 我想使用透视投影从近裁剪平面绘制一条射线/线到远裁剪平面。我有我认为是使用各种 OpenGL/图形编程指南中描述的方法通过单击鼠标生成的正确标准化的世界坐标。

我遇到的问题是我的光线似乎是从近裁剪平面外绘制的。

背景:这是我在 Qt 中构建的一个简单的模型查看器,它需要一个拾取功能。我需要绘制光线以计算与场景中物体的交点。但是,我的基本问题是我似乎可以正确绘制射线。

我的透视投影定义为:

gluPerspective(_fov, aspect, 0.1, 100.0);

其中 _fov 为 45.0 度,纵横比为窗口宽度/高度的比率。

使用我的选择代码,我生成了我认为基于鼠标点击的正确标准化的世界坐标。这些坐标的示例:

-0.385753,-0.019608,-0.100000

但是,当我尝试从该点开始绘制射线时,看起来它是从裁剪平面外部绘制的:

enter image description here

也许我期待一些不同的东西,但在上面的例子中,我点击了飞机的机头,生成了上面的世界坐标,我错误地绘制了射线(或者我相信)。我希望看到从鼠标点击到飞机模型的位置绘制的线。

当我绘制射线时,我首先加载单位矩阵,然后从近裁剪平面坐标到远平面绘制一条线。然后我在光线的末端画了一个球体(在这个截图中它在平面后面)。

            glPushMatrix();
glLoadIdentity();

glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex3f(_near_ray.x(), _near_ray.y(), _near_ray.z());
glVertex3f(_far_ray.x(), _far_ray.y(), _far_ray.z());
glEnd();

glTranslatef(_far_ray.x(), _far_ray.y(), _far_ray.z());

glColor3f(1,0,0);
glutWireSphere(1, 10, 10);

glPopMatrix();

关于我做错了什么的任何提示? _far_ray 坐标与 _near_ray 相同,但 Z 场除外。我希望光线直接进入场景。

In The End... 我只想知道如何绘制射线本身。我知道生成坐标的代码中可能存在错误,但是如果我只想从近裁剪平面直接绘制任意光线到场景中怎么办。这是我想回答的问题。

最佳答案

在透视投影中,当且仅当一条线穿过眼睛位置时,它看起来像屏幕上的一个点。

由于您将模型 View 矩阵恢复为身份,因此眼睛位于原点(根据 this question )。将 (0, 0, 0) 作为顶点之一传递,希望您会看到该线退化为一个点。通常,用作顶点的两个 3d vector 必须共线。

如果不还原模型 View 矩阵,则可以从 (eye) 到 (eye + dir) 画一条线,其中 eye 是传递给 gluLookAt 的第一个 vector ,而 dir 是任何足够大的 vector 寻找正确的方向。

关于c++ - 如何从带有透视投影的近裁剪平面绘制射线/线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520197/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com