问题标签 [normals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
349 浏览

normals - 法线方向

目前,我有一个程序可以围绕 x 轴旋转一个简单的 2d 多边形以创建 3D 形状。问题是为了确保曲面的法线正确对齐,我需要找到一个点并确保法线远离该点。我一直在使用二维多边形的 x 和 y 坐标的平均值来查找参考点。然而,有时这个参考点会产生误导。如果我尝试使用尖锐的凹形,则参考点完全位于形状之外,这将导致一些边具有朝内的法线。是否有一种准确的方法来对齐多边形的法线,使它们始终远离它?

0 投票
1 回答
1380 浏览

matlab - 如何在曲面的多个点绘制法线?

X,Y and Z是包含表面中点坐标的矩阵。 Xnormal,Ynormal and Znormal矩阵是否包含这些点的法线。我怎样才能在它们的位置绘制所有这些法线?谢谢!

0 投票
2 回答
5087 浏览

opengl - 柏林噪声的每顶点法线?

我在 Opengl 几何着色器中生成地形,并且在计算光照法线时遇到问题。我使用几何着色器中实现的 perlin 噪声函数在每一帧动态生成地形。因此,我需要一种有效的方法来计算每个顶点的法线基于噪声函数(没有纹理或任何东西)。我可以取 2 边的叉积来获得面法线,但它们是随几何图形动态生成的,因此我无法返回并平滑顶点法线的面法线。如何仅使用在 y 平面上生成地形高度的噪声函数(因此高度介于 1 和 -1 之间)来动态获取顶点法线。我相信我必须为每个顶点对噪声函数进行 4 次采样,但我尝试了以下类似的方法,但它没有用......

上面实际上生成了像柏林噪声一样移动的光照!那么关于如何正确获得每个顶点法线的任何建议?

0 投票
2 回答
3147 浏览

graphics - MeshLab:使用我自己计算的法线渲染 obj 文件

我正在尝试编写一个带有顶点的 obj 文件。我在我的代码中计算顶点法线并写入这个文件。当我尝试在 Meshlab 中渲染此文件时,它会正确读取顶点,但是当我转到“渲染->显示顶点法线”时,它没有显示我计算的法线。相反,MeshLab 计算自己的法线并显示它们。

我不确定如何可视化我计算/写入文件的法线。我想稍后根据我计算的法线应用 Meshlab 着色器。

为了测试这一点,我创建了一个测试 obj 文件-

这只是一个正方形。现在,如果我更改此文件中的法线值,当我选择“渲染->显示顶点法线”时,它仍会显示自己的顶点法线。如何拥有自己的法线并应用适用于我计算的法线的着色器?请帮忙。

谢谢!!

0 投票
1 回答
3188 浏览

math - 寻找体素表面法线的方法

我正在研究一种方法来逼近 3d 体素图像表面的法线。

本文中建议的方法(我通过谷歌找到的唯一算法)似乎有效。论文中建议的方法是找到曲面变化最大的方向,使用一些程序在切平面上选择 2 个点,然后取叉积。文章作者 code 的一些Pascal 代码,用葡萄牙语注释,实现了这个方法。

但是,使用 f 的梯度(使用每个偏导数作为向量的一个分量)作为法线似乎效果很好;我在一个体素球体上沿着几个圆圈进行了测试,我得到的结果在大多数地方看起来都是正确的(有一些异常值偏离了大约 30 度)。这与论文中使用的方法有很大不同,但它仍然有效。我不明白的是为什么沿物体表面计算的 f = 1/dist 的梯度应该产生法线。

为什么这个程序有效?仅仅是球体测试过于特殊的事实吗?您能否提出一个更简单的方法,或解释其中任何一种方法?

0 投票
6 回答
66030 浏览

c++ - 计算三角形网格中的法线

我已经绘制了一个具有 10000 个顶点(100x100)的三角形网格,它将是一个草地。我为此使用了 gldrawelements()。我看了一整天,仍然无法理解如何为此计算法线。每个顶点都有自己的法线还是每个三角形都有自己的法线?有人可以指出我如何编辑我的代码以合并法线的正确方向吗?

编辑 1 这是我写的代码。我只是使用数组而不是向量,并将所有法线存储在称为法线的结构中。但是它仍然不起作用。我在 *indices 处得到一个未处理的异常。

0 投票
1 回答
522 浏览

opengl - 一半法线是错误的

我正在使用一个名为 sculptris 的程序来创建 Wavefront OBJ 格式的模型。我刚刚创建了我的第一个模型,现在正尝试将它们导入到 OpenGL 场景中。今晚之前我从未编写过对象加载器,但我很确定我正确解析了 OBJ 文件。不幸的是,当我添加光照时,模型一半的法线似乎不正确。在没有照明的情况下,模型的纹理和颜色都正确,看起来很完美。在灯光下,图像看起来像这样......

在此处输入图像描述

如果一半的模型是正确的,我很确定我的 OBJ 解析没有问题。因此,雕刻师必须只对一半模型有正确的法线(可能是由于雕刻的对称性造成的)。如果有人熟悉该程序,请知道我做错了什么。对于那些只熟悉 OBJ 的人来说,关于 OBJ 是否有一些我不知道的东西涉及重复法线(因为模型是左右对称的)?

0 投票
1 回答
1115 浏览

opengl-es - iOS OpenGL ES .obj 加载单位立方体后翻转计算的面法线

我正在尝试将模型从 Maya 导出并加载到一个非常简单的 iOS OpenGL ES 设置中。为此,我编写了一个 ruby​​ obj 解析器,它基本上采用顶点和法线并将它们计算成一个我简单地包含的 C 头文件。简单三角单位立方体的输出是以下结构:

Vertex3D 的定义是

现在我需要重新计算我的顶点法线,因为我想要动画一些顶点的运动。为此,我只是将所有连接的顶点索引添加到每个顶点,这就是 connected_faces 索引数组的用途。

对于计算,我只需用叉积计算所有面法线。为此,我只需要使用存储在 Index3D 中的 3 个顶点,加载位置,减去第一个顶点,这样我就有了向量并计算叉积。然后我将属于这个顶点的所有叉积相加,并对向量进行归一化,这是我最终的顶点法线。

我遇到的问题是,碰巧有2个面具有相同的面法线,例如三角立方体总是有2个分割四边形的三角形,该面的法线方向相反。如果我将它们相加,以便稍后计算,它们的总和当然是 N​​ull-Vector。我知道发生这种情况是因为在某些情况下 2 个顶点没有正确的顺序,这意味着 A 应该替换为 B,但我不知道我必须翻转哪个。

有什么数学方法可以估计法线的走向,以及我是计算 AxB 还是 BxA?我在 Maya 中仔细检查了法线,它们在那里非常完美。

编辑:我现在订购了连接的面,效果很好。我正在使用以下方法计算法线:

但是现在我遇到的问题是,通过三角剖分,有时我有 2 条法线指向完全相同的方向,这不会导致我预期的 { 0.33f, 0.33f, 0.33f } 顶点法线。这是正确的行为,还是有其他方法可以计算?

非常感谢您的帮助!

0 投票
1 回答
1870 浏览

algorithm - 尝试修复 3D 网格法线

我有三角形集合,它定义了我的 3D 形状的网格表面,我想修复每个三角形的法线以指向异形。

我正在尝试以下(伪):


1. 定义第一个三角形法线方向是正确的方向
2. 使用这样的 DFS 遍历网格:
3. 三角形 = 第一个三角形
4. foreach neigbour in triangle.getNeighbours
5. 如果邻居和三角形之间的角度大于 180 做邻居.flip()
6. 三角形 = 邻居
7. 如果邻居已经选择然后继续下一个邻居
8. 继续递归到 4.

但是算法中的第 5 步不起作用,因为无法知道角度是否大于 180,因为我需要知道女巫方向(顺时针或逆时针)。

你能帮我理解如何修复算法吗?

0 投票
1 回答
979 浏览

c# - C# wpf 3D 从 origo 面向

如果我有三个点并且总是希望可见的面应该是从 origo“面对”的那一面,是否有计算平面法线的捷径?

像这样

还是我每次都必须计算正常值?

如果我必须计算法线,那么算法是什么,我在互联网上查看并尝试了几种方法,但它们让我怀疑,就像这个一样。

CalculateNormal 在哪里

不应该

Vector3D v1 = new Vector3D(p1.X - p2.X, p1.Y - p2.Y, p1.Z - p2.Z );

反而 ?

/斯蒂芬