Я программирую пользовательские карты Starcraft 2 и получаю некоторые прогеммы с математикой в 3D. В настоящее время я пытаюсь создать и повернуть точку вокруг произвольной оси, заданной x, y и z (вектор xyz нормирован).
Я много пробовал и читал много вещей в Интернете, но я просто не могу понять, как он работает правильно. Мой текущий script (вы, вероятно, не знаете язык, но он ничего особенного) является результатом разрыва всего в течение нескольких часов (не работает корректно):
point CP;
fixed AXY;
point D;
point DnoZ;
point DXY_Z;
fixed AZ;
fixed LXY;
missile[Missile].Angle = (missile[Missile].Angle + missile[Missile].Acceleration) % 360.0;
missile[Missile].Acceleration += missile[Missile].AirResistance;
if (missile[Missile].Parent > -1) {
D = missile[missile[Missile].Parent].Direction;
DnoZ = Point(PointGetX(D),0.0);
DXY_Z = Normalize(Point(SquareRoot(PointDot(DnoZ,DnoZ)),PointGetHeight(D)));
AZ = MaxF(ACos(PointGetX(DXY_Z)),ASin(PointGetY(DXY_Z)))+missile[Missile].Angle;
DnoZ = Normalize(DnoZ);
AXY = MaxF(ACos(PointGetX(DnoZ)),ASin(PointGetY(DnoZ)));
CP = Point(Cos(AXY+90),Sin(AXY+90));
LXY = SquareRoot(PointDot(CP,CP));
if (LXY > 0) {
CP = PointMult(CP,Cos(AZ)/LXY);
PointSetHeight(CP,Sin(AZ));
} else {
CP = Point3(0.0,0.0,1.0);
}
} else {
CP = Point(Cos(missile[Missile].Angle),Sin(missile[Missile].Angle));
}
missile[Missile].Direction = Normalize(CP);
missile[Missile].Position = PointAdd(missile[Missile].Position,PointMult(missile[Missile].Direction,missile[Missile].Distance));
Я просто не могу разобраться в математике. Если вы сможете объяснить это простым языком, что было бы лучшим решением, то код был бы очень полезен (но не совсем так же полезен, потому что я планирую сделать больше 3D-материалов в будущем).