获取圆方程点的切向量

getting tangent vectors for circle equation points

我正在尝试获取圆上每个点的切向量,我尝试使用圆方程的导数,但结果在视口中看起来不对,所以我想知道是否可以找到这里有一些帮助

代码

public void OnDrawGizmos(){
    step = (360.0f * Mathf.Deg2Rad) / numberOfPoints ;
    CreateVertices();
}


void CreateVertices()
{

    Points.Clear();
    Normals.Clear();
    Tangents.Clear();

    float dynamicAngle = 0.0f;
    for (int i = 0; i <= numberOfPoints; i++)
    {
        Vector3 point;
        point.x = transform.position.x + Radius * Mathf.Cos(dynamicAngle);
        point.y = transform.position.y + Radius * Mathf.Sin(dynamicAngle);
        point.z = transform.position.z;


        dynamicAngle = dynamicAngle + step;
        if (i >= 1)
        {
            Gizmos.color = Color.red;
            Gizmos.DrawLine(Points[i - 1], point);
            Gizmos.color = Color.white;
        }
        Points.Add(point);
        CalculateNormals(dynamicAngle ,point);
        CalculateTangents(dynamicAngle,i  , point);

    }

}

void CalculateNormals(float dynamicAngle , Vector3 point)
{
    Vector3 Normal = (point - transform.position).normalized;

    Gizmos.color = Color.magenta;
    Gizmos.DrawLine(Normal, point);
    Gizmos.color = Color.white;

    Normals.Add(Normal);

}

void CalculateTangents(float dynamicAngle,int i  ,Vector3 point)
{
    Vector3 tangent;

      tangent = new Vector3(-Normals[i].y, Normals[i].x, 0);
      tangent.Normalize();

    Gizmos.color = Color.blue;
    Gizmos.DrawLine(  point, tangent);
    Gizmos.color = Color.white;

    Tangents.Add(tangent);
}

蓝色是切线紫色是法线,你可以看到它们不是垂直的:

为了更好地理解我的问题,这里是来自 unity viewport 的 gif:

因为你已经计算了法线,你可以使用叉积得到相应的切线

Vector3 up = new Vector3(0, 0, 1); // up side of your circle
Vector3 tangent = Vector3.Cross(normal, up);

如果你只需要在特定平面上使用圆圈你也可以使用这种简化

Vector3 tangent = new Vector3(-normal.y, normal.x, 0);

编辑:

法线和切线是方向向量。它们从 point 指向法线/切线指向的方向。要绘制切线,您必须使用

传递正确的直线起点和终点
Gizmos.DrawLine(point, point + tangent);

如果将 GameObject 移离原点,您会注意到法线也会变形,原因相同。

您正在使用二维参数方程:

x = x0 + r*cos(a)
y = y0 + r*sin(a)
z = z0
a = <0,2*Pi>

切线是单位圆坐标,圆心为 (0,0,0),但偏移了 90 度:

tx = cos(a (+/-) pi/4)
ty = sin(a (+/-) pi/4)
tz = 0

同样的双切线是:

bx = (+/-) cos(a)
by = (+/-) sin(a)
bz = 0

最后正常的是

nx = 0
ny = 0
nz = (+/-) 1

标志取决于您的坐标系约定和移动方向。