- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试与片段着色器中的三角形进行光线交叉,如果它发生碰撞,我将在纹理中绘制一个黑点,如果没有碰撞,我将绘制纹理颜色。但它没有效果,我不知道有什么办法解决它。
它是地面的着色器并且具有来自顶点的几何体的坐标,该几何体将在地面着色器之后绘制。颜色也来自顶点着色器,光点是一个 vec3,在空间中有一个点,我想创建一条从片段位置到光点的光线,看看它是否与我创建的几何体发生碰撞在代码中。在我需要查看纹理中的交点是否为 alpha 之后,但这将是下一个问题,现在我需要查看地面中几何体的阴影。
#version 330 core
#define INTERSECT_EPSILON 0.0001
out vec4 FragColor;
in vec2 TexCoord;
in vec3 geometryP;
in vec3 lampP;
in vec3 colorP;
in vec3 imagePos;
//texture samplers
uniform sampler2D groundTexture;
uniform sampler2D treeTexture;
struct Ray
{
vec3 Origin;
vec3 Direction;
};
float dot(vec3 firstPoint, vec3 secondPoint)
{
return (firstPoint.x * secondPoint.x + firstPoint.y * secondPoint.y + firstPoint.z * secondPoint.z);
}
vec3 cross(vec3 firstPoint, vec3 secondPoint)
{
vec3 crossResult;
crossResult.x = firstPoint.y*secondPoint.z - firstPoint.z*secondPoint.y;
crossResult.y = firstPoint.z*secondPoint.x - firstPoint.x*secondPoint.z;
crossResult.z = firstPoint.x*secondPoint.y - firstPoint.y*secondPoint.x;
return crossResult;
}
bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2)
{
float hit;
vec3 barycentricCoord;
vec3 triangleNormal;
vec3 e0 = p1 - p0;
vec3 e1 = p0 - p2;
triangleNormal = cross(e1 , e0);
float valueDot = 1.0 / dot( triangleNormal, ray.Direction );
vec3 e2 = ( valueDot ) * ( p0 - ray.Origin );
vec3 i = cross(ray.Direction , e2);
barycentricCoord.y = dot( i, e1 );
barycentricCoord.z = dot( i, e0 );
barycentricCoord.x = 1.0 - (barycentricCoord.z + barycentricCoord.y);
hit = dot( triangleNormal, e2 );
return (hit > INTERSECT_EPSILON) && (barycentricCoord.x > 0 && barycentricCoord.y >0 && barycentricCoord.z > 0);
}
void main()
{
vec3 firstPlane[3];
firstPlane[0] = geometryP + vec3(-0.2, -0.2, 0.0);
firstPlane[1] = geometryP + vec3(0.2, -0.2, 0.0);
firstPlane[2] = geometryP + vec3(0.2, 0.5, 0.0);
Ray ray1;
ray1.Origin = imagePos;
ray1.Direction = lampP;
bool intersect = IntersectTriangle(ray1, firstPlane[0], firstPlane[1], firstPlane[2]);
vec3 secondPlane[3];
secondPlane[0] = geometryP + vec3(0.2, -0.2, 0.0);
secondPlane[1] = geometryP + vec3(-0.2, 0.5, 0.0);
secondPlane[2] = geometryP + vec3(0.2, 0.5, 0.0);
if(!intersect)
{
intersect = IntersectTriangle(ray1, secondPlane[0], secondPlane[1], secondPlane[2]);
}
if(!intersect)
FragColor = mix(texture(groundTexture, TexCoord), texture(treeTexture, TexCoord), 0.2);
else
FragColor = vec4(colorP, 0.0);
}
最佳答案
首先要注意, dot
和 cross
是内置的 glsl 函数。
编写一个 GLSL 函数来评估一个点是否在 3 维空间中的三角形内:
float PointInOrOn( vec3 P1, vec3 P2, vec3 A, vec3 B )
{
vec3 CP1 = cross(B - A, P1 - A)
vec3 CP2 = cross(B - A, P2 - A)
return step(0.0, dot(CP1, CP2));
}
bool PointInTriangle( vec3 px, vec3 p0, vec3 p1, vec3 p2 )
{
return
PointInOrOn(px, p0, p1, p2) *
PointInOrOn(px, p1, p2, p0) *
PointInOrOn(px, p2, p0, p1);
}
struct Ray
{
vec3 Origin;
vec3 Direction;
};
vec3 IntersectPlane(Ray ray, vec3 p0, vec3 p1, vec3 p2)
{
vec3 D = ray.Direction;
vec3 N = cross(p1-p0, p2-p0);
vec3 X = ray.Origin + D * dot(p0 - ray.Origin, N) / dot(D, N);
return X;
}
bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2)
{
vec3 X = IntersectPlane(ray, p0, p1, p2);
return PointInTriangle(X, p0, p1, p2);
}
R0
定义和一个方向
D
.
PA
,
PB
, 和
PC
.
N = cross(PC-PA, PB-PA)
n
点
R0
到飞机是:
n = | R0 - PA | * cos(alpha) = dot(PA - R0, N)
d
交点的
X
到射线 R0 的原点是:
d = n / cos(beta) = n / dot(D, N)
X
是:
X = R0 + D * d = R0 + D * dot(PA - R0, N) / dot(D, N)
N
和
D
, 因为
D * dot(PA - R0, N) / dot(D, N)
等于
normalze(D) * dot(PA - R0, normalze(N)) / dot(normalze(D), normalze(N))
.
A
定义,
B
,
C
并且要测试的点是
P
:
bool PointInOrOn( P1, P2, A, B )
{
CP1 = cross( B - A, P1 - A )
CP2 = cross( B - A, P2 - A )
return dot( CP1, CP2 ) >= 0
}
bool PointInOrOnTriangle( P, A, B, C )
{
return PointInOrOn( P, A, B, C ) &&
PointInOrOn( P, B, C, A ) &&
PointInOrOn( P, C, A, B );
}
关于c++ - 在 GLSL C++ 中将射线与三角形相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59257678/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!