C# 将三角形旋转到Z=0

C# 将三角形旋转到Z=0,c#,xna,rotation,geometry,C#,Xna,Rotation,Geometry,我想用XNA在三维空间的三角形上打个洞。 我想把这个问题转换成二维空间。 但是我不知道如何旋转所有点都是Z=0的三角形。 点1的坐标为X=0,Y=0,Z=0。 有人知道解决办法吗? LG 延斯 选择一个不在(0,0,0)的点。围绕y轴旋转形状,直到该点的z值为0 选择剩余的点。围绕X轴旋转形状,直到该点的z值为0 给定P1,P2,P3三角形的点 让我们注意一下: a=P2-P1 b=P3-P1 n=Vector3.叉积(a,b).归一化()->n是三角形的法线 三角形位于Z=0平面中,当且仅

我想用XNA在三维空间的三角形上打个洞。 我想把这个问题转换成二维空间。 但是我不知道如何旋转所有点都是Z=0的三角形。 点1的坐标为X=0,Y=0,Z=0。 有人知道解决办法吗? LG 延斯

  • 选择一个不在(0,0,0)的点。围绕y轴旋转形状,直到该点的z值为0

  • 选择剩余的点。围绕X轴旋转形状,直到该点的z值为0


  • 给定
    P1
    P2
    P3
    三角形的点

    让我们注意一下:

    • a=P2-P1
    • b=P3-P1
    • n=Vector3.叉积(a,b).归一化()
      ->
      n
      是三角形的法线
    三角形位于
    Z=0
    平面中,当且仅当且仅当,
    n.Z=0
    然后,只需使用:

    • d=Vector3.CrossProduct(n,z).Normalized()
      ->它是旋转的轴
    • angle=(float)System.Math.Acos(Vector3.DotProduct(n,z))
      ->这是旋转的角度
    代码是:

    Vector3 a = P2 - P1;
    Vector3 b = P3 - P1;
    Vector3 n = Vector3.Cross(a, b);
    n.Normalize();
    Vector3 d = Vector3.Cross(n, Vector3.UnitZ);
    d.Normalize();
    float angle = (float)System.Math.Acos(Vector3.Dot(n, Vector3.UnitZ));
    
    Vector3 newpoint2 = P1 + Vector3.Transform(a, Matrix.CreateFromAxisAngle(d, angle));
    Vector3 newpoint3 = P1 + Vector3.Transform(b, Matrix.CreateFromAxisAngle(d, angle));
    

    d=Vector3.叉积(n,z)->它是你旋转的轴。什么是z?向量3 P1=AVertex[Dreieck1.A];Vector3 P2=AVertex[Dreieck1.B];Vector3 P3=AVertex[Dreieck1.C];向量3a=P2-P1;向量3B=P3-P1;向量3 n1=向量3.交叉(a,b);向量3 n=向量3.归一化(n1);vector3d=Vector3.Cross(n,Vector3.UnitZ);双角度=System.Math.Acos(Vector3.Dot(n,Vector3.UnitZ));Vector3 newpoint=Vector3.Transform(P2,矩阵.CreateRotationX((浮动)角度));这样地?但是z不是0 z:/n您不使用d。Vector3 newpoint=Vector3.Transform(P2,矩阵。CreateFromAxisAngle(d,(浮点)angle*180/3.1415926535f))@Jens抱歉,我认为角度以度为单位,但以弧度为单位。我更新了我的帖子。但我的结果仍然不是0。我会试试,但我认为这不会有好的表现吗?@Jens这只是第一个想法。如果你找到了另一种更快的算法,那么一定要使用它。