def compute_dr_wrt(self, wrt): if wrt is not self.camera and wrt is not self.v: return None visibility = self.visibility_image visible = np.nonzero(visibility.ravel() != 4294967295)[0] barycentric = self.barycentric_image if wrt is self.camera: shape = visibility.shape depth = self.depth_image if self.overdraw: result1 = common.dImage_wrt_2dVerts_bnd( depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size / 3, self.f, self.boundaryid_image != 4294967295) else: result1 = common.dImage_wrt_2dVerts(depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size / 3, self.f) # result1 = common.dImage_wrt_2dVerts(depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f) return result1 elif wrt is self.v: IS = np.tile(col(visible), (1, 9)).ravel() JS = col(self.f[visibility.ravel()[visible]].ravel()) JS = np.hstack((JS * 3, JS * 3 + 1, JS * 3 + 2)).ravel() # FIXME: there should be a faster way to get the camera axis. # But it should be carefully tested with distortion present! pts = np.array([[self.camera.c.r[0], self.camera.c.r[1], 2], [self.camera.c.r[0], self.camera.c.r[1], 1]]) pts = self.camera.unproject_points(pts) cam_axis = pts[0, :] - pts[1, :] if True: # use barycentric coordinates (correct way) w = visibility.shape[1] pxs = np.asarray(visible % w, np.int32) pys = np.asarray(np.floor(np.floor(visible) / w), np.int32) bc0 = col(barycentric[pys, pxs, 0]) bc1 = col(barycentric[pys, pxs, 1]) bc2 = col(barycentric[pys, pxs, 2]) bc = np.hstack( (bc0, bc0, bc0, bc1, bc1, bc1, bc2, bc2, bc2)).ravel() else: # each vert contributes equally (an approximation) bc = 1. / 3. data = np.tile(row(cam_axis), (IS.size / 3, 1)).ravel() * bc result2 = sp.csc_matrix( (data, (IS, JS)), shape=(self.frustum['height'] * self.frustum['width'], self.v.r.size)) return result2
def compute_dr_wrt(self, wrt): if wrt is not self.camera and wrt is not self.vc and wrt is not self.bgcolor: return None visibility = self.visibility_image shape = visibility.shape color = self.color_image visible = np.nonzero(visibility.ravel() != 4294967295)[0] num_visible = len(visible) barycentric = self.barycentric_image if wrt is self.camera: if self.overdraw: return common.dImage_wrt_2dVerts_bnd(color, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f, self.boundaryid_image != 4294967295) else: return common.dImage_wrt_2dVerts(color, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f) elif wrt is self.vc: return common.dr_wrt_vc(visible, visibility, self.f, barycentric, self.frustum, self.vc.size, num_channels=self.num_channels) elif wrt is self.bgcolor: return common.dr_wrt_bgcolor(visibility, self.frustum, num_channels=self.num_channels)
def compute_dr_wrt(self, wrt): if wrt is not self.camera and wrt is not self.v: return None visibility = self.visibility_image visible = np.nonzero(visibility.ravel() != 4294967295)[0] barycentric = self.barycentric_image if wrt is self.camera: shape = visibility.shape depth = self.depth_image if self.overdraw: result1 = common.dImage_wrt_2dVerts_bnd(depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f, self.boundaryid_image != 4294967295) else: result1 = common.dImage_wrt_2dVerts(depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f) # result1 = common.dImage_wrt_2dVerts(depth, visible, visibility, barycentric, self.frustum['width'], self.frustum['height'], self.v.r.size/3, self.f) return result1 elif wrt is self.v: IS = np.tile(col(visible), (1, 9)).ravel() JS = col(self.f[visibility.ravel()[visible]].ravel()) JS = np.hstack((JS*3, JS*3+1, JS*3+2)).ravel() # FIXME: there should be a faster way to get the camera axis. # But it should be carefully tested with distortion present! pts = np.array([ [self.camera.c.r[0], self.camera.c.r[1], 2], [self.camera.c.r[0], self.camera.c.r[1], 1] ]) pts = self.camera.unproject_points(pts) cam_axis = pts[0,:] - pts[1,:] if True: # use barycentric coordinates (correct way) w = visibility.shape[1] pxs = np.asarray(visible % w, np.int32) pys = np.asarray(np.floor(np.floor(visible) / w), np.int32) bc0 = col(barycentric[pys, pxs, 0]) bc1 = col(barycentric[pys, pxs, 1]) bc2 = col(barycentric[pys, pxs, 2]) bc = np.hstack((bc0,bc0,bc0,bc1,bc1,bc1,bc2,bc2,bc2)).ravel() else: # each vert contributes equally (an approximation) bc = 1. / 3. data = np.tile(row(cam_axis), (IS.size/3,1)).ravel() * bc result2 = sp.csc_matrix((data, (IS, JS)), shape=(self.frustum['height']*self.frustum['width'], self.v.r.size)) return result2