def make_calpha_arrow_mesh(trace, length=0.7, width=0.35, thickness=0.3): arrow = render.Arrow(length, width, thickness) n_point = len(trace.points) triangle_store = TriangleStore(n_point * len(arrow.indices)) for i_point in range(n_point): orientate = arrow.get_orientate(trace.tangents[i_point], trace.ups[i_point], 1.0) for indices in group(arrow.indices, 3): points = [arrow.vertices[i] for i in indices] normal = v3.cross(points[1] - points[0], points[0] - points[2]) normal = v3.transform(orientate, normal) for point in points: triangle_store.add_vertex( v3.transform(orientate, point) + trace.points[i_point], normal, trace.residues[i_point].color, trace.objids[i_point]) return triangle_store.vertex_buffer()
def make_cylinder_trace_mesh(pieces, coil_detail=4, radius=0.3): cylinder = render.Cylinder(coil_detail) n_point = sum(len(piece.points) for piece in pieces) triangle_store = TriangleStore(2 * n_point * cylinder.n_vertex) for piece in pieces: points = piece.points for i_point in xrange(len(points) - 1): tangent = 0.5 * (points[i_point + 1] - points[i_point]) up = piece.ups[i_point] + piece.ups[i_point + 1] orientate = cylinder.get_orientate(tangent, up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + points[i_point], v3.transform(orientate, normal), piece.residues[i_point].color, piece.objids[i_point]) orientate = cylinder.get_orientate(-tangent, up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + points[i_point + 1], v3.transform(orientate, normal), piece.residues[i_point + 1].color, piece.objids[i_point + 1]) return triangle_store.index_buffer(), triangle_store.vertex_buffer()
def make_cylinder_trace_mesh(pieces, coil_detail=4, radius=0.3): cylinder = render.Cylinder(coil_detail) n_point = sum(len(piece.points) for piece in pieces) triangle_store = TriangleStore(2 * n_point * cylinder.n_vertex) for piece in pieces: points = piece.points for i_point in xrange(len(points) - 1): tangent = 0.5*(points[i_point+1] - points[i_point]) up = piece.ups[i_point] + piece.ups[i_point+1] orientate = cylinder.get_orientate(tangent, up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + points[i_point], v3.transform(orientate, normal), piece.residues[i_point].color, piece.objids[i_point]) orientate = cylinder.get_orientate(-tangent, up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + points[i_point+1], v3.transform(orientate, normal), piece.residues[i_point+1].color, piece.objids[i_point+1]) return triangle_store.index_buffer(), triangle_store.vertex_buffer()
def make_calpha_arrow_mesh( trace, length=0.7, width=0.35, thickness=0.3): arrow = render.Arrow(length, width, thickness) n_point = len(trace.points) triangle_store = TriangleStore(n_point*len(arrow.indices)) for i_point in range(n_point): orientate = arrow.get_orientate( trace.tangents[i_point], trace.ups[i_point], 1.0) for indices in group(arrow.indices, 3): points = [arrow.vertices[i] for i in indices] normal = v3.cross(points[1] - points[0], points[0] - points[2]) normal = v3.transform(orientate, normal) for point in points: triangle_store.add_vertex( v3.transform(orientate, point) + trace.points[i_point], normal, trace.residues[i_point].color, trace.objids[i_point]) return triangle_store.vertex_buffer()
def make_ball_and_stick_mesh( rendered_soup, sphere_stack=5, sphere_arc=5, tube_arc=5, radius=0.2): sphere = render.Sphere(sphere_stack, sphere_arc) cylinder = render.Cylinder(4) n_vertex = len(rendered_soup.draw_to_screen_atoms)*sphere.n_vertex n_vertex += len(rendered_soup.bonds)*cylinder.n_vertex triangle_store = render.TriangleStore(n_vertex) for atom in rendered_soup.draw_to_screen_atoms: triangle_store.setup_next_strip(sphere.indices) orientate = sphere.get_orientate(radius) for point in sphere.points: triangle_store.add_vertex( v3.transform(orientate, point) + atom.pos, point, # same as normal! atom.residue.color, atom.residue.objid) for bond in rendered_soup.bonds: orientate = cylinder.get_orientate(bond.tangent, bond.up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + bond.atom1.pos, v3.transform(orientate, normal), bond.atom1.residue.color, bond.atom1.residue.objid) return triangle_store.index_buffer(), triangle_store.vertex_buffer()
def test_matrix_combination(): n = 4 x = v3.random_vector() y1 = v3.vector(x) matrix = v3.identity() for i in range(4): r_matrix = v3.random_matrix() y1 = v3.transform(r_matrix, y1) matrix = v3.combine(r_matrix, matrix) y2 = v3.transform(matrix, x) assert v3.is_similar_vector(y1, y2)
def test_orthogonality(): x = v3.vector(v3.random_mag(), 0, 0) y = v3.vector(0, v3.random_mag(), 0) z = v3.vector(0, 0, v3.random_mag()) ry_x = v3.transform(v3.rotation(y, v3.radians(90)), x) assert v3.is_similar_vector(v3.norm(ry_x), -v3.norm(z)) assert v3.is_similar_mag(v3.mag(ry_x), v3.mag(x)) ry_z = v3.transform(v3.rotation(y, v3.radians(90)), z) assert v3.is_similar_vector(v3.norm(ry_z), v3.norm(x)) cross_x_y = v3.cross(x, y) assert v3.is_similar_vector(v3.norm(cross_x_y), v3.norm(z)) cross_y_x = v3.cross(y, x) assert v3.is_similar_vector(v3.norm(cross_y_x), -v3.norm(z))
def make_ball_and_stick_mesh(rendered_soup, sphere_stack=5, sphere_arc=5, tube_arc=5, radius=0.2): sphere = render.Sphere(sphere_stack, sphere_arc) cylinder = render.Cylinder(4) n_vertex = len(rendered_soup.draw_to_screen_atoms) * sphere.n_vertex n_vertex += 2 * len(rendered_soup.bonds) * cylinder.n_vertex triangle_store = TriangleStore(n_vertex) for atom in rendered_soup.draw_to_screen_atoms: triangle_store.setup_next_strip(sphere.indices) orientate = sphere.get_orientate(radius) for point in sphere.points: triangle_store.add_vertex( v3.transform(orientate, point) + atom.pos, point, # same as normal! atom.residue.color, atom.objid) for bond in rendered_soup.bonds: tangent = 0.5 * bond.tangent orientate = cylinder.get_orientate(tangent, bond.up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + bond.atom1.pos, v3.transform(orientate, normal), bond.atom1.residue.color, bond.atom1.objid) orientate = cylinder.get_orientate(-tangent, bond.up, radius) triangle_store.setup_next_strip(cylinder.indices) for point, normal in zip(cylinder.points, cylinder.normals): triangle_store.add_vertex( v3.transform(orientate, point) + bond.atom2.pos, v3.transform(orientate, normal), bond.atom2.residue.color, bond.atom2.objid) return triangle_store.index_buffer(), triangle_store.vertex_buffer()
def __init__(self, n_arc=10, radius=1.0): self.n_arc = n_arc tangent = v3.vector(0, 0, 1) rotator = v3.vector(0, radius, 0) self.arcs = [] angle = v3.radians(360 / n_arc) rotation = v3.rotation(tangent, angle) self.arcs.append(v3.vector(rotator)) for i_segment in range(n_arc - 1): rotator = v3.transform(rotation, rotator) self.arcs.append(rotator) self.normals = calc_cyclic_normals(self.arcs, tangent)
def test_rotation(): x = v3.random_vector() y = v3.transform(v3.random_rotation(), x) assert v3.is_similar_mag(v3.mag(x), v3.mag(y))
def test_translation(): x = v3.vector(v3.random_mag(), 0, 0) y = v3.vector(0, v3.random_mag(), 0) x_and_y = v3.transform(v3.translation(y), x) assert v3.is_similar_vector(x_and_y, x+y)
def test_translation(): x = v3.vector(v3.random_mag(), 0, 0) y = v3.vector(0, v3.random_mag(), 0) x_and_y = v3.transform(v3.translation(y), x) assert v3.is_similar_vector(x_and_y, x + y)
def build_triangles(self, vertex_buffer): n_point = len(self.trace.points) n_arc = len(self.profile.arcs) # draw front face indices = [] for i_arc in range((n_arc - 1) / 2): indices.extend([i_arc, i_arc + 1, n_arc - 1 - i_arc]) indices.extend([n_arc - 1 - i_arc, i_arc + 1, n_arc - 2 - i_arc]) vertex_buffer.setup_next_strip(indices) m = get_xy_face_transform(self.trace.tangents[0], self.trace.ups[0], 1.0) arcs = [ v3.transform(m, a) + self.trace.points[0] for a in self.profile.arcs ] normal = -self.trace.tangents[0] for i_arc in range(n_arc): vertex_buffer.add_vertex(arcs[i_arc], normal, self.color, self.trace.objids[0]) # draw extrusion in tube indices = [] for i_point in range(n_point - 1): i_slice_offset = i_point * n_arc j_slice_offset = (i_point + 1) * n_arc for i_arc in range(n_arc): j_arc = (i_arc + 1) % n_arc indices.append(i_slice_offset + i_arc) indices.append(j_slice_offset + i_arc) indices.append(i_slice_offset + j_arc) indices.append(i_slice_offset + j_arc) indices.append(j_slice_offset + i_arc) indices.append(j_slice_offset + j_arc) vertex_buffer.setup_next_strip(indices) for i in range(n_point): m = get_xy_face_transform(self.trace.tangents[i], self.trace.ups[i], 1.0) arcs = [ v3.transform(m, a) + self.trace.points[i] for a in self.profile.arcs ] normals = [v3.transform(m, n) for n in self.profile.normals] for i_arc in range(n_arc): vertex_buffer.add_vertex(arcs[i_arc], normals[i_arc], self.color, self.trace.objids[i]) # draw back face indices = [] for i_arc in range((n_arc - 1) / 2): indices.extend([i_arc, i_arc + 1, n_arc - 1 - i_arc]) indices.extend([n_arc - 1 - i_arc, i_arc + 1, n_arc - 2 - i_arc]) vertex_buffer.setup_next_strip(indices) i_point = n_point - 1 m = get_xy_face_transform(self.trace.tangents[i_point], self.trace.ups[i_point], 1.0) arcs = [ v3.transform(m, a) + self.trace.points[i_point] for a in self.profile.arcs ] normal = self.trace.tangents[i_point] for i_arc in reversed(range(n_arc)): vertex_buffer.add_vertex(arcs[i_arc], normal, self.color, self.trace.objids[i_point])