gpt4 book ai didi

c++ - 任何对象的 OpenGL 光线转换

转载 作者:行者123 更新时间:2023-11-30 02:28:51 25 4
gpt4 key购买 nike

我只是想知道是否有任何方法可以对任何对象执行鼠标拾取检测。无论是生成对象还是导入对象。

[想法] -我的想法是,场景中的每个对象都会有迭代。检查鼠标射线是否与对象相交。为了检查相交,它会检查鼠标拾取光线与构成对象的三角形。

[优点] -我相信这种方法的好处是,每个对象都可以通过鼠标拾取来检测,因为它们都继承自检测方法。

[缺点] -我认为这个缺点主要是速度和方法非常昂贵。因此需要微调优化。

[情况] -过去我读过有关鼠标拾取的内容,并且我也实现了一些基本形式的鼠标拾取。但所有这些都是蹩脚的工作,我并不为此感到自豪。所以今天,我又从网上重新阅读了一些东西。现在我看到很多使用颜色 ID 和着色器的鼠标拾取。我不太喜欢这种方法。我更喜欢数学。

这是我的鼠标拾取射线 thingamajig。

maths::Vector3 Camera::Raycast(s32 mouse_x, s32 mouse_y)
{
// Normalized Device Coordinates
maths::Vector2 window_size = Application::GetApplication().GetWindowSize();

float x = (2.0f * mouse_x) / window_size.x - 1.0f;
float y = 1.0f;
float z = 1.0f;

maths::Vector3 normalized_device_coordinates_ray = maths::Vector3(x, y, z);

// Homogeneous Clip Coordinates
maths::Vector4 homogeneous_clip_coordinates_ray = maths::Vector4(normalized_device_coordinates_ray.x, normalized_device_coordinates_ray.y, -1.0f, 1.0f);

// 4D Eye (Camera) Coordinates
maths::Vector4 camera_ray = maths::Matrix4x4::Invert(projection_matrix_) * homogeneous_clip_coordinates_ray;
camera_ray = maths::Vector4(camera_ray.x, camera_ray.y, -1.0f, 0.0f);

// 4D World Coordinates
maths::Vector3 world_coordinates_ray = maths::Matrix4x4::Invert(view_matrix_) * camera_ray;
world_coordinates_ray = world_coordinates_ray.Normalize();

return world_coordinates_ray;
}

我有这个射线平面相交函数,它计算某条射线是否与某个平面相交。呸!

这是它的代码。

bool Camera::RayPlaneIntersection(const maths::Vector3& ray_origin, const maths::Vector3& ray_direction, const maths::Vector3& plane_origin, const maths::Vector3& plane_normal, float& distance)
{
float denominator = plane_normal.Dot(ray_direction);

if (denominator >= 1e-6) // 1e-6 = 0.000001
{
maths::Vector3 vector_subtraction = plane_origin - ray_origin;
distance = vector_subtraction.Dot(plane_normal);

return (distance >= 0);
}

return false;
}

还有很多。例如。平面球体相交,平面圆盘相交。这些东西很具体。所以感觉在全局范围内做鼠标拾取交点是非常困难的。我之所以有这种感觉,是因为对于这个 RayPlaneIntersection 函数。我希望用它做的是,检索场景中的对象并检索该对象的所有法线(这很麻烦)。所以现在再次强调我的问题。

是否已经有一种我不知道的方法,它以一种方式对所有对象进行鼠标拾取?还是我只是愚蠢,当我拥有一切时不知道该做什么?

谢谢。谢谢。

最佳答案

是的,可以使用 OpenGL 进行鼠标拾取:将所有几何图形渲染到一个特殊的缓冲区中,该缓冲区存储对象的唯一 ID 而不是其阴影颜色,然后您只需查看在鼠标下方的像素,并通过写在那里的 id 知道对象。然而,尽管它可能更简单,但如果您的相机或几何体不断移动,它就不是特别有效的解决方案。

取而代之的是,进行分析射线-对象相交是可行的方法。但是,您不需要检查每个物体的每个三角形与射线的交点。那确实是低效的。您应该通过边界框或整个场景的一部分来剔除整个对象。游戏引擎有自己的空间索引数据结构来加速光线-对象相交。他们不仅需要它来进行鼠标拾取,还需要它进行碰撞检测、物理模拟、AI 等等。

另请注意,用于拾取的几何体可能与用于渲染的几何体不同。我想到的一个例子是半透明物体。

关于c++ - 任何对象的 OpenGL 光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40276068/

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