获取圆方程点的切向量
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
标志取决于您的坐标系约定和移动方向。
我正在尝试获取圆上每个点的切向量,我尝试使用圆方程的导数,但结果在视口中看起来不对,所以我想知道是否可以找到这里有一些帮助
代码
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
标志取决于您的坐标系约定和移动方向。