2014-09-16 2 views
0

Je suis en train de construire un micro "moteur 3D" pour comprendre les bases de ce domaine. Tout fonctionne assez bien sauf pour les rotations. J'utilise les matrices de rotation standard pour ce faire, mais les trois rotations possibles ne font pas que pivoter les points, elles les réduisent également. Ce comportement n'est pas prévu ou souhaité. Voici la partie pertinente du code (je pense):Rotation matrice échelles vers le bas

class Point: 
def __init__(self, x, y, z, ui): 
    self.x = mpf(x) 
    self.y = mpf(y) 
    self.z = mpf(z) 
    self.ui = ui 

def subtractVectorFromPoint(self, vector): 
    self.x -= vector.x 
    self.y -= vector.y 
    self.z -= vector.z 
    return self 

def subtractPointFromPoint(self, point): 
    TempVector = Vector(0, 0, 0) 
    TempVector.x = self.x - point.x 
    TempVector.y = self.y - point.y 
    TempVector.z = self.z - point.z 
    return TempVector 

def setPointToPoint(self, point): 
    self.x = point.x 
    self.y = point.y 
    self.z = point.z 
    return self 


class Vector: 
def __init__(self, x, y ,z): 
    self.x = mpf(x) 
    self.y = mpf(y) 
    self.z = mpf(z) 

def rotateXY(self, degrees): 
    radians = mpf(math.radians(degrees)) 

    self.x = (math.cos(radians) * self.x) + (- math.sin(radians) * self.y) 
    self.y = (math.sin(radians) * self.x) + (math.cos(radians) * self.y) 
    return self 


#rotate xy plane by 15 degrees on pressing r 
if event.key == pygame.K_r: 
    origin = Vector(0, 0, 0) 
    UI.draw_background() 
    for point in pointList: 
     tempVector = point.subtractPointFromPoint(origin) 
     point.setPointToPoint(origin) 
     point.addVectorToPoint(tempVector.rotateXY(15)) 
     point.drawPoint() 

Cela devrait être tout ce que vous avez besoin, je pense. Tout pointeur vers où je me suis trompé est le bienvenu. Je sais que les classes manquent un tiret dans l'exemple ici, je crains pour la mise en page sur ce site :)

p.s. J'ai essayé d'utiliser la fonction "mpf()" pour augmenter la précision mais cela n'a eu aucun résultat.

+0

Pouvez-vous définir « l'échelle vers le bas »? Si vous testez l'amplitude de chacun de vos vecteurs pivotés, ils sont identiques. – user2085282

+0

J'utilise pygame pour me donner une représentation visuelle et les points ne tournent pas seulement autour de (0,0,0), ils s'en rapprochent également à chaque rotation. Avec suffisamment de rotations, chaque point finit sur (0,0,0), ce qui n'est évidemment pas souhaité. – Daquicker

+0

Et en guise de commentaire, au cas où vous n'êtes pas au courant, si vos classes ont une fonction '__add__', vous n'avez pas besoin de fonctions' addXtoY', et pouvez simplement utiliser l'opérateur '+ =' – user2085282

Répondre

0

Le problème est dans cette partie:

def rotateXY(self, degrees): 
    radians = mpf(math.radians(degrees)) 

    self.x = (math.cos(radians) * self.x) + (- math.sin(radians) * self.y) 
    self.y = (math.sin(radians) * self.x) + (math.cos(radians) * self.y) 
    return self 

self.y est calculée à l'aide d'un self.x qui est déjà réglé, ce qui problème donné.

Un correctif utilise une variable temporaire comme ceci:

def rotateXY(self, degrees): 
    radians = mpf(math.radians(degrees)) 

    tempX = (math.cos(radians) * self.x) + (- math.sin(radians) * self.y) 
    self.y = (math.sin(radians) * self.x) + (math.cos(radians) * self.y) 
    self.x = tempX 
    return self