OpenGL光线投射与任何对象
OpenGL Raycasting with any object
我只是想知道是否有任何方法可以对任何对象执行鼠标拾取检测。是生成对象还是导入对象
[想法] -我的想法是,场景中的每个物体都会有迭代。检查鼠标光线是否与物体相交。对于检查交集,它将检查鼠标拾取光线与组成对象的三角形。
(优点)-我相信这种方法的好处是,每个对象都可以通过鼠标拾取来检测,因为它们都继承自检测方法。
[反对] -我认为这个缺点主要是速度和方法非常昂贵。所以需要对优化进行微调。
[情况] -过去我读过关于鼠标拾取的内容,我也实现过一些鼠标拾取的基本形式。但这些都是我不引以为傲的烂作品。所以今天,我再次从网上读了一些东西。现在我看到很多鼠标选择使用颜色id和着色器。我不太喜欢这种方法。我对数学更感兴趣。
这是我的鼠标选择射线的东西
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等等。
还要注意,用于拾取的几何图形可能与用于呈现的几何图形不同。我想到的一个例子就是半透明的对象。
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 在将匿名对象作为参数传递时,不会调用任何构造函数
- 如何将任何值转换为对象并使用 boost::p roperty_tree json 添加成员
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 在DelphiInterface上实现Dynamic_cast以获取基础对象类的任何方法
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- C++/(Qt) 指向具有特定方法的任何对象的指针
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 我们如何在c 中序列化或应对类的对象.是否有任何预定义的库
- C++包含任何类型的模板类对象的映射
- 原子对象在普通对象安全的任何上下文中都是不安全的
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 声明矢量和指针而无需创建任何类型的对象
- OPENCV SVM-对象不属于任何受过训练的类
- 将任何数据类型/对象作为参数传递以确定其大小
- 调用不访问已删除对象中的任何类成员的类方法是否安全
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?