相关疑难解决方法(0)

计算三角形网格中的法线

我画了一个有10000个顶点(100x100)的三角形网格,它将是一个草地.我使用了gldrawelements().我看了一整天,仍然无法理解如何计算这个法线.每个顶点是否有自己的法线或每个三角形都有自己的法线?有人能指出我正确的方向如何编辑我的代码以合并法线?

struct vertices {
    GLfloat x;
    GLfloat y;
    GLfloat z;
}vertices[10000];

GLuint indices[60000];

/*
99..9999
98..9998
........
01..9901
00..9900
*/

void CreateEnvironment() {
    int count=0;
    for (float x=0;x<10.0;x+=.1) {
        for (float z=0;z<10.0;z+=.1) {
            vertices[count].x=x;
            vertices[count].y=0;
            vertices[count].z=z;
            count++;
        }
    }
    count=0;
    for (GLuint a=0;a<99;a++){
        for (GLuint b=0;b<99;b++){
            GLuint v1=(a*100)+b;indices[count]=v1;count++;
            GLuint v2=(a*100)+b+1;indices[count]=v2;count++;
            GLuint v3=(a*100)+b+100;indices[count]=v3;count++;
        }
    }
    count=30000;
    for (GLuint a=0;a<99;a++){
        for (GLuint b=0;b<99;b++){
            indices[count]=(a*100)+b+100;count++;//9998
            indices[count]=(a*100)+b+1;count++;//9899
            indices[count]=(a*100)+b+101;count++;//9999
        }
    }
}

void ShowEnvironment(){
    //ground
    glPushMatrix();
    GLfloat GroundAmbient[]={0.0,0.5,0.0,1.0};
    glMaterialfv(GL_FRONT,GL_AMBIENT,GroundAmbient);
    glEnableClientState(GL_VERTEX_ARRAY);
    glIndexPointer( GL_UNSIGNED_BYTE, 0, indices ); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl normals computational-geometry

43
推荐指数
4
解决办法
5万
查看次数

计算网格的顶点法线

我已经合法地完成了所有可能的研究,而这只是简单地计算每个相邻面的表面法线.计算表面法线很容易,但是如何找到每个顶点的相邻面?你用什么样的存储空间?我错过了什么吗?为什么每个人都这么容易.

任何指导将不胜感激.

graphics

9
推荐指数
1
解决办法
3万
查看次数

如何实现平滑的切线空间法线?

我正在尝试向我的应用程序添加凹凸贴图功能,但我得到了非常多面的模型:

在此处输入图片说明

发生这种情况的原因是因为我正在计算每个面的切线、副法线和法线,而完全忽略了我从模型文件中获得的法线。

计算目前使用三角形的两条边和纹理空间向量得到切线和副法线,然后通过叉积计算法线。模型加载后,这一切都在 CPU 上完成,然后将值存储为模型几何的一部分。

    vector1 = vertex2.coords - vertex1.coords;      
    vector2 = vertex3.coords - vertex1.coords;

    tuVector = vertex2.texcoords - vertex1.texcoords;
    tvVector = vertex3.texcoords - vertex1.texcoords;

    float den = 1.0f / (tuVector.x * tvVector.y - tuVector.y * tvVector.x);

    tangent.x = (tvVector.y * vector1.x - tvVector.x * vector2.x) * den;
    tangent.y = (tvVector.y * vector1.y - tvVector.x * vector2.y) * den;
    tangent.z = (tvVector.y * vector1.z - tvVector.x * vector2.z) * den;

    binormal.x = (tuVector.x * vector2.x - tuVector.y * vector1.x) * …
Run Code Online (Sandbox Code Playgroud)

c++ math directx 3d hlsl

5
推荐指数
1
解决办法
2298
查看次数

Blender 如何计算顶点法线?

我正在尝试计算各种游戏资产的顶点法线。我计算的法线用于“膨胀”模型(在真实模型后面绘制产生粗轮廓)。

我目前计算每张脸的法线并平均所有脸(堆栈溢出的其他几个问题建议这种方法)。但是,这不适用于像这样的尖角(相邻面的法线以橙色标记,我试图计算的法线以绿色标出)。

例子

该物体看起来像一个小基座,我们正在查看左前角。有三个相邻的面(底面不可见;它的法线指向正下方)。

Blender 计算出一个很好的法线,它正好位于三个面的法线中间;似乎它以某种方式计算了一个法线,该法线对三个面法线中的每一个都具有最小旋转。当四边形以不同方式进行三角剖分时,Blender 的法线也不会改变。

平均面的法线给了我一个不同的法线,它在 Z 轴上略微向上(-0.45、-0.89、+0.08)。以这种方式给我的模型充气不会产生好的轮廓,因为轮廓的底面向上移动并且没有包围原始模型。

我试图查看 Blender 源代码,但找不到我要找的东西。如果有人可以指出 Blender 源代码中的算法,我也会接受。

blender vertex vertex-attributes

5
推荐指数
1
解决办法
3111
查看次数

从一组三角形计算 Gouraud 着色的顶点法线的最有效算法

我们有一组三角形。每个三角形都是三个点。每个点都是实数的三元组。我们可以计算每个三角形的表面法线。然而,对于 Gouraud 着色,我们需要顶点法线。因此,我们必须访问每个顶点并查看共享该顶点的三角形,平均它们的表面法线,然后得到顶点法线。

实现这一目标最有效的算法和数据结构是什么?

一个简单的方法是这样的(伪 python 代码):

MAP = dict()
for T in triangles:
  for V in T.vertices:
    key = hash(V)
    if MAP.has(key):
      MAP[key].append(T)
    else:
      MAP[key] = []
      MAP[key].append(T)

VNORMALS = dict()
for key in MAP.keys():
  VNORMALS[key] = avg([T.surface_normal for T in MAP[key]])
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?

algorithm graphics normals gouraud

4
推荐指数
1
解决办法
6810
查看次数