Osäker på om jag skulle posta denna i matematik-forumet eller här då det faller över bägge ämnena.
Jag arbetar med PyMEL vilket är en Python-modul som innehåller funktioner och klasser för 3d-programmet Autodesk Maya's native-språk MEL, så i koden nedan så är det ganska mycket kommentarer så att det ska vara tydligt vad som sker här.
Jag arbetar med PyMEL vilket är en Python-modul som innehåller funktioner och klasser för 3d-programmet Autodesk Maya's native-språk MEL, så i koden nedan så är det ganska mycket kommentarer så att det ska vara tydligt vad som sker här.
Kod:
Problemet mitt är att ibland så stämmer rotationen, ibland inte. När det blir fel så är antingen vinkeln negativ - dvs att den kanske roterar min vector minus 36 grader istället för 36 som den borde göra. Ibland får jag också en konstig rotation som är exakt 180 grader minus resultatet i angle.
# targetP0 - target vector point 0, in the form of pm.datatypes.Point() # sourceP1 - source vector point 1... # etc... # pm.datatypes.Point() tar helt enkelt en tupel och gör om till ett objekt utav klassen Point, som senare används för klassen Vector. Inga konstigheter där - datan stämmer helt och hållet! # Create vectors sourceVector = pm.datatypes.Vector(sourceP1[0] - sourceP0[0], sourceP1[1] - sourceP0[1], 0.0) targetVector = pm.datatypes.Vector(targetP0[0] - targetP1[0], targetP0[1] - targetP1[1], 0.0) # Calculate dot product and get sign for the angle # Funktionen dot kör helt enkelt punktprodukten (skalärprodukt) utav två vektorer. Syntaxet är vector1.dot(vector2) temp = sourceVector.dot(targetVector) if temp > 0: # Same sign = 1 elif temp < 0: # Opposite sign = -1 sourceVector = -sourceVector else: # Perpendicular sign = 0 # Calculate angle - returns unsigned angle as degrees # Detta säger PyMEL dokumentationen om funktionen angle utav klassen Vector: # Returns the angle (in radians) between the two vectors u and v Note that this angle is not signed, use axis to know the direction of the rotation. # axis behöver jag dock inte köra då jag redan beräknat punktprodukten ovan och har mitt "sign" - eller? angle = math.degrees(sourceVector.angle(targetVector)) # Set correct sign angle = angle * sign # Rotate vector by the value in angle