Example #1
0
    def getProjection(self, jittered=False, point=None):
        if self.is_perspective:
            viewportRadius = self.near_plane * math.tan(
                self.fov_degrees / 2.0 / 180.0 * math.pi)
        else:
            viewportRadius = self.ortogrphic_width * 0.5

        if self.viewportWidthInPixels < self.viewportHeightInPixels:
            viewportWidth = 2.0 * viewportRadius
            viewportHeight = viewportWidth * self.viewportHeightInPixels / float(
                self.viewportWidthInPixels)
        else:
            viewportHeight = 2.0 * viewportRadius
            viewportWidth = viewportHeight * self.viewportWidthInPixels / float(
                self.viewportHeightInPixels)

        left = 0.5 * viewportWidth
        right = -0.5 * viewportWidth
        bottom = -0.5 * viewportHeight
        top = 0.5 * viewportHeight

        if jittered:
            if not point:
                x_j = random.uniform(
                    -.75, .75) * viewportWidth / self.viewportWidthInPixels
                y_j = random.uniform(
                    -.75, .75) * viewportHeight / self.viewportHeightInPixels
            else:
                x_j = (point[0] -
                       0.5) * 1.0 * viewportWidth / self.viewportWidthInPixels
                y_j = (point[1] - 0.5
                       ) * 1.0 * viewportHeight / self.viewportHeightInPixels

            left += x_j
            right += x_j
            top += y_j
            bottom += y_j

        if self.is_perspective:
            return Matrix44.perspective_projection_bounds(
                left, right, top, bottom, self.near_plane, self.far_plane)
        else:
            return Matrix44.orthogonal_projection(left, right, top, bottom,
                                                  self.near_plane,
                                                  self.far_plane)