def angleBetweenVectors(vector1: Vector, vector2: Vector) -> float: dot = vector1.dot(vector2) denom = vector1.length() * vector2.length() if denom > 1.e-3: angle = numpy.arccos(dot / denom) return 0.0 if numpy.isnan(angle) else angle return 0.0
def _rotateCamera(self, x, y): camera = self._scene.getActiveCamera() if not camera or not camera.isEnabled(): return self._scene.acquireLock() dx = math.radians(x * 180.0) dy = math.radians(y * 180.0) diff = camera.getPosition() - self._origin diff_flat = Vector(diff.x, 0.0, diff.z).getNormalized() try: new_angle = math.acos(diff_flat.dot(diff.getNormalized())) + dy except ValueError: return m = Matrix() m.setByRotationAxis(dx, Vector.Unit_Y) if new_angle < (math.pi / 2 - 0.01): m.rotateByAxis(dy, Vector.Unit_Y.cross(diff).normalize()) n = diff.multiply(m) n += self._origin camera.setPosition(n) camera.lookAt(self._origin) self._scene.releaseLock()
def __imul__(self, other): if type(other) is Quaternion: v1 = Vector(other.x, other.y, other.z) v2 = Vector(self.x, self.y, self.z) w = other.w * self.w - v1.dot(v2) v = v2 * other.w + v1 * self.w + v2.cross(v1) self._data[0] = v.x self._data[1] = v.y self._data[2] = v.z self._data[3] = w elif type(other) is float or type(other) is int: self._data *= other else: raise NotImplementedError() return self