如何在unity3D中绘制线段的法线

如何在unity3D中绘制线段的法线,unity3d,Unity3d,我试图在unity编辑器中绘制曲线中线段的法线。到目前为止,我已经计算了法线,但是当我在unity编辑器中绘制它时,它的方向是不正确的。我想我在Draw函数中缺少了一些东西。下面是代码的简短版本 使用System.Collections.Generic; 使用UnityEngine; 公共阶层:单一行为 { [hideininstecpt] 公共控制点清单; [hideininstecpt] 公共列表常态; [hideininstecpt] 公共布尔初始化; 公共void Init() { 控制

我试图在unity编辑器中绘制曲线中线段的法线。到目前为止,我已经计算了法线,但是当我在unity编辑器中绘制它时,它的方向是不正确的。我想我在Draw函数中缺少了一些东西。下面是代码的简短版本

使用System.Collections.Generic;
使用UnityEngine;
公共阶层:单一行为
{
[hideininstecpt]
公共控制点清单;
[hideininstecpt]
公共列表常态;
[hideininstecpt]
公共布尔初始化;
公共void Init()
{
控制点=新列表();
添加(新矢量3(40,0,0));
添加(新向量3(30,0,-30));
添加(新向量3(0,0,-40));
添加(新向量3(-30,0,-30));
添加(新矢量3(-40,0,0));
添加(新矢量3(-30,0,30));
添加(新矢量3(0,0,40));
添加(新矢量3(30,0,30));
int points=ControlPoints.Count;
法线=新列表();
对于(int i=0;i1)
{
向量3中点=(分段.控制点[i%点]+分段.控制点[(i+1)%点])/2;
句柄.绘制线(中点,中点+线段.法线[i]+矢量3.1*10);
}
}
}
}
这就是unity编辑器中的内容
应该放在抽屉里

Handles.drawine(中点、中点+法线[i]*10);
使用
+Vector3.one*10
所做的操作总是在X和Y方向上额外移动方向


然后,您更愿意使用,以便获得在
方向上呈90°角的向量

由于您强制顶点在XZ中始终共面(在您的代码中,您使用了
Vector2
来切断Y分量),因此可以直接将这两个位置传递给
Vector3.Cross
,因此您将使用
Vector3.zero
作为一个顶点来获得三角形的法线

对于第一点,
%点实际上总是多余的

for(int i=0;i

根据你的需要,你必须小心,不管你在这两个点上通过的顺序如何。由于应用了“左手”规则,如果两个向量的顺序在三维空间中翻转,法线将翻转其方向

两个向量的叉积产生与两个输入向量垂直的第三个向量。结果的大小等于两个输入的大小相乘,然后再乘以输入之间角度的正弦。您可以使用“左手规则”确定结果向量的方向

然而,-再次-既然你强迫它们在XZ中始终共面,那么实际上还不清楚每个法线是否总是等于
Vector3.up
?这样您就可以跳过整个正常计算,只需执行

Handles.drawine(中点、中点+矢量3.up*10);

顺便说一句:你不需要自定义编辑器。只需在
OnDrawGizmos
OnDrawGizmosSelected
中执行即可(仅在层次结构中选择对象或父对象时调用)

\if UNITY\u编辑器
私有无效OnDrawGizmosSelected()
{
如果(!已初始化)
{
Init();
}
变量点=控制点。计数;
Handles.color=color.green;
对于(变量i=0;i1)
{
var中点=(控制点[i]+控制点[(i+1)%points])/2;
拉丝(中点、中点+法线[i]*10);
}
}
}
#恩迪夫

实际上,我已经在编辑器中创建了绘制曲线的脚本,而且在绘制函数中还有很多代码,这只是一个简短的版本。无论如何,谢谢你花时间和精力帮助我。我将尝试您的解决方案。您的代码也会产生相同的结果。我想计算法线不是问题,尽管向量3.cross的使用优雅而干净。但它仍然没有正确绘制法线。只是添加了一个关于抽屉的修复。您是否重置了相应的组件?否则