RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 809831
Accepted
Санаев
Санаев
Asked:2020-04-05 14:55:18 +0000 UTC2020-04-05 14:55:18 +0000 UTC 2020-04-05 14:55:18 +0000 UTC

如何计算模型落入平截头体(矩形)的多边形?

  • 772

有一个场景,在场景 obj 模型上。需要选择模型的多边形。

按下鼠标右键,然后围绕按下的点绘制一个矩形,在矩形的角上绘制选择性光线。您需要从模型中选择(涂上颜色)落入该区域的三角形。

我使用 LWJGL 和 JOML 库。我发现了这样的函数:unproject,它从屏幕坐标转换为世界坐标intersectRayPlane- 光线是否与多边形相交。

我制作了选择性光束(结果是 6 个平面)。现在有必要在这个截断的金字塔内的三角形上着色。你会如何建议这样做?告诉我不要告诉我几何,而是确切地告诉我如何在着色器中以编程方式完成它。给定:P矩阵,视图矩阵,Q=PV矩阵,模型M矩阵,平面顶点坐标(其中有8个origin(beam end坐标)和dir(不知道什么意思,用了unproject函数)) ,模型顶点坐标及其法线。

我找到了所有 6 个平截头体平面的abcd组件。接下来,我取一个点并测量到 6 个平截头体平面中的每一个平面的距离。如果距离为负,则该点不在截锥体内。下面是其中的着色器,很可能是一个错误:我传递给顶点着色器

 vec4[6] planes - a b c d для 6 плоскостей.
out float[6] dis;- это расстояния, которые я передаю во фрагментный шейдер
#version 330

layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 normal;
layout (location = 2) in vec2 texCoord;

out float[6] dis;
out vec3 normal_modelspace;
out vec3 vertex_modelspace;
out vec2 TexCoord;
out vec4 vertexColor;
uniform mat4 P;
uniform mat4 V;
uniform mat4 M;

uniform vec4[6] planes;


void main() {
    TexCoord = texCoord;
    vertex_modelspace = (M * vec4(vertexPos.xyz, 1.0)).xyz;
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f);
    gl_Position = P * V * vec4(vertex_modelspace.xyz, 1.0);
    normal_modelspace = (M * vec4(normal.xyz, 1.0)).xyz;
    vec3 EyeDirection_cameraspace = vec3(0,0,0) - (V * M * vec4(vertexPos,1)).xyz;

     for(int i = 0;i<6;i++){
       float denom = sqrt(planes[0].x * planes[0].x + planes[0].y * planes[0].y + planes[0].z * planes[0].z);
       dis[i] = float((planes[0].x * vertex_modelspace.x + planes[0].y * vertex_modelspace.y + planes[0].z * vertex_modelspace.z + planes[0].w) / denom);
     }
}

片段着色器 在这里我检查循环中点的距离,如果找到负值,则应该用颜色覆盖它。

#version 330 core

in vec3 normal_modelspace;
in vec3 vertex_modelspace;
in vec2 TexCoord;
in vec4 vertexColor;
in float[6] dis;
out vec4 color;

uniform vec3 light_worldspace;

uniform sampler2D ourTexture;

void main() {
  vec3 n = normalize(normal_modelspace);
  vec3 l = normalize(light_worldspace - vertex_modelspace);
  float cosTheta = clamp( dot( n, l), 0,1 );
  float ambient = 0.05;
    int i=0;
    while(i<6 && dis[i]<=0){
      i++;
    }
    if(i==6){
      color = texture(ourTexture, TexCoord);
    }
    else
      color = vertexColor;
}

结果

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Kromster
    2020-04-09T17:34:32Z2020-04-09T17:34:32Z

    一个简单的算法(没有优化)是这样的:

    1. 确定世界坐标中的包围体(截断金字塔,即所谓的平截头体)。您可以将其定义为 6 个平面(即每个面的一个平面),以法线(表示平面“看起来”的位置)和距离(距世界坐标中心)的形式给出。
    2. 将模型转换为世界坐标(反之亦然,将截锥体转换为模型坐标)
    3. 对于模型中的每个多边形,检查它的所有顶点:
    4. 对于每个顶点,检查其相对于 6 个边界平面中的每一个的位置。检查代码(在Delphi中,但本质是一样的)

      Result := True; // т.е. точка с той же стороны, куда "смотрит" нормаль
      for I := 0 to 5 do
      begin
        d :=  Planes[I].Normal.X * aPoint.X +
            Planes[I].Normal.Y * aPoint.Y +
            Planes[I].Normal.Z * aPoint.Z +
            Planes[I].Distance;
      
        if d <= 0 then Exit(False);
      end;
      

    如果对于所有平面,多边形的所有点都在“内部”,那么多边形被认为是“在”截锥体“内部”。

    PS如果有什么要澄清的 - 在评论中提问。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5