使用 C# 在 3D 空间中沿着贝塞尔路径进行 3D 管材挤出,并陷入僵局。我已经集成了用于向量、点、十字和法线等的 GLMSharp。我不确定如何创建向上矢量以及这是否是问题所在。 我正在输出.3ds格式,下图显示了在某些情况下的差距或扭曲。 我正在询问解决方案。
// frenet serret code
void get_circle(int i, double theta, float[,] mmp, float[] p1, float[] p2, float rad,float[] cen)
{
float[] n = new float[3];
vec3 tp1 = new vec3(p1[0], p1[1], p1[2]);
vec3 tp2 = new vec3(p2[0], p2[1], p2[2]);
vec3 T = (tp2 - tp1);
T = T.Normalized;
vec3 B = vec3.Cross(T, tp2 + tp1);
B = B.Normalized;
vec3 N = vec3.Cross(B, T);
N = N.Normalized;
float x = (float)Math.Cos(theta)*rad;
float y = (float)Math.Sin(theta)*rad;
vec3 vertex = tp1 + B * x + N * y;
mmp[i,0] = cen[0] + vertex.x;
mmp[i,1] = cen[1] + vertex.y;
mmp[i,2] = cen[2] + vertex.z;
}
扭曲或间隙
据我了解,p1
和p2
是点,因此tp2 + tp1
定义了一些与双正态B
无关的点(向量(。当这个向量与切T
共线时,你的B
和间隙为零。
要计算某个路径点中的 Frenel 三面体,您至少需要该路径的三个后续点 - 让我们将它们命名为Prev, Curr, Next
。
双正态B
可以计算为(三个共线点的情况除外 - 这里没有定义双正态,如果可能的话,可以使用以前的值(
B = Cross(Next-Curr, Curr - Prev)
请注意,更可靠的切线值也可能考虑相邻点 - 因此
T = Next - Curr
您可以使用(当间距相当均匀时((在此处比较(
T = Next - Prev
MBo, 感谢加急响应和基于您的建议的例程如下:
void cap_middle(int i, double theta, float[,] mmp, vec3 prev, vec3 curr, vec3 next,float rad,float[] cen)
{
vec3 T = (curr - next);
T = T.Normalized;
vec3 B = vec3.Cross(next - curr, curr - prev);
B = B.Normalized;
vec3 N = vec3.Cross(B, T);
N = N.Normalized;
float x = (float)Math.Cos(theta)*rad;
float y = (float)Math.Sin(theta)*rad;
vec3 vertex = curr + B * x + N * y;
mmp[i,0] = cen[0] + vertex.x;
mmp[i,1] = cen[1] + vertex.y;
mmp[i,2] = cen[2] + vertex.z;
}
尽管出现了另一个问题,但连接的每个贝塞尔路径的连接气缸似乎存在绕组顺序问题,如附图所示。 顶点不一致。有什么想法吗?
上链顺序