[yt-svn] commit/yt: ngoldbaum: Merged in jisuoqing/yt (pull request #1299)
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Thu Nov 20 18:00:20 PST 2014
1 new commit in yt:
https://bitbucket.org/yt_analysis/yt/commits/7e6c439c67ca/
Changeset: 7e6c439c67ca
Branch: yt
User: ngoldbaum
Date: 2014-11-21 02:00:08+00:00
Summary: Merged in jisuoqing/yt (pull request #1299)
SphericalCamera and StereoSphericalCamera for VR are added
Affected #: 2 files
diff -r 1c1f9efebc9a743122f81eaf1e6f12dadad7a87c -r 7e6c439c67cae08f7430f2b5a03896e6d6d0a512 yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -22,6 +22,7 @@
from .camera import Camera, PerspectiveCamera, StereoPairCamera, \
off_axis_projection, FisheyeCamera, MosaicFisheyeCamera, \
- HEALpixCamera, InteractiveCamera, ProjectionCamera
+ HEALpixCamera, InteractiveCamera, ProjectionCamera, \
+ SphericalCamera, StereoSphericalCamera
from .transfer_function_helper import TransferFunctionHelper
diff -r 1c1f9efebc9a743122f81eaf1e6f12dadad7a87c -r 7e6c439c67cae08f7430f2b5a03896e6d6d0a512 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2342,6 +2342,179 @@
data_object_registry["projection_camera"] = ProjectionCamera
+class SphericalCamera(Camera):
+ def __init__(self, *args, **kwargs):
+ Camera.__init__(self, *args, **kwargs)
+ if(self.resolution[0]/self.resolution[1] != 2):
+ mylog.info('Warning: It\'s recommended to set the aspect ratio to 2:1')
+ self.resolution = np.asarray(self.resolution) + 2
+
+ def get_sampler_args(self, image):
+ px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+ py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
+
+ vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+ dtype='float64', order='C')
+ vectors[:,:,0] = np.cos(px) * np.cos(py)
+ vectors[:,:,1] = np.sin(px) * np.cos(py)
+ vectors[:,:,2] = np.sin(py)
+
+ vectors = vectors * self.width[0]
+ positions = self.center + vectors * 0
+ R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+ R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+ uv = np.dot(R1, self.orienter.unit_vectors)
+ uv = np.dot(R2, uv)
+ vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+ vectors = np.dot(vectors, uv)
+ vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+ dummy = np.ones(3, dtype='float64')
+ image.shape = (self.resolution[0]*self.resolution[1],1,4)
+ vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+ positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+ args = (positions, vectors, self.back_center,
+ (0.0,1.0,0.0,1.0),
+ image, dummy, dummy,
+ np.zeros(3, dtype='float64'),
+ self.transfer_function, self.sub_samples)
+ return args
+
+ def _render(self, double_check, num_threads, image, sampler):
+ ncells = sum(b.source_mask.size for b in self.volume.bricks)
+ pbar = get_pbar("Ray casting", ncells)
+ total_cells = 0
+ if double_check:
+ for brick in self.volume.bricks:
+ for data in brick.my_data:
+ if np.any(np.isnan(data)):
+ raise RuntimeError
+
+ for brick in self.volume.traverse(self.front_center):
+ sampler(brick, num_threads=num_threads)
+ total_cells += brick.source_mask.size
+ pbar.update(total_cells)
+
+ pbar.finish()
+ image = self.finalize_image(sampler.aimage)
+ return image
+
+ def finalize_image(self, image):
+ view_pos = self.front_center
+ image.shape = self.resolution[0], self.resolution[1], 4
+ image = self.volume.reduce_tree_images(image, view_pos)
+ if self.transfer_function.grey_opacity is False:
+ image[:,:,3]=1.0
+ image = image[1:-1,1:-1,:]
+ return image
+
+data_object_registry["spherical_camera"] = SphericalCamera
+
+class StereoSphericalCamera(Camera):
+ def __init__(self, *args, **kwargs):
+ self.disparity = kwargs.pop('disparity', 0.)
+ Camera.__init__(self, *args, **kwargs)
+ self.disparity = self.ds.arr(self.disparity, input_units="code_length")
+ self.disparity_s = self.ds.arr(0., input_units="code_length")
+ if(self.resolution[0]/self.resolution[1] != 2):
+ mylog.info('Warning: It\'s recommended to set the aspect ratio to be 2:1')
+ self.resolution = np.asarray(self.resolution) + 2
+ if(self.disparity<=0.):
+ self.disparity = self.width[0]/1000.
+ mylog.info('Warning: Invalid value of disparity; ' \
+ 'now reset it to %f' % self.disparity)
+
+ def get_sampler_args(self, image):
+ px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+ py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
+
+ vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+ dtype='float64', order='C')
+ vectors[:,:,0] = np.cos(px) * np.cos(py)
+ vectors[:,:,1] = np.sin(px) * np.cos(py)
+ vectors[:,:,2] = np.sin(py)
+ vectors2 = np.zeros((self.resolution[0], self.resolution[1], 3),
+ dtype='float64', order='C')
+ vectors2[:,:,0] = -np.sin(px) * np.ones((1, self.resolution[1]))
+ vectors2[:,:,1] = np.cos(px) * np.ones((1, self.resolution[1]))
+ vectors2[:,:,2] = 0
+
+ positions = self.center + vectors2 * self.disparity_s
+ vectors = vectors * self.width[0]
+ R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+ R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+ uv = np.dot(R1, self.orienter.unit_vectors)
+ uv = np.dot(R2, uv)
+ vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+ vectors = np.dot(vectors, uv)
+ vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+ dummy = np.ones(3, dtype='float64')
+ image.shape = (self.resolution[0]*self.resolution[1],1,4)
+ vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+ positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+ args = (positions, vectors, self.back_center,
+ (0.0,1.0,0.0,1.0),
+ image, dummy, dummy,
+ np.zeros(3, dtype='float64'),
+ self.transfer_function, self.sub_samples)
+ return args
+
+ def snapshot(self, fn = None, clip_ratio = None, double_check = False,
+ num_threads = 0, transparent=False):
+
+ if num_threads is None:
+ num_threads=get_num_threads()
+
+ self.disparity_s = self.disparity
+ image1 = self.new_image()
+ args1 = self.get_sampler_args(image1)
+ sampler1 = self.get_sampler(args1)
+ self.initialize_source()
+ image1 = self._render(double_check, num_threads,
+ image1, sampler1, '(Left) ')
+
+ self.disparity_s = -self.disparity
+ image2 = self.new_image()
+ args2 = self.get_sampler_args(image2)
+ sampler2 = self.get_sampler(args2)
+ self.initialize_source()
+ image2 = self._render(double_check, num_threads,
+ image2, sampler2, '(Right)')
+
+ image = np.hstack([image1, image2])
+ image = self.volume.reduce_tree_images(image, self.center)
+ image = ImageArray(image, info = self.get_information())
+ self.save_image(image, fn=fn, clip_ratio=clip_ratio,
+ transparent=transparent)
+ return image
+
+ def _render(self, double_check, num_threads, image, sampler, msg):
+ ncells = sum(b.source_mask.size for b in self.volume.bricks)
+ pbar = get_pbar("Ray casting "+msg, ncells)
+ total_cells = 0
+ if double_check:
+ for brick in self.volume.bricks:
+ for data in brick.my_data:
+ if np.any(np.isnan(data)):
+ raise RuntimeError
+
+ for brick in self.volume.traverse(self.front_center):
+ sampler(brick, num_threads=num_threads)
+ total_cells += brick.source_mask.size
+ pbar.update(total_cells)
+
+ pbar.finish()
+
+ image = sampler.aimage.copy()
+ image.shape = self.resolution[0], self.resolution[1], 4
+ if self.transfer_function.grey_opacity is False:
+ image[:,:,3]=1.0
+ image = image[1:-1,1:-1,:]
+ return image
+
+data_object_registry["stereospherical_camera"] = StereoSphericalCamera
+
def off_axis_projection(ds, center, normal_vector, width, resolution,
field, weight = None,
volume = None, no_ghost = False, interpolated = False,
Repository URL: https://bitbucket.org/yt_analysis/yt/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the yt-svn
mailing list