得到圆方程点的切向量

时间:2018-01-08 23:45:30

标签: unity3d math geometry derivative

我试图获得圆上每个点的切线向量,我试图将导数用于圆方程,但结果在视口中看起来很清楚,所以我想知道我是否在可以在这里找到一些帮助

代码

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);
}

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

img

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

img

2 个答案:

答案 0 :(得分:0)

由于您已经计算了法线,因此您可以使用叉积来获得相应的切线

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

如果您只需要在特定平面上使用圆圈,您也可以使用此简化

point

修改

法线和切线是方向向量。它们从Gizmos.DrawLine(point, point + tangent); 指向法线/切线指向的方向。要绘制切线,必须使用

传递线的正确起点和终点
runas

如果你将GameObject从原点移开,你会注意到法线也会变形,这也有同样的原因。

答案 1 :(得分:0)

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

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

符号取决于您的坐标系惯例和移动方向。