我试图获得圆上每个点的切线向量,我试图将导数用于圆方程,但结果在视口中看起来很清楚,所以我想知道我是否在可以在这里找到一些帮助
代码
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视口的gif:
答案 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
符号取决于您的坐标系惯例和移动方向。