Пример изображения здесь Я пытаюсь найти способ вычислить точки на верхней поверхности моего цилиндра. Моя ситуация выглядит следующим образом, у меня есть вектор, который определяет направление моих цилиндров в 3d комнате. Тогда я уже вычислил перпендикулярный вектор с помощью
Vector3.Cross(vector1, vector2)
. Теперь я использую диаметр / 2, чтобы вычислить точку, которая лежит на краю круглой верхней поверхности моего цилиндра. Теперь я хочу всегда поворачивать мой вектор на 90 градусов, чтобы получить 4 точки на краю поверхности. Все 4 вектора, определяющие их, должны быть перпендикулярны направлению цилиндров. Можете ли вы помочь мне, как я могу повернуть первый перпендикуляр, чтобы добиться этого?
Я уже пробовал:
Matrix4x4.CreateFromAxisAngle(vectorcylinderdirection, radiant)
Затем я снова вычислил кросс-произведение, но оно не работает, как я хочу.
Редактировать:
public static void calculatePontsOnCylinder()
{
//Calculate Orthogonal Vector to Direction
Vector3 tCylinderDirection = new Vector3(1, 0, 0);
Vector3 tOrthogonal = Vector3.Cross(tCylinderDirection, new Vector3(-tCylinderDirection.Z,tCylinderDirection.X,tCylinderDirection.Y));
Vector3 tNormOrthogonal = Vector3.Normalize(tOrthogonal);
//Calculate point on surface circle of cylinder
//10mm radius
int tRadius = 10;
Vector3 tPointFinder = tNormOrthogonal * tRadius;
//tPointFinder add the cylinder start point
//not yet implemented
//now i need to rotate the vector always 90 degrees to find the 3 other points on the circular top surface of the cylinder
//don't know how to do this
// I thought this should do it
Matrix4x4.CreateFromAxisAngle(tCylinderDirection, (float)DegreeToRadian(90));
}
private static double DegreeToRadian(double angle)
{
return Math.PI * angle / 180.0;
}
На рисунке вы можете увидеть пример, вектор1 - это то, что мне нужно, всегда поворачивается на 90 градусов, а вектор2 будет моим вектором направления цилиндра
Возможно, я нашел правильную формулу:
Vector3 tFinal = Vector3.Multiply((float)Math.Cos(DegreeToRadian(90)), tPointFinder) + Vector3.Multiply((float)Math.Sin(DegreeToRadian(90)), Vector3.Cross(tCylinderDirection, tPointFinder));
Vector3 tFinal180 = Vector3.Multiply((float)Math.Cos(DegreeToRadian(180)), tPointFinder) + Vector3.Multiply((float)Math.Sin(DegreeToRadian(180)), Vector3.Cross(tCylinderDirection, tPointFinder));
Vector3 tFinal270= Vector3.Multiply((float)Math.Cos(DegreeToRadian(270)), tPointFinder) + Vector3.Multiply((float)Math.Sin(DegreeToRadian(270)), Vector3.Cross(tCylinderDirection, tPointFinder));
Интересно то, что если я попробую его с (1,1,0) в качестве направления цилиндра, это даст мне правильные направления, но длина будет отличаться для 90 градусов и 270.