Rotation circulaire autour d'un axe arbitraire

Je suis de programmation de Starcraft 2 cartes personnalisées et quelques proglems avec les mathématiques en 3D. Actuellement, je suis en train de créer et tourner un point autour d'un axe arbitraire, donnée par x,y et z (xyz vecteur est normalisée).

J'ai essayé autour d'un lot, et de lire beaucoup de choses sur internet, mais je ne peux pas comment il fonctionne correctement. Mon script actuel (vous avez probablement ne savez pas la langue, mais c'est rien de spécial) est le résultat de tout casser pendant des heures (ne fonctionne pas correctement):

    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));

J'ai juste ne peux pas obtenir mon esprit autour des mathématiques. Si vous pouvez l'expliquer en termes simples ce serait la meilleure solution, un code ciselée serait bien aussi (mais pas tout à fait comme utile, parce que j'ai l'intention de faire plus de 3D dans le futur).

OriginalL'auteur Alexander | 2011-07-17