예제 #1
0
 def translate(self, T):
     TM = vl.translation_matrix(T)
     for P in self.P:
         new_vertices = [
             vl.transform(TM, P.vertices[:, i:i + 1])
             for i in range(P.vertices.shape[1])
         ]
         P.vertices = np.concatenate(new_vertices, axis=1)
예제 #2
0
    def __init__(self, center, radius, length=np.inf, closed=True):
        super(Cylinder, self).__init__()
        self.center = np.reshape(center, (-1, 1))
        self.radius = radius
        self.length = length
        self.closed = closed

        self.z_min = -1.
        self.z_max = 1.

        self.T = vl.translation_matrix(center)
        self.S = vl.scale_matrix([radius, radius, length / 2.])
예제 #3
0
파일: plane.py 프로젝트: nlintz/Raytracer
 def __init__(self, center, normal):
     self.center = np.reshape(center, (-1, 1))
     self.normal = np.reshape(normal, (-1, 1))
     self.T = vl.translation_matrix(center)
예제 #4
0
 def translate(self, T):
     self.T = np.dot(self.T, vl.translation_matrix(T))
예제 #5
0
파일: camera.py 프로젝트: nlintz/Raytracer
 def translate(self, T):
     TM = vl.translation_matrix(T)
     self.origin = vl.transform(TM, self.origin)
     self.screen = vl.transform(TM, self.screen)
예제 #6
0
    def __init__(self, center, divs, radius=1.):
        num_vertices = (divs - 1) * divs + 2
        u = -np.pi / 2
        v = -np.pi
        du = np.pi / divs
        dv = 2 * np.pi / divs
        st = []
        P = [[0., -radius, 0.]]
        N = [[0., -radius, 0.]]
        for i in range(divs - 1):
            u += du
            v = -np.pi
            for j in range(divs):
                x = radius * np.cos(u) * np.cos(v)
                y = radius * np.sin(u)
                z = radius * np.cos(u) * np.sin(v)
                P.append([x, y, z])
                N.append([x, y, z])
                st.append([u / np.pi + 0.5, v * 0.5 / np.pi + 0.5])
                v += dv
        P.append([0., radius, 0.])
        N.append([0., radius, 0.])
        npolys = divs * divs

        face_index = []
        verts_index = [0 for _ in range((6 + (divs - 1) * 4) * divs)]
        vid = 1
        l = 0
        num_v = 0
        for i in range(divs):
            for j in range(divs):
                if i == 0:
                    face_index.append(3)
                    verts_index[l] = (0)
                    verts_index[l + 1] = (j + vid)
                    if j == (divs - 1):
                        verts_index[l + 2] = vid
                    else:
                        verts_index[l + 2] = (j + vid + 1)
                    l += 3
                elif i == (divs - 1):
                    face_index.append(3)
                    verts_index[l] = (j + vid + 1 - divs)
                    verts_index[l + 1] = (vid + 1)
                    if j == (divs - 1):
                        verts_index[l + 2] = (vid + 1 - divs)
                    else:
                        verts_index[l + 2] = (j + vid + 2 - divs)
                    l += 3
                else:
                    face_index.append(4)
                    verts_index[l] = (j + vid + 1 - divs)
                    verts_index[l + 1] = (j + vid + 1)
                    if j == (divs - 1):
                        verts_index[l + 2] = (vid + 1)
                    else:
                        verts_index[l + 2] = (j + vid + 2)
                    if j == (divs - 1):
                        verts_index[l + 3] = (vid + 1 - divs)
                    else:
                        verts_index[l + 3] = (j + vid + 2 - divs)
                    l += 4
                # print i, j
                num_v += 1
            vid = num_v

        P = np.array(P).T
        P = vl.transform(vl.translation_matrix(center), P)
        super(TriSphere, self).__init__(npolys, face_index, verts_index, P)
예제 #7
0
파일: sphere.py 프로젝트: nlintz/Raytracer
 def __init__(self, center, radius):
     super(Sphere, self).__init__()
     self.center = np.reshape(center, (-1, 1))
     self.radius = radius
     self.S = vl.scale_matrix([radius, radius, radius])
     self.T = vl.translation_matrix(center)