[yt-svn] commit/yt: 5 new changesets
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Thu Nov 20 18:00:20 PST 2014
5 new commits in yt:
https://bitbucket.org/yt_analysis/yt/commits/bc0786a53ad4/
Changeset: bc0786a53ad4
Branch: yt
User: jisuoqing
Date: 2014-11-09 10:53:04+00:00
Summary: Add Spherical Camera
Affected #: 2 files
diff -r 9153a5a32dce19164cc66f8073a26d460aa74cbe -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 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
from .transfer_function_helper import TransferFunctionHelper
diff -r 9153a5a32dce19164cc66f8073a26d460aa74cbe -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2342,6 +2342,74 @@
data_object_registry["projection_camera"] = ProjectionCamera
+class SphericalCamera(Camera):
+ #expand_factor = 1.0
+ def __init__(self, *args, **kwargs):
+ # self.expand_factor = kwargs.pop('expand_factor', 1.0)
+ Camera.__init__(self, *args, **kwargs)
+
+ 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):
+ pbar = get_pbar("Ray casting", (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+ 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 += np.prod(brick.my_data[0].shape)
+ 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
+
def off_axis_projection(ds, center, normal_vector, width, resolution,
field, weight = None,
volume = None, no_ghost = False, interpolated = False,
https://bitbucket.org/yt_analysis/yt/commits/ce2427e6817b/
Changeset: ce2427e6817b
Branch: yt
User: jisuoqing
Date: 2014-11-09 23:24:34+00:00
Summary: Add StereoSphericalCamera
Affected #: 2 files
diff -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -23,6 +23,6 @@
from .camera import Camera, PerspectiveCamera, StereoPairCamera, \
off_axis_projection, FisheyeCamera, MosaicFisheyeCamera, \
HEALpixCamera, InteractiveCamera, ProjectionCamera, \
- SphericalCamera
+ SphericalCamera, StereoSphericalCamera
from .transfer_function_helper import TransferFunctionHelper
diff -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2343,15 +2343,15 @@
data_object_registry["projection_camera"] = ProjectionCamera
class SphericalCamera(Camera):
- #expand_factor = 1.0
def __init__(self, *args, **kwargs):
- # self.expand_factor = kwargs.pop('expand_factor', 1.0)
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')
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,:]
+ px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=False)[:,None]
+ py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
vectors[:,:,0] = np.cos(px) * np.cos(py)
@@ -2382,7 +2382,8 @@
return args
def _render(self, double_check, num_threads, image, sampler):
- pbar = get_pbar("Ray casting", (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+ 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:
@@ -2392,7 +2393,7 @@
for brick in self.volume.traverse(self.front_center):
sampler(brick, num_threads=num_threads)
- total_cells += np.prod(brick.my_data[0].shape)
+ total_cells += brick.source_mask.size
pbar.update(total_cells)
pbar.finish()
@@ -2405,11 +2406,113 @@
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')
+ 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=False)[:,None]
+ py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[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
+ 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,
https://bitbucket.org/yt_analysis/yt/commits/1e45020f5e8c/
Changeset: 1e45020f5e8c
Branch: yt
User: jisuoqing
Date: 2014-11-10 03:43:24+00:00
Summary: Last bug fix
Affected #: 1 file
diff -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 -r 1e45020f5e8c9f02250e2dbcea59e6a9de71d9c5 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2347,11 +2347,12 @@
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=False)[:,None]
- py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
+ 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)
@@ -2406,6 +2407,7 @@
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
@@ -2418,14 +2420,15 @@
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=False)[:,None]
- py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
+ 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)
@@ -2471,7 +2474,7 @@
sampler1 = self.get_sampler(args1)
self.initialize_source()
image1 = self._render(double_check, num_threads,
- image1, sampler1, '(Left)')
+ image1, sampler1, '(Left) ')
self.disparity_s = -self.disparity
image2 = self.new_image()
@@ -2509,6 +2512,7 @@
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
https://bitbucket.org/yt_analysis/yt/commits/dd2edccd0fb2/
Changeset: dd2edccd0fb2
Branch: yt
User: jisuoqing
Date: 2014-11-10 04:21:31+00:00
Summary: Minor format fix
Affected #: 1 file
diff -r 1e45020f5e8c9f02250e2dbcea59e6a9de71d9c5 -r dd2edccd0fb218b4d6bba19e23e4f29a0d18ade9 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2347,26 +2347,24 @@
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
+ 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 = 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))
@@ -2416,37 +2414,37 @@
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 = 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
+ 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)
+ 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 = 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 = 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))
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