- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经实现了 Möller-Trumbore Ray-Tri 相交算法如下;
注意:我将 GLM 用于 vec3 - dot - cross - sub 。 . .
bool intersect_triangle( vec3 &O, vec3& D, vec3 &vert0, vec3 &vert1, vec3 &vert2, vec3 & P, bool cull )
{
static const float eps = 0.000001;
vec3 edge1( 0.0f, 0.0f, 0.0f );
vec3 edge2( 0.0f, 0.0f, 0.0f );
vec3 tvec( 0.0f, 0.0f, 0.0f );
vec3 pvec( 0.0f, 0.0f, 0.0f );
vec3 qvec( 0.0f, 0.0f, 0.0f );
float det, inv_det;
edge1 = vert1 - vert0;
edge2 = vert2 - vert0;
pvec = cross( D, edge2 );
det = dot( edge1, pvec );
if( cull )
{
if( det < eps )
{
cout << "cull test failed" << endl;
return false;
}
tvec = O - vert0;
P.x = dot( tvec, pvec );
if( P.x < 0.0f || P.x > det )
{
cout << "U test failed" << endl;
return false;
}
qvec = cross( tvec, edge1 );
P.y = dot( D, qvec );
if( P.y < 0.0f || ( P.x + P.y ) > det )
{
cout << "V test failed" << endl;
return false;
}
P.z = dot( edge2, qvec );
inv_det = 1.0f / det;
P.x *= inv_det;
P.y *= inv_det;
P.z *= inv_det;
}
else
{
if( det > - eps && det < eps )
{
return false;
}
inv_det = 1.0f / det;
tvec = O - vert0;
P.x = dot( tvec, pvec ) * inv_det;
if( P.x < 0.0f || P.x > 1.0f )
{
return false;
}
qvec = cross( tvec, edge1 );
P.y = dot( D, qvec ) * inv_det;
if( P.y < 0.0f || P.x + P.y > 1.0f )
{
return false;
}
P.z = dot( edge2, qvec ) * inv_det;
}
return true;
}
我正在使用如下实现;
for( size_t i = 0; i < tris.size(); i++ )
{
mat4 mvp_inverse = inverse( tris[i]->_mvp );
vec4 origin = mvp_inverse * vec4(
( _lastEvent.motion.x - _width / 2.0f ) / _width / 2.0f, ( _height / 2.0f - _lastEvent.motion.y ) / _height / 2.0f, -1, 1 );
vec4 dir = mvp_inverse * vec4( 0, 0, 1, 0 );
vec3 O = vec3( origin.x, origin.y, origin.z );
vec3 D = normalize( vec3( dir.x, dir.y, dir.z ) );
vec3 P;
for( size_t j = 0; j < tris[i]->_indices.size(); j += 3 )
{
bool intersection = intersect_triangle( O, D,
tris[i]->_vertices[tris[i]->_indices[j]],
tris[i]->_vertices[tris[i]->_indices[j + 1]],
tris[i]->_vertices[tris[i]->_indices[j + 2]],
P, true );
if( intersection )
{
cout << P.x << " " << P.y << " " << P.z << endl;
}
else
{
cout << "no intersection" << endl;
}
}
}
实现在某些地方有效。当光标指向 tri 内部时,它会正确检测到。它在 tri 之外的某些地方不起作用。我不知道为什么 ?我已使用“快速、最小存储射线/三角形相交”论文来实现。
测试截图;
最佳答案
问题是构建射线原点和方向
解决方案:
vec4 viewport( 0.0f, 0.0f, 800.0f, 600.0f );
vec3 unProjectedNear = unProject( vec3( _lastEvent.motion.x, 600 - _lastEvent.motion.y, -1.0f ), _view * tris[i]->_model, _proj, viewport );
vec3 unProjectedFar = unProject( vec3( _lastEvent.motion.x, 600 - _lastEvent.motion.y, +1.0f ), _view * tris[i]->_model, _proj, viewport );
vec3 D = normalize(unProjectedFar-unProjectedNear);
vec3 O = unProjectedNear;
关于c++ - Möller-Trumbore Ray-Tri 交集算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37652337/
有没有办法停止ray.tune实验(例如使用 PBT)当明显过度拟合或一个指标长时间没有改善时? 最佳答案 现在,这在 Tune 中得到了很好的支持,https://github.com/ray-pr
在 SimpleCorridor 之后我可以创建自己的环境并训练模型!好的。但是当我尝试评估这个经过训练的模型时,rllib 无法识别我的自定义环境。 如何在自定义环境中评估经过训练的模型? 当我像建
我正在运行 Ray Serve 来托管 ray 远程函数的 HTTP API。有没有比下面更好的方法在前台运行 Ray Serve(即非守护进程模式)。代码直接取自射线服务示例: import os
下面的代码完成了所需的行为。是否可以从前两个函数传递第二个参数而不必过早地调用 ray.get? @ray.remote def color(): image=cv2.imread("fram
我目前正在尝试理解由 Kevin Beason (smallpt: http://www.kevinbeason.com/smallpt/) 开发的光线追踪器,如果我正确理解代码,他会随机选择反射或折
当我在 Node 上运行 app.js 时,我在命令行中收到此错误: FATAL ERROR: v8::HandleScope::CreateHandle() Cannot create a hand
我想知道 - 是否有一种直接的方法可以在退出之前等待所有任务完成运行而不跟踪所有 ObjectID(和 get()ing他们)?用例是当我启动 @remote 以保存输出时,例如,在不需要返回结果的情
所以我只是跑了一个 tune实验并得到以下输出: +--------------------+------------+-------+-------------+----------------+-
我可以访问节点集群,我的理解是,一旦我在具有相同 Redis 地址的每个节点上启动 ray,头节点就可以访问所有节点的所有资源。 主要脚本: export LC_ALL=en_US.utf-8 exp
我正在寻找一个好的光线八叉树相交算法,它以迭代的方式为我提供光线穿过的叶子。我计划在 CPU 上实现它,因为我还不想深入研究 CUDA :) 目前,我的 Voxel raycaster 仅在 XxYx
来自 RISE 实验室的射线库 (https://rise.cs.berkeley.edu/blog/pandas-on-ray/) 我正在使用 64 位 Windows 10 专业版并从 Anaco
0. ray 简介 ray是开源分布式计算框架,为并行处理提供计算层,用于扩展AI与Python应用程序,是ML工作负载统一工具包 Ray AI Runtime
我有一个看起来更复杂的脚本: import ray var1 = 0 var2 = 0 @ray.remote def create(n): global var1 global va
我正在编写一个项目,该项目多次使用相同的数据进行写入,并且我一直在使用 ray 在集群设置中对其进行扩展,但是文件太大而无法来回发送/保存射线对象一直存储。有没有办法在远程函数调用之间将 python
我用 ray 创建了一个简单的远程函数,它占用的内存很少。但是,运行一小段时间后,内存稳步增加,并且出现 RayOutOfMemoryError 异常。 下面的代码是这个问题的一个非常简单的例子。 “
要检测一个点是否在多边形中,您可以从该点到无穷远投影一条线,然后查看它与多少个多边形顶点相交......足够简单。我的问题是,如果射线在其中一个点上与多边形相交,则将其视为与两个线段相交,并被视为在多
我有一个相当大的 Python 程序(~800 行),它具有以下结构: 设置说明,我在其中处理用户提供的输入文件并定义对程序执行具有全局性的变量/对象。 Main 函数,它利用前面的设置阶段并调用程序
正如您在图像中看到的那样,我在球体顶部看到了一个黑色圆圈,并且图像看起来有颗粒感。它应该更清晰,但是有这些小的黑白点。 这是阴影射线的代码 int pos = 0; float intersect(c
我有一个相当大的 Python 程序(~800 行),它具有以下结构: 设置说明,我在其中处理用户提供的输入文件并定义对程序执行具有全局性的变量/对象。 Main 函数,它利用前面的设置阶段并调用程序
我正在尝试实现一个“光线选择器”以在我的项目中选择对象。我不完全理解如何实现这一点,但我从概念上理解它应该如何工作。我一直在努力学习如何做到这一点,但我发现大多数教程都让我难以理解。我当前的代码基于我
我是一名优秀的程序员,十分优秀!