当前位置: 首页 > 知识库问答 >
问题:

计算一个简单三角形的每面法线

商琛
2023-03-14

我一直在处理一些3D东西(更具体地说是LibGdx,但对这个问题来说并不重要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。
我生成的三角形网格有以下顶点(也如下链接所示):

v0=[3,0,0]//X,Y,Z
v1=[1.49,0.86,0]//X,Y,Z
v2=[3,0,-1]//X,Y,Z

为了计算三角形网格的法线面,我使用了一个函数,我可以在许多教程/示例网站上找到(稍加修改):

private Vector3 calculateNormal(float vX1, float vY1, float vZ1,
                                float vX2, float vY2, float vZ2,
                                float vX3, float vY3, float vZ3) {

        Vector3 edge1 = new Vector3(vX1, vY1, vZ1).sub(vX2, vY2, vZ2);
        Vector3 edge2 = new Vector3(vX2, vY2, vZ2).sub(vX3, vY3, vZ3);

        Vector3 crsProd = edge1.crs(edge2); // Cross product between edge1 and edge2

        Vector3 normal = crsProd.nor(); // Normalization of the vector

        return normal;
}

将形成三角形的3个顶点的值传递到该方法后,我得到以下结果:

[-0.49,-0.86,0.0]

三角形网格和法向量的表示(图像)

问题1:
根据我所读的内容,我认为该三角形的计算法线值不正确。我的猜测是,法线应该位于垂直于三角形中心的位置(X应该是正值,Z应该是负值)。

问题2:
计算三角形的每面法线后,三角形的所有顶点是否都具有相同的每面法线值,如下所示:

verticesArr[v0Idx 0]=3//位置
垂直阵列[v0Idx 1]=0//位置
垂直阵列[v0Idx 2]=0//位置
verticesArr[v0Idx 3]=-0.49//NormalX
verticesArr[v0Idx 4]=-0.86//正常情况下
verticesArr[v0Idx 5]=0//NormalZ

verticesArr[v1Idx 0]=1.49//位置
垂直搜索[v1Idx 1]=0.86//位置
垂直搜索[v1Idx 2]=0//位置
垂直搜索[v1Idx 3]=-0.49//NormalX
verticesArr[v1Idx 4]=-0.86//正常情况下
垂直搜索[v1Idx 5]=0//NormalZ

verticesArr[v2Idx 0]=3;//位置
verticesArr[v2Idx 1]=0;//位置
verticesArr[v2Idx 2]=-1;//位置
verticesArr[v2Idx 3]=-0.49;//NormalX
verticesArr[v2Idx 4]=-0.86;//NormalY
verticesArr[v2Idx 5]=0;//NormalZ

我问第二个问题是因为我看过教程和例子,其中显示了三角形的每个顶点的不同垂直法向量(用于计算每面法线而不是每顶点法线)。

共有2个答案

盛琪
2023-03-14

问题1:您可以将法线想象为一个线段,其一个endpoint位于坐标(0,0,0)处,另一个endpoint位于您获得的值处,即(-0.49,-0.86,0.0)。法线的重要之处在于其方向(或方向),而这并不取决于在三维空间中放置法线的位置。

问题2:很可能这些不是曲面法线,而是顶点法线。更多信息请点击此处:https://en.wikipedia.org/wiki/Vertex_normal

丁豪
2023-03-14

问题1:法线没有位置。它们是向量的方向,垂直于三角形任意两个向量方向的组合所创建的平面。

问题2:三角形的所有垂直度应该具有相同的法线,因为它们是同一个平面的一部分,即三角形的平面。

正如你所看到的,法向量的方向将是相同的,无论你在三角形的什么地方。

 类似资料:
  • 问题内容: http://upload.wikimedia.org/math/f/e/5/fe56529cdaaaa9bb2f71c1ad8a1a454f.png <-区域公式 我试图从2D笛卡尔坐标系中的3个点(x,y)计算三角形的面积。我假设我的上述公式正确产生了三角形的面积(如果不是,请更正我),但是我的编译器说“运算符- 无法应用于java.awt.Point,java.awt.Point

  • Python3 实例 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: 实例(Python 3.0+)# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com a = float(input('输入三角形第一边长: ')) b = float(input('输入三角形第二边长: ')) c = fl

  • 本文向大家介绍PHP实现的简单三角形、矩形周长面积计算器分享,包括了PHP实现的简单三角形、矩形周长面积计算器分享的使用技巧和注意事项,需要的朋友参考一下 运用PHP面向对象的知识设计一个图形计算器,同时也运用到了抽象类知识,这个计算器可以计算三角形的周长和面积以及矩形的周长和面积。本图形计算器有4个页面:1.PHP图形计算器主页index.php;    2.形状的抽象类shape.class.

  • 我试图用DXUT11画一个简单的三角形,但是我在窗口中看不到三角形。 我努力工作,但仍然找不到问题所在-_- 我检查了D3D函数的每个返回值,它们都返回了S_OK<我可以看到我的窗口显示出来,背景色是我设置为清除窗口的颜色,因此看起来d3d设备是当前创建的,并且后缓冲区被渲染到窗口,但是黄色三角形在哪里 T\u T。。。。。。。。。。。。。。。 我的代码如下:(为了简化问题,我已经删除了所有的检查

  • 问题内容: 嗨,我正在尝试创建仿射变换,使我可以将一个三角形变换为另一个三角形。我所拥有的是2个三角形的坐标。你能帮助我吗? 按照亚当·罗森菲尔德的回答,我想出了这段代码,以防万一有人无聊地自己解决方程: 问题答案: 我假设您在这里谈论2D。仿射变换矩阵中有9个值: 有3个顶点输入,和,当其转化应该成为,,。然而,由于我们在齐次坐标的工作,应用到不一定给-它给人的倍数。所以,我们也有未知的乘法器,

  • 我必须为学校作业实现多边形三角测量算法。我选择遵循《计算几何:算法与应用》一书中描述的算法。 输入是存储为双连通边列表的多边形。第一步是将多边形分割成单调的部分。为了做到这一点,有必要执行线扫描,并根据每个顶点的类型对其进行处理。根据作者的说法,顶点类型描述如下: 我们在P-图中区分了五种类型的顶点,见图3.3。其中四种类型是旋转顶点:开始顶点、分割顶点、结束顶点和合并顶点。它们的定义如下。如果一