少し前に、3D 空間で楕円をプロットする際に問題が発生しました。私が持っていた解決策は機能しているように見え、必要な方法で物事を回転させました(当時)。私が持っているソリューションはほぼ完璧に機能します。楕円を正しい向きに回転します...ただし、楕円の始点と終点 (図ではシアンと赤の十字で示されています) は常に正しく配置されていません。ここに何が起こっているのか、そして私が何をする必要があるのか を示すいくつかの写真があります.
最初の図は、回転が y 軸でのみ発生した場合の結果を示しています。シアンの十字が足にあり、赤の十字が楕円の反対側の端にあります。ただし、2 番目の画像では楕円が正しい向きになっていますが、十字が正しい位置に配置されていないようです。(黒い線が楕円と交わる点にあるはずです。
現時点でのコードはこれです。
public static void DrawEllipse(Vector3 p1, Vector3 p2, float height, Vector3 up)
{
Quaternion quat = Quaternion.identity;
int halfPoints = 25;
int totalPoints = halfPoints*2;
Vector3[] points1 = new Vector3[halfPoints];
Vector3[] points2 = new Vector3[halfPoints];
Vector3 midPoint = (p1 + ((p2 - p1)) * 0.5f);
Vector3 tmp = Vector3.zero;
quat *= Quaternion.LookRotation(Vector3.Cross(up,p2-p1));
for (int i = 0; i < totalPoints; i++)
{
// build the coordinates in arbitrary space.
tmp = Vector3.zero;
tmp.x = Mathf.Cos(((float)i / totalPoints) * (Mathf.PI * 2)) * (Vector3.Distance(p1, p2) * 0.5f);
tmp.y = Mathf.Sin(((float)i / totalPoints) * (Mathf.PI * 2)) * height;
// modify the point for correct orientation.
tmp = (quat * tmp);
// push to the arrays (split to show outward and return halves)
if (i < halfPoints)
points1[i] = tmp + midPoint;
else
points2[i - halfPoints] = tmp + midPoint;
}
DrawPath(points1, Color.cyan, false);
DrawPath(points2, Color.red, false);
Debug.DrawLine(p1, p2, Color.black);
DrawCross(points1[0], 0.2f, Color.cyan);
DrawCross(points2[0], 0.2f, Color.red);
}
間違いなく、これは私が見逃している回転の余分なビットがあるか、回転する前に楕円生成への微調整を逃しているというばかげた問題ですが、私はしばらくの間円を描いて走ってきましたよく知っている人に尋ねる時が来ました。