[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